2018 年,Node.js 之父 Ryan Dahl 推出了全新的 JavaScript 运行时 Deno,旨在解决Node.js中一些长期存在的问题,同时提供增强的安全性和现代语言特性。到了2022年,另一个名为 Bun 的 JavaScript 运行时横空出世,在开发社区内引发了广泛讨论。
这两个新兴的运行时之所以受到如此多的关注,很大程度上反映了开发者们对Node.js现状的不满以及对新解决方案的渴望,然而,尽管它们带来了许多创新和改进,但由于历史原因以及 Node.js 庞大的生态系统构建等因素,许多开发者仍然持观望态度。
面对这些新兴竞争者的挑战,Node.js 似乎感受到了前所未有的危机感,开始反击,推出了一系列实用功能,解决了许多痛点问题。下面就来看看 Node.js 近来都引入了哪些实用功能!
Node.js v20.0
权限模型(实验性功能):Node.js 20 引入了权限模型,它允许开发者在程序执行期间限制对特定资源的访问,例如文件系统操作、子进程生成和工作线程创建。
原生测试运行器:Node.js 20 中,test_runner
模块被标记为稳定,这意味着它已经准备好用于生产环境。稳定的测试运行器包括编写和运行测试所需的基本组件,如describe
、it
/test
和钩子来构建测试文件、模拟、监视模式以及node --test
用于并行运行多个测试文件。
Node.js v20.6
Node.js v21.0
内置 WebSocket 客户端(实验性功能): Node.js v21.0提供了一个实验性的、与浏览器兼容的WebSocket实现。开发者可以通过标志(--experimental-websocket)启用该功能,从而更方便地在Node.js环境中使用WebSocket。
自由切换默认模块系统(实验性功能): 引入了一个新的实验性标志(--experimental-default-type
),用于切换Node.js使用的默认模块系统。这一功能允许开发者在ES模块和CommonJS之间灵活切换,以满足不同的项目需求。
Node.js v21.7
Node.js v22.0
监听模式: 从Node.js 22版本开始,观察模式(node --watch
)已经稳定。在监听模式下,当被监视的文件发生变化时,Node.js进程将自动重新启动,不再需要借助第三方模块(如 nodemon
)。
内置 WebSocket 客户端(稳定版): 内置 WebSocket 客户端成为于稳定功能,不再需要--experimental-websocket
标志来启用。WebSocket的实现遵循了浏览器中WebSocket API的标准,这意味着在Node.js中使用WebSocket的方式将与在JavaScript中使用WebSocket的方式非常相似。
支持通过require()引入ESM :打破了CommonJS与ESM之间的界限,允许开发者使用require()函数来导入ESM 模块。这为大型项目和遗留系统提供了一个平滑过渡的方案,因为它们可以逐个模块迁移到ESM,而不是一次性对整个项目进行修改。
支持运行 package.json 中的脚本: 添加了一个新命令行标志--run
,允许直接从命令行执行package.json中定义的脚本。这提供了一个标准化的方式执行脚本,有助于统一不同包管理器在处理脚本时的行为,并且直接使用node执行脚本要比通过npm执行脚本更快。
Node.js v22.5
Node.js v22.6
原生支持TypeScript(实验性功能):通过--experimental-strip-types
标志,实现了对TypeScript的实验性支持。这意味着开发者们现在可以在Node.js环境中直接执行.ts
文件,而无需进行额外的编译步骤。然而,需要注意的是,当前的实验性支持有一些限制,例如仅支持内联类型注释,不支持像 enums、namespaces 这样的高级TypeScript功能。此外,Node.js不会读取tsconfig.json
文件,因此在运行时不会进行类型校验。
网络检测支持(实验性功能): 为 Node.js 引入了网络检查的初步支持。这是一个实验性功能,需要使用--experimental-network-inspection
标志来启用它。启用此功能后,可以检查 JavaScript 应用中发生的网络活动。不过,目前网络检查仅限于http
和https
模块。
Node.js v23.0
小结
近来 Node.js 已经在很努力的更新了,相信未来越来越多更现代化的功能被 Node.js 支持。
与此同时,Bun 和 Deno 也在迅猛崛起。值得注意的是,Bun 的目标不仅限于作为一个 JavaScript 运行时,它更致力于构建一个全面的 JavaScript 工具链。
这三者之间的竞争,无疑加速了各自的创新步伐,未尝不是一件好事。
今日话题:你在实际开发中用过 Bun 和 Deno 吗?体验怎么样?
欢迎在评论区留言讨论~