2012-06-19 3 views
10

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.

+0

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'); }; –

Antwort

7

Ich habe dem Befehl mksnapshot (der während der Erstellung von V8 ausgeführt wird) eine Option hinzugefügt. Mit dem neuen --extra-file = filename.js-Flag können Sie eine Datei angeben, die im Prozess geladen und ausgeführt werden soll, und dann in den Snapshot einfügen. Es ist auf der Stammversion von V8, nicht der 3.11-Zweig, der für Knoten 0.8 verwendet wird, so dass Sie Knoten 0.8 mit V8-Version 3.11 ausführen müssen. Soweit ich weiß im Moment funktioniert das, aber du wirst etwas alleine sein.

Bitte melden Sie Fehler, wenn Sie dies versuchen und es nicht für Sie funktioniert.

+2

Danke, user487683, die neue Option funktioniert für mich. Für die Nachwelt waren Ihre Änderungen in dieser Überarbeitung: http://code.google.com/p/v8/source/detail?r=11871. Um dem Build-Prozess zusätzlichen Code hinzuzufügen, änderte ich die Definition von env.Snapshot in der Zeile 343 von SconScript in 'env ['BUILDERS'] ['Snapshot'] = Builder (action = '$ SOURCE $ TARGET --logfile" $ LOGFILE "--log-snapshot-positions --extra-code" pfad/zu/file.js "')'. Es sieht so aus, als ob die Datei nach den im SconScript aufgelisteten Bibliotheksdateien ausgeführt wird, damit sie die von ihnen eingeführten Objekte modifizieren kann. Es wird jedoch vor allem in Node ausgeführt. –

Verwandte Themen