@@ -8,9 +8,46 @@ instead of executing code to bootstrap, it can deserialize the context from
8
8
an embedded snapshot, which readily contains the result of the bootstrap, so
9
9
that Node.js can start up faster.
10
10
11
- Currently only the main context of the main Node.js instance supports snapshot
12
- deserialization, and the snapshot does not yet cover the entire bootstrap
13
- process. Work is being done to expand the support.
11
+ The built-in snapshot consists of the following snapshots:
12
+
13
+ ## Isolate snapshot
14
+
15
+ Which is used whenever a ` v8::Isolate ` is created using the data returned by
16
+ ` node::SnapshotBuilder::GetEmbeddedSnapshotData ` .
17
+
18
+ ## Context snapshots
19
+
20
+ Which are used when a ` v8::Context ` is created from a ` v8::Isolate ` deserialized
21
+ from the snapshot. There are four context snapshots in the snapshot blob.
22
+
23
+ 1 . The default context snapshot, used for contexts created by
24
+ ` v8::Context::New() ` , it only contains V8 built-ins, matching the
25
+ layout of the isolate snapshot.
26
+ 1 . The vm context snapshot, which can be deserialized using
27
+ ` v8::Context::FromSnapshot(isolate, node::SnapshotData::kNodeVMContextIndex, ...) ` .
28
+ It captures initializations specific to vm contexts done by
29
+ ` node::contextify::ContextifyContext::CreateV8Context() ` .
30
+ 1 . The base context snapshot, which can be deserialized using
31
+ ` v8::Context::FromSnapshot(isolate, node::SnapshotData::kNodeBaseContextIndex, ...) ` .
32
+ It currently captures initializations done by ` node::NewContext() `
33
+ but is intended to include more as a basis for worker thread
34
+ contexts.
35
+ 1 . The main context snapshot, which can be deserialized using
36
+ ` v8::Context::FromSnapshot(isolate, node::SnapshotData::kNodeMainContextIndex, ...) ` .
37
+ This is the snapshot for the main context on the main thread, and
38
+ captures initializations done by ` node::CommonEnvironmentSetup::CreateForSnapshotting() ` ,
39
+ most notably ` node::CreateEnvironment() ` , which runs the following scripts via
40
+ ` node::Realm::RunBootstrapping() ` for the main context as a principal realm,
41
+ so that at runtime, these scripts do not need to be run. Instead only the context
42
+ initialized by them is deserialized at runtime.
43
+ 1. ` internal/bootstrap/realm `
44
+ 2. ` internal/bootstrap/node `
45
+ 3. ` internal/bootstrap/web/exposed-wildcard `
46
+ 4. ` internal/bootstrap/web/exposed-window-or-worker `
47
+ 5. ` internal/bootstrap/switches/is_main_thread `
48
+ 6. ` internal/bootstrap/switches/does_own_process_state `
49
+
50
+ For more information about these contexts, see the comment in ` src/node_context_data.h ` .
14
51
15
52
## How it's built and used
16
53
@@ -39,3 +76,22 @@ For debugging, Node.js can be built without Node.js's own snapshot if
39
76
` --without-node-snapshot ` is passed to ` configure ` . A Node.js executable
40
77
with Node.js snapshot embedded can also be launched without deserializing
41
78
from it if the command line argument ` --no-node-snapshot ` is passed.
79
+
80
+ ### When ` node_mksnapshot ` crashes..
81
+
82
+ Due to this two-phase building process, sometimes when there is an issue
83
+ in the code, the build may crash early at executing ` node_mksnapshot ` instead of crashing
84
+ at executing the final executable ` node ` . If the crash can be reproduced when running
85
+ the ` node ` executable built with ` --without-node-snapshot ` , it means the crash likely
86
+ has nothing to do with snapshots, and only shows up in ` node_mksnapshot ` because it's
87
+ the first Node.js executable being run.
88
+
89
+ If the crash comes from a ` mksnapshot ` executable (notice that it doesn't have the ` node_ `
90
+ prefix), that comes from V8's own snapshot building process, not the one in Node.js, and the
91
+ fix likely needs to be in V8 or the build configurations of V8.
92
+
93
+ If it ` node_mksnapshot ` crashes with an error message containing
94
+ something like ` Unknown external reference 0x107769200 ` , see
95
+ [ Registering binding functions used in bootstrap] [ ] on how to fix it.
96
+
97
+ [ Registering binding functions used in bootstrap ] : ../../src/README.md#registering-binding-functions-used-in-bootstrap
0 commit comments