Backend Development 9 min read

Understanding the Startup Process of Node.js

This article explains how Node.js initializes by combining Google’s V8 engine with the libuv asynchronous I/O library, details the main function flow, event loop, thread pools, environment creation, module binding, and demonstrates exposing a C++ object to JavaScript via a native addon.

Hujiang Technology
Hujiang Technology
Hujiang Technology
Understanding the Startup Process of Node.js

With the growing popularity of Node.js, many developers and companies migrate web sites to Node.js servers; this article explores the internal startup mechanism of Node.js, which primarily relies on Google’s V8 engine and the libuv asynchronous I/O library.

Node.js can be viewed as V8 with added networking capabilities. When the node.exe binary is launched, its main function (defined in node_main.cc ) initializes the V8 platform, creates a Node.js instance, and parses startup parameters.

The StartInstance routine then creates a V8 sandbox, builds the process object, and starts the event loop ( uv_default_loop ). The loop processes tasks from V8’s main thread queues and libuv’s thread pool; uv_run blocks until tasks are available, and the process exits when the queue is empty.

Although the main thread appears single‑threaded, the Node.js process actually runs several threads: V8’s internal thread pool (controlled by --v8-pool-size ) handles byte‑code compilation, optimization, and garbage collection, while libuv’s thread pool size is set via the UV_THREADPOOL_SIZE environment variable.

The runtime environment is represented by the Environment class, which constructs the global process object. binding mechanisms expose C/C++ modules to JavaScript; the binding lookup sequence involves checking the binding cache, loading built‑in modules, and registering custom modules with node_module_register .

Node.js loads its built‑in JavaScript libraries by executing bootstrap_node.js , which adds properties to the global object via internal/module . These libraries are compiled into C++ using js2c.py , producing node_natives.h .

To illustrate native integration, the article provides a complete example of exposing a C++ class MyObject to JavaScript as a Node.js addon. The header defines the class with methods Init , New , and PlusOne , while the implementation registers the addon with NODE_MODULE . The binding.gyp file specifies the source, and node-gyp build produces addon.node , which can be required in JavaScript to create and manipulate MyObject instances.

Running the sample script demonstrates the plusOne method incrementing the internal value, confirming that C++ objects can be seamlessly used from JavaScript within Node.js.

The article concludes by suggesting further exploration of how network requests are handled inside Node.js.

JavaScriptBackend DevelopmentNode.jsV8libuvC++ addon
Hujiang Technology
Written by

Hujiang Technology

We focus on the real-world challenges developers face, delivering authentic, practical content and a direct platform for technical networking among developers.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.