У меня есть приложение node.js(v0.6.12), которое начинается с оценки файла Javascript, startup.js. Для оценки startup.js требуется много времени, и я хотел бы "испечь его" в пользовательскую сборку Node, если это возможно.
Исходный каталог v8, распространяемый с помощью Node, node/deps/v8/src, содержит SconScript, который может быть почти использован для этого. В строке 302 имеем
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()
Эти файлы javascript присутствуют в одном каталоге. Что-то в процессе сборки, по-видимому, оценивает их, принимает моментальный снимок состояния и сохраняет его как байтовую строку в node/out/Release/obj/release/snapshot.cc(в Mac OS). Этот файл, кажется, запечен в node.
Некоторая настройка моментального снимка запуска возможна, изменяя SconScript. Например, я могу изменить определение встроенной Date.toString, изменив date.js. Я могу даже добавить новые глобальные переменные, добавив startup.js в список файлов библиотеки, с содержимым global.test = 1
.
Однако я не могу поместить только код javascript в startup.js
. Если он содержит Date.toString = 1;
, возникает ошибка, даже если код верен в Node repl:
Build failed: -> task failed (err #2):
{task: libv8.a SConstruct -> libv8.a}
make: *** [program] Error 1
И он явно не может использовать код, который зависит от библиотек Node добавляет к v8. global.underscore = require('underscore');
вызывает ту же ошибку.
Мне идеально понравился инструмент customSnapshot, где customSnapshot startup.js
оценивает startup.js с помощью Node, а затем выгружает моментальный снимок в файл snapshot.cc, который я могу поместить в исходный каталог Node. Затем я смогу построить Node и скажу, чтобы он не восстанавливал моментальный снимок.