- Run the embedder entry point directly through runEmbedderEntryPoint(), instead of going through another JS -> C++ trip through the function returned by getEmbedderEntryFunction() - For --build-snapshot, read the snapshot script code directly in C++ and pass it to SnapshotBuilder::Generate(), this makes the entry point more explicit instead of hiding it in JS land, and also makes it possible to invoke SnapshotBuilder::Generate() internally to create a custom snapshot. - Previously we used process.execPath for the embedder to create __filename and __dirname in the snapshot builder script while using process.argv[1] for --build-snapshot (where it's always set) which results in inconsistencies. We now require the embedder to also set args[1] when creating the Environment if they intend to run snapshot scripts with a context that contains __filename and __dirname, which would be derived from args[1]. If they prefer not to include build-time paths in the snapshot, we now provide node::GetAnonymousMainPath() as an alternative. PR-URL: https://github.com/nodejs/node/pull/48242 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
Node.js startup snapshot builder
This is the V8 startup snapshot builder of Node.js. Not to be confused with V8's own snapshot builder, which builds a snapshot containing JavaScript builtins, this builds a snapshot containing Node.js builtins that can be deserialized on top of V8's own startup snapshot. When Node.js is launched, instead of executing code to bootstrap, it can deserialize the context from an embedded snapshot, which readily contains the result of the bootstrap, so that Node.js can start up faster.
Currently only the main context of the main Node.js instance supports snapshot deserialization, and the snapshot does not yet cover the entire bootstrap process. Work is being done to expand the support.
How it's built and used
The snapshot builder is built with the node_mksnapshot target in node.gyp
when node_use_node_snapshot is set to true, which is currently done by
default.
In the default build of the Node.js executable, to embed a V8 startup snapshot
into the Node.js executable, libnode is first built with these unresolved
symbols:
node::NodeMainInstance::GetEmbeddedSnapshotData
Then the node_mksnapshot executable is built with C++ files in this
directory, as well as src/node_snapshot_stub.cc which defines the unresolved
symbols.
node_mksnapshot is run to generate a C++ file
<(SHARED_INTERMEDIATE_DIR)/node_snapshot.cc that is similar to
src/node_snapshot_stub.cc in structure, but contains the snapshot data
written as static char array literals. Then libnode is built with
node_snapshot.cc to produce the final Node.js executable with the snapshot
data embedded.
For debugging, Node.js can be built without Node.js's own snapshot if
--without-node-snapshot is passed to configure. A Node.js executable
with Node.js snapshot embedded can also be launched without deserializing
from it if the command line argument --no-node-snapshot is passed.