Owing to its massive package ecosystem, strong community support, and cross-platform compatibility, Node.js is being used by 1.4% to 2.22% of websites, globally. This data counts for approximately 30 million websites[i].
For more than a decade, Node.js has been a crucial player in web development, providing a unified JavaScript language for both server-side and client-side scripting. Its asynchronous, non-blocking I/O model ensures high performance and efficiency, making it ideal for handling concurrent connections.
Additionally, Node.js leverages the V8 JavaScript runtime, resulting in fast execution. With scalability at its core, Node.js is well-suited for real-time applications and microservices architectures. All these features make it a go-to choice for developers aiming to build scalable, efficient, and modern web applications.
However, on October 17th, 2023, its latest version Node.js 21 was released with various internal improvements and a few user-facing new features. This update prioritized performance enhancement through optimized runtime execution and reduced memory overhead. Additionally, it incorporated improved support for ECMAScript modules and seamless integration with the most recent web technologies.
In this blog post, we’ll add some additional context on the prominent improvements and feature updates in Node.js 21.
Let’s dive in!
9 Highlights of the Latest Node.js 21 Release
1. Updates to V8 JavaScript Engine
A significant improvement in Node.js 21 is the upgrade of the V8 engine to version 11.8. This update not only brings about improved performance but also introduces several notable JavaScript features.
One noteworthy addition is the introduction of array grouping, enabling the consolidation of similar data into groups through the use of methods like Object.groupBy() and Map.groupBy(). Additionally, a new programmatic API, ArrayBuffer.prototype.transfer, has been introduced to facilitate the transfer of ownership of ArrayBuffers. This release also optimizes reallocations and addresses the conversion of resizable ArrayBuffers into fixed-length ones.
Furthermore, the update extends support for WebAssembly with the incorporation of extended-const expressions, expanding the capabilities of Node.js in leveraging the latest advancements in web technologies and JavaScript functionalities.
2. Stable Fetch and Webstreams
Node.js 21 stabilizes the fetch and WebStreams APIs, transitioning them from their experimental status to being stable and ready for production use. If you have been utilizing these APIs in earlier versions, you can now confidently incorporate them into your production workflows.
The fetch and WebStreams APIs provide a contemporary and consistent approach to interacting with HTTP resources and streams within the Node.js environment, adhering to established web standards. This stabilization ensures that developers implement these features in a reliable and standardized way to handle asynchronous data retrieval and streaming in their Node.js applications.
3. Introduction of a New Experimental Flag for Modules
In the Node.js 21 release, a notable addition is the introduction of the –experimental-default-type flag, designed to provide developers with greater control over the default behavior for input files not explicitly designated as ES modules or CommonJS.
In the absence of this flag feature, such input was conventionally interpreted as CommonJS. With the introduction of –experimental-default-type=module, developers now have the option to activate a comprehensive ES module implementation in specific scenarios. This includes cases where string input is supplied via –eval or STDIN, especially if –input-type is left unspecified.
Additionally, when dealing with files ending in .js or those lacking an extension, the flag comes into play when there is no associated package.json file or the nearest parent package.json field lacks a ‘type’ field (except within the node_modules directory). This enhancement enables developers the flexibility to experiment with and adopt ES modules more extensively, providing a nuanced and customizable approach to module handling.
4. Built-in Websocket Client
In Node.js 21, another notable feature enhancement is in the form of a built-in WebSocket client, presenting an experimental, browser-compatible WebSocket implementation. This feature enables developers to interact with WebSocket servers seamlessly within Node.js applications. To enable this functionality, developers can utilize the –experimental-websocket flag.
However, it’s important to note that, being an experimental feature, the implementation is subject to potential changes in future releases as it undergoes refinement and stabilization based on user feedback and evolving standards. The introduction of a built-in WebSocket client simplifies the integration of WebSocket communication into Node.js applications. This provides developers with a convenient and standardized way to establish and manage WebSocket connections while acknowledging the evolving nature of this feature during the experimental phase.
5. Node.js Test Runner Now Supports Globs
The latest Node.js 21 update introduces the support for globs in the test runner. This enhancement enables developers to leverage glob expressions when specifying the –test parameter, providing a more powerful and flexible way to run tests. With this feature, developers can employ versatile glob patterns to execute tests more efficiently. For instance, by using a command like node –test **/*.test.js, developers can conveniently run tests for all files with the .test.js extension across multiple directories. This capability enhances the test-running process, providing improved adaptability and ease of use for developers who are working on projects with diverse file structures and test configurations.
6. Add Flush Option to Fs.writefile() Function
In Node.js 21, a notable enhancement is the addition of the ‘flush’ option to the fs.writeFile function. This improvement addresses the scenario where data written to files may not be immediately flushed to permanent storage, potentially leading to subsequent read operations retrieving stale data.
The new ‘flush’ option, introduced in this Pull Request (PR), provides developers greater control over the flushing behavior. When enabled, this option ensures that data is forcefully flushed to permanent storage at the conclusion of a successful write operation. This feature is particularly valuable in situations where immediate data consistency is crucial, preventing the occurrence of stale data and providing developers with a more reliable and predictable file-writing mechanism in Node.js applications.
7. Removal of Module Customization Hook ‘globalPreload’
In Node.js 21, developers can remove the module customization hook ‘globalPreload’. In its place, developers are encouraged to utilize the ‘register’ method for sending data from the application thread to customization hooks, and the ‘initialize’ hook to establish a communication channel between threads. This adjustment provides a more structured and explicit approach to module customization, initiating a clearer separation of responsibilities.
The ‘register’ method facilitates the transmission of data to customization hooks, while the ‘initialize’ hook plays a role in setting up communication channels between threads. This refined mechanism enhances the overall modularity and maintainability of Node.js applications, aligning with best practices and promoting a more intuitive and organized code structure for developers working with module customization.
8. Lil HTTP 9.1.2 Strict Mode Enforcement
Another update in Node.js 21 is llhttp 9.1.2 which brings about strict mode enforcement by default, ensuring enhanced code reliability and security. The changes include the mandatory presence of \r\n after headers and chunks for consistent data processing. Additionally, data transmission after a message with the Connection: close header is no longer allowed, bolstering protocol adherence and connection handling. To accommodate specific use cases, the –insecure-http-parser flag is introduced, providing users the flexibility to disable these changes. These updates aim to elevate system stability and data processing consistency in Node.js applications, prompting developers to review and adjust their codebase for seamless integration.
9. ‘navigator’ Object Integration
With ‘navigator’ object integration, developers now have seamless access to hardware concurrency information through the newly introduced navigator.hardwareConcurrency. This enhancement aligns Node.js more closely with browser environments, providing a standardized way for developers to retrieve hardware concurrency details.
Furthermore, with this addition, Node.js becomes more versatile, enabling developers to build applications that leverage hardware resources more effectively, whether for optimizing performance or implementing parallel processing strategies.
Take Charge of Your Node.js Development With Version 21
The Node.js 21 release brings a host of exciting improvements, enhancements, and new features that promise to elevate your development experience. From the introduction of a built-in WebSocket client to the support for globs in the test runner, Node.js 21 provides developers with powerful tools for building modern, efficient applications. As you explore these advancements, remember to test your applications for compatibility and consider upgrading, especially with the End-of-Life status for Node.js 16, 17, or 19. Keeping the complexity of the upgrade and migration process in mind, here a proficient Node.js development partner could be transformational.
Ready to Elevate Your Node.js Application Development? Talk to Our Dev Maestros!
References: