Node.js 21 现已发布!

更新日期: 2023-10-20阅读: 669标签: node

我们很高兴地宣布 Node.js 21 发布!亮点包括将 V8 JavaScript 引擎更新至 11.8、稳定版fetch、WebStreams用于翻转模块默认值的新实验标志 ( --experimental-default-type)、内置 WebSocket 客户端、对我们的测试运行程序的许多更新等等! 

当 Node.js 20 于本月晚些时候进入长期支持 (LTS) 时,Node.js 21 将取代 Node.js 20 作为我们的“当前”版本。根据发布时间表,Node.js 21 将在接下来的 6 个月内成为“当前”版本,直到 2024 年 4 月。 该项目继续在多个领域取得进展,许多新功能和修复已融入到现有的 LTS 版本中。

因此, Node.js 21变更日志中概述的更改仅代表自上次主要版本以来功能和工作的一小部分。这篇博文将为与这些变化相关的更广泛的工作添加一些额外的背景信息。


Stable fetch/WebStreams

最近对Node.js的更新,版本21,包括对fetch模块和WebStreams的重要更改。 这两个模块在最近的更新后都被标记为稳定。

这将影响WebStreams、FormData、Headers、Request、Response和fetch。


内置WebSocket客户端

WebSocket此版本出现了一个实验性的浏览器兼容实现。这是通过标志启用的:--experimental-websocket。与任何实验性功能一样,它可能会发生变化。


V8 11.8

与往常一样,Node.js 中包含了新版本的 V8 引擎(更新至版本 11.8,它是 Chromium 118 的一部分),带来了改进的性能和新的语言功能,

Array grouping
ArrayBuffer.prototype.transfer
WebAssembly extended-const expressions


在Node.js测试运行器中支持globs

