Googles
Closure Compiler
Martin Läuter
3. Juli 2014
Martin Läuter
3. Juli 2014
JavaScript lässt zu viele Paradigmen zu, um für alle Programme beweisbar die Semantik gleich zu lassen.
Deshalb gibt es drei Modi, die unterschiedlich weit optimieren und entsprechend mehr oder weniger Kooperation des Entwicklers erfordern.
Man schreibt aber immer gültiges JavaScript, d. h. der Code läuft auch uncompiliert.
– entfernt nur Kommentare, überflüssige Kommas, Semikola, Leerzeichen, Zeilenenden.
– zus. kürzere lokale Bezeichner (Basisminifizierung).
eval()
,– zus. globales Renaming, Dead Code Elimination, Inlining.
function unusedFunction(note) { alert(note['text']); } function displayNoteTitle(note) { alert(note['title']); } var flowerNote = {}; flowerNote['title'] = "Flowers"; displayNoteTitle(flowerNote);
SIMPLE_OPTIMIZATION
function unusedFunction(a){alert(a.text)}function d
isplayNoteTitle(a){alert(a.title)}var flowerNote={t
itle:"Flowers"};displayNoteTitle(flowerNote);
ADVANCED_OPTIMIZATION
alert("Flowers");
window['displayNoteTitle'] = displayNoteTitle;
eval()
nur, wenn Du weißt, was Du tust!memb['name']='Mrs. '+memb.name;
memb.id=++lastId;
function textDiv(text){};
in einem Extern-File.opensocial.newDataRequest()
nach Umbenennung a.a()
.
/** * My namespace's favorite kind of beer. * @const * @type {string} */ mynamespace.MY_BEER = 'stout'; /** * A rectangle. * @constructor */ function GM_Rect() { ... } /** * Enum for tri-state values. * @enum {number} */ project.TriState = { TRUE: 1, FALSE: -1, MAYBE: 0 };
/** @typedef {(string|number)} */
goog.NumberLike;
/**
* The message hex ID.
* @type {string}
*/
var hexId = hexId;
@type {(number|boolean)}
@type {Array.<string>}
@type {?number}
@type {!Object}
@type {{myNum: number, myObject}}
@type {function(this:goog.ui.Menu, string)}
@param {number=} opt_argument
goog.provide('myNS.A');
goog.provide('myNS.B');
/** @constructor */ myNS.A = function() {
goog.base.call(this);
this.nr=5;
};
/** @constructor
* @extends {myNS.A} */ myNS.B = function() {
myNS.A.call(this);
};
goog.inherits(myNS.B, myNS.A);
myNS.B.prototype.bumpNr = function() {
++this.nr;
}
/** @type {myNS.B} */ var instB = new myNS.B();
alert(''+instB.nr); instB.bumpNr(); alert(''+instB.nr);
In der CL heißen die Methoden goog.dom.create()
. Namespaces können requiret goog.require('myNS');
und providet goog.provide('myNS');
werden.
var foo = {};
foo.bar = function (a) { this.bad = a; }; // BAD
foo.bar("hello");
var foo$bar = function (a) { this.bad = a; };
foo$bar("hello");
Der Closure Compiler ist also ein JS-JS-Transpiler.
Link zur Präsentation www.laeuter.de/martin/jstalk/jstalk.html