Node.js / v8:如何制作自己的快照以加速启动

时间:2012-06-19 21:14:28

标签: javascript node.js v8 snapshot

我有一个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。

通过更改SconScript可以对启动快照进行一些自定义。例如,我可以通过更改date.js来更改内置Date.toString的定义。我甚至可以通过将startup.js添加到库文件列表中添加新的全局变量,内容为global.test = 1

但是,我不能在startup.js中添加任何javascript代码。如果它包含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源目录。然后我可以构建节点并告诉它不要重建快照。

1 个答案:

答案 0 :(得分:7)

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

如果您尝试这样做,请提交错误,但它不适合您。