Erste closure-compiler und Node.js zu spielen schön
Gibt es irgendwelche Projekte verwendet node.js und closure-compiler (CC), kurz zusammen?
Den offiziellen CC-Empfehlung ist es, alle kompilieren von code für eine Anwendung zusammen, aber wenn ich kompilieren einige einfache node.js code enthält eine require("./MyLib.js")
ist, dass Sie direkt in die Ausgabe, aber es macht keinen Sinn in diesem Kontext.
Ich sehe ein paar Möglichkeiten:
- - Code der gesamten Anwendung in einer einzelnen Datei. Dies löst das problem, indem Sie es vermeidet, aber schlecht für die Wartung.
- Davon ausgehen, dass alle Dateien verkettet werden vor der Ausführung. Wieder dies vermeidet das problem, aber macht es schwieriger zu implementieren, die eine UNO-kompilierten debug-Modus.
- Ich mag würde, um CC zu "verstehen" node.js require () - Funktion, aber wahrscheinlich nicht getan werden kann ohne Bearbeitung der compiler selbst kann es?
require
bedeutet, dass Sie mit RequireJS oder einer anderen form der AMD loader. Einige AMD-Systeme enthalten ein Werkzeug für Sie, zu "glätten" alle Abhängigkeiten und erstellt eine einzelne Datei mit allen notwendigen code. Das ist, was Sie tun müssen, um zu verwenden Schließung -- haben eine Datei mit allen code.Ich denke er versucht zu laufen-Verschluss auf node.js code nicht auf browser-side-code.
Ich weiß, dass Michael Bolin, hat getan einige Arbeit, um die Schließung der Bibliothek arbeiten mit Node.js. Ich weiß nicht, ob dieser verlängert mit dem Compiler.
Advanced Micro Devices?
Link bitte? Wenn ich Suche "michael bolin node.js" diese Diskussion ist das zweite Ergebnis.
InformationsquelleAutor bukzor | 2011-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich mit dem Closure Compiler mit Knoten für ein Projekt, das ich noch nicht freigegeben, noch. Es hat ein bisschen von Werkzeugen, aber es hat dazu beigetragen, fangen viele Fehler und hat eine Recht kurze Bearbeiten-neu starten-testen-Zyklus.
Erste, die ich verwenden plovr (was ist ein Projekt, das ich erstellt und halten), um den Closure Compiler, - Bibliothek und-Templates zusammen. Ich Schreibe meine Knoten code im Stil der Schließung der Bibliothek, so dass jede Datei definiert eine eigene Klasse oder eine Sammlung von Dienstprogrammen (wie
goog.array
).Der nächste Schritt ist die Erstellung einer Reihe von externs-Dateien für die Node-Funktionen, die Sie verwenden möchten. Ich veröffentlichte einige dieser öffentlich an:
https://github.com/bolinfest/node-google-closure-latitude-experiment/tree/master/externs/node/v0.4.8
Aber letztlich, ich denke, dass dies ein mehr von der Gemeinschaft angetriebene Sache, denn es gibt eine Menge von Funktionen zu dokumentieren. (Es ist auch ärgerlich, weil einige Knoten Funktionen haben optionale mittleren Argumente eher als Letzte Argumente, so dass die Typ-Annotationen kompliziert.) Ich habe noch nicht angefangen diese Bewegung mich, denn es ist möglich, dass wir etwas tun könne mit der Schließung Complier, um diese weniger umständlich (siehe unten).
Sagen, Sie haben die externs-Datei für den Node-namespace
http
. In meinem system habe ich beschlossen, dass ich immer wenn ich brauchehttp
ich wird es über:Obwohl ich nicht zählen, die
require()
Anruf in meinem code. Stattdessen verwende ich dieoutput-wrapper
Funktion der Closure Compiler das voranstellen allerequire()
s am Anfang der Datei, die, wenn Sie erklärt, in plovr, in meinem aktuellen Projekt sieht das so aus:In dieser Weise, meine Bibliothek code ruft nie Knotens
require()
, aber der Compiler toleriert, die verwendet Dinge wiehttp
in meinem code, da der Compiler erkennt Sie als externs. Wie, Sie sind nicht wahr externs, müssen Sie vorangestellt werden, wie ich beschrieben.Schließlich, nach einem Gespräch über diese auf der Diskussionsliste, ich denke die bessere Lösung ist, um eine neue Art Anmerkung für namespaces, würde folgendermaßen Aussehen:
In diesem Szenario ein externs Datei definieren
NodeHttpNamespace
so, dass der Closure Compiler in der Lage sein würde, typecheck Eigenschaften auf, die es mit den externs-Datei. Der Unterschied hier ist, dass man dem Namen den Rückgabewertrequire()
was auch immer Sie wollte, weil der Typ vonhttp
wäre diese spezielle namespace-Typ. (Die Bestimmung eines "jQuery-namespace" für$
ist ein ähnliches Problem.) Dieser Ansatz würde die Notwendigkeit beseitigen, den Namen Ihrer lokalen Variablen für Knoten namespaces konsequent, und würde die Notwendigkeit beseitigen, für das riesigeoutput-wrapper
im plovr config.Aber das war ein Exkurs...wenn ich Dinge wie oben beschrieben, habe ich ein shell-Skript, dass:
RAW
- Modus.node
auf die Datei, die generiert plovr.Mit
RAW
- Modus führt zu einer großen Verkettung aller Dateien (obwohl es kümmert sich auch um die übersetzung von Soja-Vorlagen und sogar CoffeeScript zu JavaScript). Zugegeben, das macht das Debuggen von Schmerzen, weil die Zeilennummern sind Unsinn, hat aber funktioniert gut genug für mich so weit. Werden alle Prüfungen durchgeführt, indem der Closure Compiler gemacht haben, es lohnt sich.Aktualisiert meine Antwort einen link auf die Diskussion bei groups.google.com/forum/#!searchin/closure-compiler-diskutieren/...
Ist das einfacher in der Zukunft? Es scheint wie eine Menge von Reifen.
vielleicht, wenn Google Closure Compiler (GCC) unterstützt node.js speziell ist. Das problem ist in der node.js core-Module, die verwirrend auf den GCC. Die anderen
require()
's unterstützt durch--common_js_modules
und--transform_amd_modules
. Aber ich bezweifle, dass es unterstützt wird in absehbarer Zeit, da der performance-Gewinn ist wahrscheinlich minimal. V8 führt eine Menge von der gleichen Optimierungen, die der GCC hat, wie dead code removal und inlining. Vielleicht ist der Speicherbedarf wird ein bisschen kleiner, aber das wird Sie nicht machen einen erheblichen Unterschied.Ich schaffte es, node.js code kompilieren arbeiten mit Google-Verschluss REST-API. Ich habe das inlining von non-core -
require()
's mich vor dem kompilieren, senden die API einen großen abgeflachten Datei mit Node.js core-Module entfernt und externed. Dann nach dem kompilieren, ich readd die Node.js Kern erfordert. --- Siehe github.com/blaise-io/xssnake/blob/master/build/server.js und github.com/blaise-io/xssnake/blob/master/build/lib/...InformationsquelleAutor bolinfest
Die svn-HEAD von closure compiler zu haben scheint Unterstützung für AMD
InformationsquelleAutor Jauco
Ersetzte ich meinen alten Ansatz mit einem Weg, einfacher Ansatz:
Neuen Ansatz
Lustige an der Sache ist, dass ich gar nicht hatte, um eine extern-für die
require()
Anrufe. Der Google Closure compiler versteht, dass automagisch. Ich habe, um das hinzufügen externs für nodejs-Module, die ich benutze.Alten Konzept
Auf Wunsch OP, ich werde erarbeitet, auf meine Art und Weise zu kompilieren node.js code mit Google Closure Compiler.
War ich inspiriert durch die Art und Weise bolinfest das problem und meine Lösung nutzt das gleiche Prinzip. Der Unterschied ist, dass ich ein node.js script, der alles macht, einschließlich inlining-Module (bolinfest Lösung ermöglicht GCC kümmern). Dies macht es mehr automatisiert, aber auch anfälliger.
Ich nur code Hinzugefügt, Kommentare zu jedem Schritt, den ich nehmen zu kompilieren server-code. Sehen Sie diese Begehen: https://github.com/blaise-io/xssnake/commit/da52219567b3941f13b8d94e36f743b0cbef44a3
Zusammenfassen:
In meinem Fall, diese Datei ist start.js.
require()
Anrufe, einschließlich der Zuweisung Teil.In start.js dies entspricht einer aufrufen:
var Server = require('./lib/server.js');
require()
nennen, so dass ich wiederholen Sie Schritt 3 und 4 rekursiv, bis allerequire()
Anrufe sind Weg und ich bin Links mit einem großen string mit allen code.Sie können auch die offline-compiler.
Ich habe externs für jeden core node.js -Modul. Dieses tool ist nützlich für die Erzeugung von externs.
require
ruft der kompilierte code.Pre-Kompilierten code.
Alle
require
Anrufe werden entfernt. Alle mein code ist abgeflacht.http://pastebin.com/eC2rVMiN
Post-Kompilierten code.
Node.js Kern
require
Aufrufe wurden vorangestellt manuell.http://pastebin.com/uB8CaejN
Warum sollten Sie es nicht tun es auf diese Weise:
require
Anrufe, inlining und entfernenmodule.exports
. Dies ist fragil, wie es deckt nicht alle syntax-Varianten.Warum sollten Sie:
Ich konnte keine Dokumentation auf v8 Weise einen parser. Es ist jedoch möglich, mit Hilfe einer JS-parser, geschrieben in JS, wie Esprima. Ausgänge für eine triviale Modul. Mit dem code "zerhackt" schön, Sie konnte tun, was ich tun, mit regulären Ausdrücken in eine solide Art und Weise. Aber es wäre eine Menge Arbeit, um die änderungen vorzunehmen, und dann setzen Sie den code wieder zusammen. Diese Ausgabe für meine real-Module wohl zeigt, dass.
Wie es scheint, esprima ist eine Implementierung der api habe ich verlinkt, die nicht wirklich Rücksicht auf die Reversibilität. In einem Projekt von meiner eigenen, die ich getan habe der zweite Durchgang auf der smjs ast, um es reversibel. Vielleicht ist es hilfreich? Wahrscheinlich nicht =/
Ich habe nicht bemerkt, das Letzte mal: Esprima schreibt die Quelle mit eine externe Bibliothek namens Escodegen. Escodegen ist offenbar kompatibel mit Esprima, wie Sie sehen können in der code Ihrer minifizieren Beispiel. --- Für mich, eine Python-Lösung ist nicht kompatibel mit meinem Gehirn, wie ich bin OCD über das tun alles, was in JS. Allerdings könnte ich ändern, meinen hacky-Bibliothek zu verwenden, sowohl Esprima und Escodegen zu einem festen Modul kompiliert werden alle node.js Projekte mit Closure Compiler, nicht nur mir.
Das scheint die richtige route. Ich kann mir nicht versprochen, ich würde "benutzen", aber gefällt mir sehr gut die Idee.
InformationsquelleAutor Blaise
Schließung der Bibliothek auf Node.js in 60 Sekunden.
Unterstützt, überprüfen Sie https://code.google.com/p/closure-library/wiki/NodeJS.
Dies scheint vor allem darin, die Schließung der Bibliothek für die Arbeit mit node.js nichts zu tun mit dem compiler
InformationsquelleAutor Daniel Steigerwald
Option 4: keine closure compiler.
Menschen, die im Knoten Community (Gemeinschaft) nicht dazu neigen, es zu benutzen. Sie brauchen nicht zu minifizieren node.js source code, das ist blöd.
Gibt es einfach keine gute Nutzung für die Verkleinerung.
Als für die performance-Vorteile der Schließung, ich persönlich bezweifle es tatsächlich macht Sie Ihre Programme schneller.
Und natürlich gibt es eine Kosten -, debugging kompiliert JavaScript ist ein Alptraum
Ich bitte zu widersprechen. Verschluss ist nicht nur für die Verkleinerung. Es gibt durchaus performance-Vorteile. Der OP fragt, wie es getan werden kann, nicht ob er es tun sollte, es in den ersten Platz. Niemand in der node-community verwendet, es bedeutet nicht, dass es nicht verwendet werden sollte.
Die Geschwindigkeits-Vorteile sind geringfügig und unerheblich ist. Wenn es um performance geht rewrite in C++ statt mit den code durch CC.
Ich möchte auch darauf hinweisen, dass "option 4" ist nicht eine Lösung für das problem. "Nein" kann keine Antwort auf die Frage "Wie?"
das bedeutet eigentlich klingen ziemlich nützlich
InformationsquelleAutor Raynos