10

我有一个 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 源目录。然后我可以构建节点并告诉它不要重建快照。

4

1 回答 1

7

我刚刚为 mksnapshot 命令添加了一个选项(在您构建 V8 时运行)。新的 --extra-file=filename.js 标志允许您指定要在进程中加载​​和运行的文件,然后放入快照中。它位于 V8 的主干版本上,而不是用于节点 0.8 的 3.11 分支,因此您必须使用 V8 版本 3.11 运行节点 0.8。据我目前所知,这是可行的,但你会有点靠自己。

如果您尝试此操作并且它对您不起作用,请提交错误。

于 2012-06-20T20:49:28.550 回答