NodeJs 最近各版本特性汇总
(预测未来最好的方法就是把它创造出来——尼葛洛庞帝)

NodeJs
官方链接
github链接
V8链接
Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 [2]
Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好,V8引擎执行Javascript的速度非常快,性能非常好,基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用
接下来整理的是开发中常用的特性,一些作者认为不常用的可能会不记录或者记录的不详细
NodeJs的发布规则
- CURRENT:指代最新的 Node.js 版本系列。
- Active:指正在积极维护和升级的版本系列,包括向后移植非破坏性功能和改进,解决错误以及修补安全漏洞。
- Maintenance:这是一个维护的 LTS 版本系列,直到它的生命周期终止,只会在短时间内收到错误修复和安全补丁。
- LTS:是Long-Term Support 的缩写,代表 Node.js 长期支持的版本(版本号为复数)。
- EOL:EOL 是 End of Life 的首字母缩写,进入到 EOL 时间线的版本,将不在维护。
让我们看下 Node.js版本的生命周期是怎么样的?首先要知道每年的 4 月、10 月分别发布偶数、奇数版本,下面是过程说明:
最近的一个偶数版本在 4 月份发布之后会持续 6 个月。 待 10 月份会发布一个奇数版本,最近的偶数版本会进入 Active LTS版本。持续时间为 18 个月,这期间几乎不会有不兼容的大功能更新,开发者也可以放心升级到 Active LTS 版本。
18 个月的Active LTS 版本到期后,会进入 Maintenance LTS 版本,也就是进入维护期,时间为 12
个月,在这期间仅进行安全、Bug 更新。 一旦 Maintenance LTS 版本 12 个月的时间已到就会进入 EOL
版本,正式退出历史舞台。
其中偶数版本会持续维护18个月,而奇数版本指挥维护8个月。
生命周期图

