diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index b02184984c9..df40eb9f67f 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -1,39 +1,55 @@ // Hello, and welcome to hacking node.js! // -// This file is invoked by `node::RunBootstrapping()` in `src/node.cc`, and is -// responsible for setting up node.js core before executing main scripts -// under `lib/internal/main/`. +// This file is invoked by `Realm::BootstrapNode()` in `src/node_realm.cc`, +// and is responsible for setting up Node.js core before main scripts +// under `lib/internal/main/` are executed. // -// This file is expected not to perform any asynchronous operations itself +// By default, Node.js binaries come with an embedded V8 startup snapshot +// that is generated at build-time with a `node_mksnapshot` executable. +// The snapshot generation code can be found in `SnapshotBuilder::Generate()` +// from `src/node_snapshotable.cc`. +// This snapshot captures the V8 heap initialized by scripts under +// `lib/internal/bootstrap/`, including this file. When initializing the main +// thread, Node.js deserializes the heap from the snapshot, instead of actually +// running this script and others in `lib/internal/bootstrap/`. To disable this +// behavior, pass `--no-node-snapshot` when starting the process so that +// Node.js actually runs this script to initialize the heap. +// +// This script is expected not to perform any asynchronous operations itself // when being executed - those should be done in either -// `lib/internal/bootstrap/pre_execution.js` or in main scripts. The majority -// of the code here focuses on setting up the global proxy and the process -// object in a synchronous manner. -// As special caution is given to the performance of the startup process, -// many dependencies are invoked lazily. +// `lib/internal/process/pre_execution.js` or in main scripts. It should not +// query any run-time states (e.g. command line arguments, environment +// variables) when being executed - functions in this script that are invoked +// at a later time can, however, query those states lazily. +// The majority of the code here focuses on setting up the global object and +// the process object in a synchronous, environment-independent manner. // // Scripts run before this file: -// - `lib/internal/per_context/primordials.js`: to save copies of JavaScript +// - `lib/internal/per_context/primordials.js`: this saves copies of JavaScript // builtins that won't be affected by user land monkey-patching for internal // modules to use. -// - `lib/internal/bootstrap/loaders.js`: to setup internal binding and +// - `lib/internal/per_context/domexception.js`: implementation of the +// `DOMException` class. +// - `lib/internal/per_context/messageport.js`: JS-side components of the +// `MessagePort` implementation. +// - `lib/internal/bootstrap/loaders.js`: this sets up internal binding and // module loaders, including `process.binding()`, `process._linkedBinding()`, // `internalBinding()` and `NativeModule`. // -// This file is run to bootstrap both the main thread and the worker threads. -// After this file is run, certain properties are setup according to the -// configuration of the Node.js instance using the files in +// The initialization done in this script is included in both the main thread +// and the worker threads. After this, further initialization is done based +// on the configuration of the Node.js instance by executing the scripts in // `lib/internal/bootstrap/switches/`. // // Then, depending on how the Node.js instance is launched, one of the main // scripts in `lib/internal/main` will be selected by C++ to start the actual // execution. They may run additional setups exported by -// `lib/internal/bootstrap/pre_execution.js` depending on the runtime states. +// `lib/internal/process/pre_execution.js` depending on the run-time states. 'use strict'; // This file is compiled as if it's wrapped in a function with arguments -// passed by node::RunBootstrapping() +// passed by `BuiltinLoader::CompileAndCall()`. /* global process, require, internalBinding, primordials */ setupPrepareStackTrace();