在最新的Node.js更新中,测试运行器引入了对glob表达式的支持, 指定--test参数。这意味着现在可以使用强大的glob模式来更有效和灵活地运行测试。例如可以使用以下命令跨多个目录对扩展名为.test.js的所有文件执行测试 类似于node --test **/*.test.js的命令。


ESM: --experimental-default-type flag to flip module defaults

新的标志--experimental-default-type可以用来切换Node.js使用的默认模块系统。 已经明确定义为ES模块或CommonJS的输入,例如由package.json "type"字段或.mjs/.cjs文件扩展名或--input-type标志不受影响。目前隐含的CommonJS将被解释为--experimental-default-type=module下的ES模块。

package.json "type".mjs.cjs--input-type--experimental-default-type=module
  • --eval如果未指定,则通过或 STDIN提供字符串输入--input-type。
  • 如果同一文件夹或任何父文件夹中.js不存在文件,则以扩展名结尾或没有扩展名的文件。package.json
  • .js如果最近的父package.json字段缺少字段,则以扩展名或无扩展名结尾的文件type;除非该文件夹位于node_modules文件夹内。

此外如果传递了--experimental-wasm-modules并且文件以WebAssembly前导\0asm开始,则无扩展文件将被解释为WebAssembly。


自定义模块 hook globalPreload 删除; 使用 register 和 initialize 代替

模块自定义 hook globalPreload已被删除。使用register将数据从应用程序线程发送到定制hook,以及initialize hook来建立线程之间的通信信道。


在fs.writeFile函数中添加flush选项

写入文件时,数据可能不会立即刷新到永久存储。 这允许后续的读操作看到陈旧的数据。 此PR为'flush'系列函数添加了一个fs.writeFile选项,该选项强制将数据在成功写入操作结束时刷新。


性能

性能是运行时的重要属性,我们的@nodejs/performance团队在过去的一年里,我们一直在努力改进URL、fetch、streams、node:fs和HTTP。

Streams

在这个版本中,streams维护者Robert Nagy通过删除冗余检查来进一步优化streams,利用位图,并以更有效的方式调度回调。

HTTP

以前当写入分块响应时,Node.js会为每个对.write(...)的调用创建一个单独的块,不管他们的回答是否有问题这在客户端和服务器端都导致了不必要的开销。

此更改通过在取消响应时为所有对write(...)的调用创建单个块来修复此问题。

考虑以下基于Transfer-Encoding 文档的示例:

res.cork();
res.write('Mozilla');
res.write(' Developer Network');
res.uncork();
在每个块的开头,您需要以十六进制格式添加当前块的长度,后跟“\r\n”,然后是块本身,最后是另一个“\r\n”。终止块是常规块,但其长度为零。

产生响应流:

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
18\r\n
Developer Network\r\n
0\r\n
\r\n

在此 PR 之后,当打开响应时,所有内容都会合并为一个块,从而绕过许多不必要的开销。

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25\r\n
Mozilla Developer Network\r\n
0\r\n
\r\n

llhttp 9.1.2 严格模式强制执行

  • 在以前版本的 Node.js 中,默认情况下不启用严格模式。在最新的更新中,之前严格模式中包含的所有设置均默认启用,从而增强了代码的可靠性和安全性。
  • 现在,后标头的存在\r\n是强制性的(以前,\r单独允许)。此外,\r\n现在需要一个块之后,以确保数据处理的一致性。
  • Connection: close不再允许在解析带有标头的消息后传输数据。此更改增强了协议遵守并改进了连接处理。

为了适应特定的用例,--insecure-http-parser存在该标志。此选项允许用户禁用上述更改并保持与以前的解析行为的向后兼容性。

这些更新旨在增强整体系统稳定性并提高 Node.js 应用程序中数据处理的一致性。我们鼓励开发人员检查他们的代码库并相应地调整他们的实现,以确保与最新版本的无缝集成。


navigator Object集成 

在 Node.js 21 中,我们引入了全局 navigator 对象,提升了 Web 互操作性。现在开发者可以通过 navigator.hardwareConcurrency 来访问硬件信息。


行动起来吧!

尝试新的 Node.js 21 版本!我们总是很高兴听到您的反馈。使用 Node.js 21 测试您的应用程序和模块有助于确保您的项目未来与最新的 Node.js 更改和功能兼容。

另外值得注意的是,Node.js 16 (LTS) 已停产,因此我们强烈建议您开始计划升级到 Node.js 18 (LTS) 或 Node.js 20 (LTS)。

英文原文:https://nodejs.org/ka/blog/announcements/v21-release-announce


链接: https://fly63.com/article/detial/12534

关于 Node.js 里 ES6 Modules 的一次更新说明

关于 Node.js 里 ES6 Modules 的一次更新说明,总结来说:CommonJS 与 ES6 Modules 之间的关键不同在于代码什么时候知道一个模块的结构和使用它。

用node.js开发一个可交互的命令行应用

在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外

Node启动https服务器

首先你需要生成https证书,可以去付费的网站购买或者找一些免费的网站,可能会是key或者crt或者pem结尾的。不同格式之间可以通过OpenSSL转换

nodejs 异步转同步

nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。

基于node服务器的大文件(G级)上传

3G的大文件分1500个2M二进度文件,通post方法发送给node服务,服务器全部接收到文件后,进组装生成你上文件。

为什么要把 JavaScript 放到服务器端上运行?

JavaScript比C的开发门槛要低,尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,JavaScript在浏览器中有广泛的事件驱动方面的应用,考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。

了解node.js事件循环

node.js的第一个基本论点是I / O的性能消耗是很昂贵。因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响

Node.js 应用:Koa2 使用 JWT 进行鉴权

在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?

Node.js 前端开发指南

我们经常跟Node.js打交道,即使你是一名前端开发人员 -- npm脚本,webpack配置,gulp任务,程序打包 或 运行测试等。即使你真的不需要深入理解这些任务,但有时候你会感到困惑,会因为缺少Node.js的一些核心概念而以非常奇怪的方式来编码。

happypack提升项目构建速度

运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!