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
- 原生支持 .env 文件:引入了对.env文件的原生支持,允许开发者直接在Node.js中使用.env文件配置环境变量,无需依赖第三方模块(如dotenv)。
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
- 内置彩色文本输出: 支持通过console.log间接输出彩色文本,无需再引入第三方库(如 chalk),可以通过util.styleText函数来设置文本的颜色和样式。
- 环境变量功能增强:新增了两个API来加载和解析环境变量
- process.loadEnvFile(path)用于加载指定路径的.env文件。如果未指定路径,则会自动加载当前目录下的.env文件。
- util.parseEnv(content)用于解析包含环境变量赋值的字符。
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
- 支持 SQLite 数据库(实验性功能):在这个版本中,Node.js自带了SQLite模块,开发者可以直接在程序中使用SQLite数据库,而无需引入第三方库。
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
- 原生支持 ES 模块:Node.js v23.0最大的亮点之一是原生支持通过require()加载 ES 模块(ECMAScript Modules)。这意味着开发者可以直接使用require()来加载ES模块,而无需额外的工具或配置。
- 停止支持 32 位Windows系统:不再支持32位Windows,专注于现代环境。
小结
近来 Node.js 已经在很努力的更新了,相信未来越来越多更现代化的功能被 Node.js 支持。与此同时,Bun 和 Deno 也在迅猛崛起。值得注意的是,Bun 的目标不仅限于作为一个 JavaScript 运行时,它更致力于构建一个全面的 JavaScript 工具链。这三者之间的竞争,无疑加速了各自的创新步伐,未尝不是一件好事。