Ich habe eine node.js (v0.6.12) -Anwendung, die durch Auswertung einer Javascript-Datei startup.js beginnt. Es dauert eine lange Zeit, um startup.js zu bewerten, und ich würde es gerne in eine benutzerdefinierte Build von Node "backen", wenn möglich.Node.js/v8: Wie mache ich meinen eigenen Snapshot, um den Start zu beschleunigen
Das Quellverzeichnis v8, das mit Node, node/deps/v8/src, verteilt wird, enthält ein SconScript, das fast dazu verwendet werden kann. In Zeile 302 haben wir
LIBRARY_FILES = '''
runtime.js
v8natives.js
array.js
string.js
uri.js
math.js
messages.js
apinatives.js
date.js
regexp.js
json.js
liveedit-debugger.js
mirror-debugger.js
debug-debugger.js
'''.split()
Diese Javascript-Dateien sind in demselben Verzeichnis vorhanden. Etwas im Build-Prozess wertet sie augenscheinlich aus, erstellt einen Snapshot des Status und speichert sie als Byte-String in node/out/Release/obj/release/snapshot.cc (unter Mac OS). Diese Datei scheint in Node eingebunden zu sein.
Einige Anpassungen des Start-Snapshots sind durch Ändern des SconScript möglich. Zum Beispiel kann ich die Definition des eingebauten Date.toString ändern, indem ich date.js ändere. Ich kann sogar neue globale Variablen hinzufügen, indem ich startup.js mit dem Inhalt global.test = 1
der Liste der Bibliotheksdateien hinzufüge.
Allerdings kann ich einfach keinen JavaScript-Code in startup.js
setzen. Wenn es Date.toString = 1;
enthält, führt ein Fehler, auch wenn der Code an dem Knoten repl gültig ist:
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
make: *** [program] Error 1
Und es kann natürlich nicht die Verwendung von Code machen, dass der Knoten fügt auf Bibliotheken hängt v8. global.underscore = require('underscore');
verursacht den gleichen Fehler.
Ich würde im Idealfall ein Werkzeug, customSnapshot, wo customSnapshot startup.js
startup.js mit Node auswertet und dann einen Snapshot auf eine Datei, snapshot.cc, die ich in den Knoten Quellverzeichnis legen kann. Ich kann dann einen Knoten erstellen und ihm mitteilen, dass er den Snapshot nicht neu erstellen soll.
Eigentlich funktionierte diese Methode für mich gut und ich verwendete node.js v0.8.11, die mit v8 v3.11.10 kommt. Der Unterschied ist, dass ich den neuen Gyp-basierten Build verwendet habe. [Hier] (https://github.com/tarruda/node/commit/2f58630e66e2de4cbadae09ac37da55721de7bd3) können Sie die erforderlichen Änderungen sehen. Wie Sie gesagt haben, können Sie keinen Code aufrufen, der von den eingebauten Objekten oder den Nodejs-Funktionen (Konsole, require ...) abhängt. Sie können das umgehen, indem Sie Ann-Initialisierungsfunktion verwenden: var global = this; global.initialize = function() { global.console.log ('Hallo Knoten'); }; –