2012-06-19 2 views
10

Ho un'applicazione node.js (v0.6.12) che inizia con la valutazione di un file Javascript, startup.js. Ci vuole molto tempo per valutare startup.js, e mi piacerebbe "cuocerlo" su una build personalizzata di Nodo se possibile.Node.js/v8: Come creare la mia istantanea per accelerare l'avvio

La directory di origine v8 distribuita con Nodo, nodo/deps/v8/src, contiene uno SconScript che può essere utilizzato quasi per farlo. Sulla riga 302, abbiamo

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() 

Questi file javascript sono presenti nella stessa directory. Qualcosa nel processo di build li valuta apparentemente, prende uno snapshot di stato e lo salva come una stringa di byte in node/out/Release/obj/release/snapshot.cc (su Mac OS). Questo file sembra essere cotto nel nodo.

Alcune personalizzazioni dell'istantanea di avvio sono possibili modificando SconScript. Ad esempio, posso modificare la definizione di Date.toString incorporata modificando date.js. Posso perfino aggiungere nuove variabili globali aggiungendo startup.js all'elenco dei file della libreria, con i contenuti global.test = 1.

Tuttavia, non riesco a inserire alcun codice javascript in startup.js. Se contiene Date.toString = 1;, un errore si traduce anche se il codice è valido al repl nodo:

Build failed: -> task failed (err #2): 
    {task: libv8.a SConstruct -> libv8.a} 
make: *** [program] Error 1 

E, ovviamente, non può fare uso di codice che dipende da librerie nodo aggiunge al V8. global.underscore = require('underscore'); causa lo stesso errore.

sarei idealmente come uno strumento, customSnapshot, dove customSnapshot startup.js valuta lo startup.js con nodo e poi discariche uno snapshot in un file, snapshot.cc, che posso mettere nella directory dei sorgenti del nodo. Posso quindi creare il nodo e dirgli di non ricostruire lo snapshot.

+0

In realtà questo metodo ha funzionato bene per me e ho utilizzato node.js v0.8.11 che viene fornito con v8 v3.11.10. La differenza è che ho usato la nuova build basata su Gyp. [Qui] (https://github.com/tarruda/node/commit/2f58630e66e2de4cbadae09ac37da55721de7bd3) è possibile visualizzare le modifiche richieste. Come hai detto, non puoi invocare il codice che dipende dagli oggetti builtin o dalle funzioni nodejs (console, require ...). È possibile aggirare il problema utilizzando la funzione di inizializzazione ann: var global = this; global.initialize = function() { global.console.log ('Hello node'); }; –

risposta

7

Ho appena aggiunto un'opzione al comando mksnapshot (che viene eseguito mentre si sta costruendo V8). Il nuovo flag --extra-file = filename.js consente di specificare un file che deve essere caricato ed eseguito nel processo e quindi inserito nello snapshot. È nella versione trunk di V8, non nel ramo 3.11 utilizzato per il nodo 0.8, quindi sarà necessario eseguire il nodo 0.8 con V8 versione 3.11. Per quanto ne so al momento, funziona, ma tu sarai un po 'da solo.

Si prega di file bug se si prova questo e non funziona per voi.

+2

Grazie, user487683, la nuova opzione funziona per me. Per i posteri, le tue modifiche erano in questa revisione: http://code.google.com/p/v8/source/detail?r=11871. Per aggiungere ulteriore codice al processo di compilazione, ho cambiato la definizione di env.Snapshot sulla riga 343 di SconScript a 'env ['BUILDERS'] ['Snapshot'] = Builder (action = '$ SOURCE $ TARGET --logfile" $ LOGFILE "--log-snapshot-positions --extra-code" percorso/su/file.js "')'. Sembra che il file venga eseguito dopo i file della libreria elencati in SconScript, in modo che possa modificare gli oggetti presentati. Comunque viene eseguito prima di tutto in Node. –

Problemi correlati