(预测未来最好的方法就是把它创造出来——尼葛洛庞帝)
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类操作没有作用。