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

我有一个node.js(v0.6.12)应用程序,通过评估一个JavaScript文件startup.js开始。 评估startup.js需要很长时间,如果可能,我想“自定义构build”。

与节点node / deps / v8 / src一起分发的v8源代码目录包含一个几乎可用于执行此操作的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文件存在于同一个目录中。 构build过程中的东西显然会对它们进行评估,获取状态的快照,并将其作为字节string保存在node / out / Release / obj / release / snapshot.cc(在Mac OS上)。 这个文件似乎被烘焙到Node中。

启动快照的一些自定义可以通过更改SconScript来实现。 例如,我可以通过改变date.js改变内置的Date.toString的定义。 我甚至可以通过将startup.js添加到库文件列表来添加新的全局variables,内容为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 

而且它显然不能使用依赖于库添加到v8的库的代码。 global.underscore = require('underscore'); 导致相同的错误。

我最好喜欢一个工具customSnapshot,其中customSnapshot startup.js用Node评估startup.js,然后将一个快照转储到一个文件snapshot.cc中,我可以将它放到Node源文件夹中。 然后我可以build立节点,并告诉它不要重build快照。

我只是给mksnapshot命令添加了一个选项(在构buildV8时运行)。 新的–extra-file = filename.js标志可以让你指定一个文件,该文件将被加载并在进程中运行,然后放入快照中。 它是V8的中继版本,而不是用于节点0.8的3.11分支,所以你将不得不运行V8版本3.11的节点0.8。 据我所知目前的情况是有效的,但是你自己会有一些。

如果你尝试这个,请填写错误,但不适合你。