У меня есть приложение 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;
, возникает ошибка, даже если код действителен в узле 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. Затем я могу построить узел и сказать ему не перестраивать моментальный снимок.