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

Ana*_*til 10 javascript v8 snapshot node.js

我有一个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()
Run Code Online (Sandbox Code Playgroud)

这些javascript文件存在于同一目录中.构建过程中的某些东西显然会对它们进行评估,获取状态快照,并将其保存为node/out/Release/obj/release/snapshot.cc中的字节字符串(在Mac OS上).这个文件似乎被融入Node.

通过更改SconScript可以对启动快照进行一些自定义.例如,我可以通过更改date.js来更改内置Date.toString的定义.我甚至可以通过将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
Run Code Online (Sandbox Code Playgroud)

它显然无法使用依赖于Node添加到v8的库的代码.global.underscore = require('underscore');导致同样的错误.

我理想地喜欢一个工具customSnapshot,它customSnapshot startup.js使用Node评估startup.js,然后将快照转储到一个文件snapshot.cc,我可以将它放入Node源目录.然后我可以构建节点并告诉它不要重建快照.

Eri*_*rry 7

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

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

  • 谢谢,user487683,新选项适合我.对于后代,您的更改包含在此修订版中:http://code.google.com/p/v8/source/detail?r = 11871.为了在构建过程中添加额外的代码,我将SconScript第343行的env.Snapshot的定义更改为`env ['BUILDERS'] ['Snapshot'] = Builder(action ='$ SOURCE $ TARGET --logfile" $ LOGFILE"--log-snapshot-positions --extra-code"path/to/file.js"')`.看起来文件在SconScript中列出的库文件之后执行,因此它可以修改它们引入的对象.但它会在Node之前执行. (2认同)