20.0.0
2023-04-18发布
1. 权限模型
Node.js 现在有一个名为权限模型的实验性功能。它允许开发人员在程序执行期间限制对特定资源的访问,例如文件系统操作、子进程生成和工作线程创建。API 存在于一个标志后面–experimental-permission,启用后将限制对所有可用权限的访问。通过使用此功能,开发人员可以防止他们的应用程序访问或修改敏感数据或运行可能有害的代码。
- 使用–allow-fs-read和–allow-fs-write限制对文件读写系统的访问
- 使用–allow-child-process限制访问 child_process
- 使用–allow-worker限制访问 worker_threads
- 使用–no-addons制对本机插件的访问
2. 自定义 ESM 加载程序挂钩在专用线程上运行
通过加载程序 ( ) 提供的 ESM 挂钩–experimental-loader=foo.mjs现在在与主线程隔离的专用线程中运行。这为加载程序提供了一个单独的范围,并确保加载程序和应用程序代码之间没有交叉污染。
3. import.meta.resolve()
为了与浏览器行为保持一致,此函数现在同步返回。尽管如此,用户加载resolve程序挂钩仍然可以定义为异步函数(或同步函数,如果作者愿意的话)。即使resolve加载了异步挂钩,import.meta.resolve仍会同步返回应用程序代码。
4. V8 11.3
V8 引擎更新到版本 11.3,它是 Chromium 113 的一部分。这个版本包括 JavaScript API 的三个新特性
- String.prototype.isWellFormed 和 toWellFormed
isWellFormed用于检查这个字符串是否是一个合法的 Unicode,而toWellFormed则会将一个字符串转换为 Unicode。
通过复制改变 Array 和 TypedArray 的方法
现有的Array.prototype和TypedArray.prototype的函数会直接修改接收的数组。而新函数会返回接收的数组的修改副本,并将原始数组保持不变。这些新函数在数据不可变的编程风格中很有用。
可调整大小的 ArrayBuffer 和可增长的 SharedArrayBuffer
带有集合符号的 RegExp v 标志 + 字符串的属性
WebAssembly 尾调用
5. 稳定的测试运行器
最近对 Node.js 版本 20 的更新包括对 test_runner 模块的重要更改。在最近的更新后,该模块已被标记为稳定。以前,test_runner 模块是实验性的,但这次更改标志着它是一个可以用于生产的稳定模块。
它主要用来编写并运行测试文件,类似mock等测试组件包
- describe/it/test函数,以及测试文件的钩子。
- mock 数据。
- 监听文件变化模式(watch mode)。
- node --test支持并行运行多个测试文件。
import { test, mock } from "node:test";
import assert from "node:assert";
import fs from "node:fs";mock.method(fs, "readFile", async () => "Hello ZY");
test("synchronous passing test", async (t) => {// This test passes because it does not throw an exception.assert.strictEqual(await fs.readFile("zy.txt"), "Hello ZY");
});
6. Ada 2.0
Node.js v20 附带了最新版本的 URL 解析器 Ada。此更新为 URL 解析带来了显着的性能改进,包括增强url.domainToASCII了.url.domainToUnicodenode:url
Ada 2.0 已集成到 Node.js 代码库中,确保应用程序的所有部分都能从改进的性能中受益。此外,Ada 2.0 比其前身 Ada 1.0.4 具有显着的性能提升,同时还消除了对 URL 主机名解析的 ICU 要求。
19.0.0
2022-10-18发布
1. HTTP(S)/1.1 KeepAlive 默认
从此版本开始,Node.jskeepAlive默认设置为 true。这意味着任何传出的 HTTP(s) 连接都将自动使用 HTTP 1.1 Keep-Alive。默认等待时间为 5 秒。启用 keep-alive 将提供更好的吞吐量,因为默认情况下会重用连接。
此外,代理现在能够解析Keep-Alive服务器可能发送的响应。此标头指示客户端保持连接的程度。另一方面,Node.js HTTP 服务器现在将在调用时自动断开空闲客户端(使用 HTTP Keep-Alive 重用连接)close()。
默认情况下,Node.js HTTP(S)/1.1 请求可能会体验到更好的吞吐量/性能。
2. 删除了 DTrace/SystemTap/ETW 支持
3. V8 10.7
V8 引擎更新到 10.7 版,它是 Chromium 107 的一部分。该版本包括 JavaScript API 的新功能:Intl.NumberFormat.
Intl.NumberFormatv3 API 是一个新的TC39 ECMA402 第 3 阶段提案, 扩展了现有的Intl.NumberFormat.
4. llhttp 8.1.0
llhttp 已经更新到 8.1.0 版本。总的来说,这个版本对 llhttp API 带来了许多更新,引入了新的回调并允许所有回调都可以暂停。
18.0.0
2022-04-19发布
1. fetch(实验性)
默认情况下,全局范围内提供了一个实验性的获取 API。该实现基于undici,一个由项目贡献者为 Node.js 编写的 HTTP/1.1 客户端。
const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {const data = await res.json();console.log(data);
}
通过此添加,可以使用以下全局变量:fetch, FormData, Headers, Request, Response
使用–no-experimental-fetch命令行标志禁用此 API
2. HTTP 超时
server.headersTimeout这限制了解析器等待接收完整 HTTP 标头的时间,现在60000默认设置为(60 秒)。
server.requestTimeout300000设置从客户端接收整个请求的超时值(以毫秒为单位)现在默认设置为(5 分钟)。
如果这些超时到期,服务器将以状态 408 响应而不将请求转发给请求侦听器,然后关闭连接。
两个超时都必须设置为非零值,以防止在服务器部署前没有反向代理的情况下发生潜在的拒绝服务攻击。
3. Test Runner 模块(实验性的)
该node:test模块有助于创建以 TAP 格式报告结果的 JavaScript 测试。
import test from 'node:test';
该模块仅在该方案下可用node:
以下是具有两个子测试的父测试的示例实现:
test('top level test', async (t) => {await t.test('subtest 1', (t) => {assert.strictEqual(1, 1);});await t.test('subtest 2', (t) => {assert.strictEqual(2, 2);});
});
4. 工具链和编译器升级
5. V8 10.1
V8 引擎更新到 10.1 版本,它是 Chromium 101 的一部分。与 Node.js 17.9.0 中包含的版本相比,包括以下新特性
findLast数组findLastIndex方法
const inputArray = [{v:1}, {v:2}, {v:3}, {v:4}, {v:5}];
inputArray.findLast((element) => element.v % 2 === 0);
// → {v:4}
inputArray.findLast((element) => element.v % 7 === 0);
// → undefined
inputArray.findLastIndex((element) => element.v % 2 === 0);
// → 3
inputArray.findLastIndex((element) => element.v % 7 === 0);
// → -1
Intl.LocaleAPI的改进。
Intl.supportedValuesOf
改进了类字段和私有类方法的性能(它们的初始化现在与普通属性存储一样快)
17.0.0
2021-10-19发布
1. OpenSSL 3.0
2. V8 9.5
V8 JavaScript 引擎更新到 V8 9.5。此版本附带Intl.DisplayNamesAPI 的其他受支持类型和timeZoneNameAPI 中的扩展选项Intl.DateTimeFormat
3. Readline 承诺 API
该模块提供了一个接口,用于一次一行地readline从 Readable 流(例如 )中读取数据。process.stdin
以下简单示例说明了该readline模块的基本用法
import * as readline from 'node:readline/promises';
import { stdin as input, stdout as output } from 'process';const rl = readline.createInterface({ input, output });const answer = await rl.question('What do you think of Node.js? ');console.log(`Thank you for your valuable feedback: ${answer}`);rl.close();
16.0.0
2021-04-21发布
1. 稳定Timers Promises API
Timers Promises API 提供了一组替代的计时器函数,它们返回 Promise 对象。在 Node.js v15.0.0 中添加,在此版本中,它们从实验状态升级到稳定状态。
import { setTimeout } from 'timers/promises';async function run() {const res = await setTimeout(3000, 'fullFilledValue');console.log(`Get result=>${res} after 3s`);
}run(); // 3s后输出:Get result=>fullFilledValue after 3s
2. 工具链和编译器升级
3. V8 JavaScript 引擎更新到 V8 9.0,包括性能调整和改进
这次V8的升级带来了ECMAScript RegExp比对索引功能,能提供字符串的开始与结束索引。当正则表达式带有/d标签时,可以通过indices属性访问到索引数组。
14.0.0
2020-04-21发布
1. V8 8.1
可选链接
Nullish 合并
Intl.DisplayNames
为 Intl.DateTimeFormat 启用 calendar 和 numberingSystem 选项
2. 实验性异步本地存储 API
3. 强化流 API
13.0.0
2019-10-22发布
1. 断言
如果验证函数传递给assert.throws()或assert.rejects() 返回的值不是true,则将抛出断言错误而不是原始错误以突出显示编程错误(Ruben Bridgewater)
2. 构建
Node.js 版本现在使用默认的 full-icu 支持构建。这意味着现在包含了 ICU 支持的所有语言环境,并且与国际相关的 API 可能会返回与以前不同的值(Richard Lau)
3. V8 7.8
新增对象解构、内存使用和 WebAssembly 启动时间的性能改进
12.0.0
2019-04-29发布
1. V8 7.4
在V8 7.4中,对于开发人员来说最重要的新特性是预计计算属性,可以让开发人员更方便地通过表达式来定义对象属性,同时引入了更多的原型方法。此外,V8 7.4还实现了大量的内存管理和性能改进,这将使得Node.js 12的性能更加稳定和可靠。
2. 更快的ES模块加载
随着Web应用程序变得越来越庞大,加载和解析JavaScript模块的速度越来越成为Web开发的瓶颈。为了解决这个问题,Node.js 12引入了较新的V8版本的快速对象存储访问,从而使得ES模块的加载和解析速度更快,可实现更快的Web应用程序加载时间和启动时间。
3. HTTP/2的完整支持
HTTP/2作为HTTP协议的下一代,拥有比HTTP 1.x更快、更安全的数据传输速度。Node.js 12支持HTTP/2的完整支持,包括对HTTP/2流的完整流控、过程化二进制协议的解码和对H2C升级的支持。同样,Node.js 12还支持ALPN协议,在HTTPS请求中使用HTTP/2。
11.0.0
2018-10-23发布
1. V8 7.0
2. fs
- fs.read()方法现在需要回调
- 以前弃用的fs.SyncWriteStream实用程序已被删除
3. console
- console.countReset()如果重置的计时器不存在,将发出警告
- console.time()如果计时器已经存在,将不再重置它
10.0.0
2018-04-24发布
1. 断言
- 添加了和assert.rejects()方法assert.doesNotReject()以使用异步函数
- assert.throws()接受一个对象来与错误进行比较
2. 异步钩子
- 旧的实验性 async_hooks API 已被删除
3. Buffer
- 使用目录new Buffer()和Buffer()外部目录node_modules现在将发出运行时弃用警告
- Buffer.isEncoding()现在返回undefined虚假值,包括空字符串
- Buffer.fill()如果尝试填充一个空的Buffer
- noAssert参数已从所有Buffer读写函数中删除
4. V8 6.6
5. 发送事件
该EventEmitter.prototype.off()方法已添加为 的别名EventEmitter.prototype.removeListener()
6. fs
- APIfs/promises提供了函数的实验性承诺版本fs
- 现在会同步抛出无效路径错误
- 该fs.readFile()方法现在对读取进行分区以避免线程池耗尽
7. node10x后续版本开放了工作线程
工作线程主要用于解决node计算类的业务问题。但需要注意的是,对io类操作没有作用。
相关文章:
NodeJs 最近各版本特性汇总
(预测未来最好的方法就是把它创造出来——尼葛洛庞帝) NodeJs 官方链接 github链接 V8链接 Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模…...
python数据分析案例——天猫订单综合分析
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 什么是数据分析 明确目的–获得数据(爬虫,现有,公开的数据)–数据预处理——数据可视化——结论 准备 环境使用: 在开始写我们的代码之前,我们要准备好运行代码的程序 Anacon…...
05- redis集群模式搭建(上) (包含云服务器[填坑])
目录 1. 准备环境: 2. 简介: -> 2.1 前言: -> 2.2 Redis集群架构实现了对redis的水平扩容 -> 2.3 redis cluster集群原理 3. 搭建后特别需要注意的问题 ->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务??? ---> 3.1.1 如果集群中故障re…...
【AI】YOLOV1原理详解
AI学习目录汇总 0、前言 YOLOv1~3作者是约瑟夫雷德蒙(Joseph Chet Redmon),他的网站:https://pjreddie.com/ YOLOv1网站:https://pjreddie.com/darknet/yolov1/ YOLOv2网站:https://pjreddie.com/darknet…...
提高APP安全性的必备加固手段——深度解析代码混淆技术
APP 加固方式 Android APP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码: 使用 ProGuard 工具可以对代码进行混淆,使得反编译出来的代…...
想让行车记录仪协助道路病害自动化检测?可以!
针对【RGB3DS道路表观病害信息智慧检测系统】,我们着重介绍过其与道路检测车做集成预装或者处理道路检测车数据的极大便利,其中之一便是可高效输出带有道路检测车桩号标记的病害报表,这是因为道路检测车数据本身具有规范性。 那么如果使用道…...
git上传大大大文件项目好折磨人
本来想把unity项目的源码上传上gitee啊,但是那个项目有1个多G,还是个半成品,要是写完,都不知道行不行 正常的上传 所用到的命令: 1、 git init 初始化,创建本地仓库 2、 git add . 添加到本地仓库 3、 git…...
java常见异常的处理方法
以下是一些常见的异常处理方法: 捕获和处理异常(try-catch): 使用try-catch语句块可以捕获并处理异常。在try块中编写可能抛出异常的代码,然后在catch块中指定异常类型,以便捕获并处理异常。 try {// 可能抛…...
上传图片到阿里云服务器base64 上传
//上传图片到阿里云服务器 function upload_Ali($remoteImage){$imageData $this->n_img_base_64($remoteImage);if ($imageData ! false) {// 初始化 cURL 句柄$ch curl_init();// 设置请求 URL 和一些 cURL 选项curl_setopt($ch, CURLOPT_URL, http://dev.com/index/aja…...
【致敬未来的攻城狮计划】— 连续打卡第二十六天:瑞萨RA Cortex-M 内核RA2E1 RT-Thread BSP 启蒙知识
系列文章目录 由于一些特殊原因: 系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章)或者参考我的专栏“ 瑞萨MCU ”,里面是 瑞萨RA2E1 系列文章。 24.RA2E1的 DMAC——数据传输 …...
2023年5月8日-5月14日(方案C,下班UE视频教程为主)
目前,ue视频教程进行到了智 慧 城 市(3.13),mysql(7.1),tf1(4.11),蓝图反射(1.9),moba(1.5)webapp(2.4),mmoarpg(00A_04),fps1_12(0:3…...
「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选
作为新经济综合服务平台第一品牌,36氪自2019年落地四川站以来,不断通过新锐、深度的商业报道,陪跑、支持四川的新经济产业。通过挖掘本土优质项目,36氪四川帮助企业链接更多资源,助力企业成长,促进行业发展…...
Python突破JS加密限制,进行逆向解密
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录标题 前言开发环境:模块使用:逆向目标逆向过程参数 JS 加密关键代码Python 登录关键代码尾语 💝 开发环境: Python 3.8 Pycharm 模块使用: time >>> 时间模块,属于内置,无…...
【Linux】exec函数族
目录 1、exec函数族的介绍2、exec相关函数 1、exec函数族的介绍 2、exec相关函数 #include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ ); /* - path 需要指定的执行的文件的路径或者名称,相对路径or绝对路径- arg …...
OSQP二次规划求解库使用说明
OSQP二次规划求解库使用说明 贺志国 2023.5.10 1. 凸二次规划的一般表达式 m i n 1 2 x T P x q T x s . t . l ≤ A x ≤ u min \quad \frac{1}{2}x^T Px q^Tx \qquad s.t. \quad l \leq Ax \leq u min21xTPxqTxs.t.l≤Ax≤u 其中, P P P称为内核矩阵&#x…...
Elasticsearch(一)
Elasticsearch(一) 初始elasticsearch 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速查找到需要的内容 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack&…...
深入探究Java中的枚举类型:定义、特性和应用
引言: 在Java编程中,枚举类型是一种强大而灵活的工具,用于定义一组具名的常量。它不仅提供了代码可读性和可维护性的优势,还为开发人员提供了一种更安全和结构化的方式来处理固定的常量集合。本文将深入探讨Java中的枚举类型&…...
linux密码忘了?一招解决
目录 一、前言 二、进入编辑界面 三、单用户模式 四、修改密码 五、更新信息 六、退出 七、验证 一、前言 版本:centos7.9、VMware15.5 在我们学习linux运行级别的时候,面试题可能会出如何找回root密码,下面来详细的介绍一波ÿ…...
苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具
CleanMyMac X for mac是MacOS上一款Mac清理优化工具,不仅包含各种清理功能,更是具有卸载器、维护、扩展、碎纸机这些实用功能,可以同时代替很多工具。它可以清理,优化,保养和监测您的电脑,确保您的Mac运行…...
FPGA实现Cordic算法求解arctan和sqr(x*2 + y* 2)
一. 简介 由于在项目中需要使用的MPU6050,进行姿态解算,计算中设计到**arctan 和 sqr(x2 y 2),**这两部分的计算,在了解了一番之后,发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。另外也可以一次性求出sin和cos的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
