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