我有一个 node.js (v0.6.12) 应用程序,它首先评估一个 Javascript 文件 startup.js。评估 startup.js 需要很长时间,如果可能的话,我想将其“烘焙”到 Node 的自定义构建中。
与 Node 一起分发的 v8 源目录 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.js 中。
通过更改 SconScript 可以对启动快照进行一些自定义。例如,我可以通过更改 date.js 来更改内置 Date.toString 的定义。我什至可以通过将 startup.js 添加到库文件列表中来添加新的全局变量,其中包含global.test = 1
.
但是,我不能在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
使用 Node 评估 startup.js,然后将快照转储到文件 snapshot.cc,我可以将其放入 Node 源目录。然后我可以构建节点并告诉它不要重建快照。