关于node.js:Nodejs-18-新特性解读

43次阅读

共计 3135 个字符,预计需要花费 8 分钟才能阅读完成。

如何疾速体验
举荐用 fnm,nvs,nvm 等 Node.js 版本管理器。

$ fnm install 18Installing Node v18.0.0 (arm64) $ fnm use 18Using Node v18.0.0 $ node -vv18.0.0 复制代码
须要留神的是,该版本不是 LTS 版本,请勿在生产环境应用,须要等到 2022-10-25 才会成为 LTS 版本。

Looking to the future
The project is also continuing its‘Next 10’effort. The goal of this effort is to reflect on what led to success in the first 10 years of Node.js and set the direction for success in the next 10.

Node.js 官网启动了 next-10next-10 工作,并探讨出了将来重要的几件事将来重要的几件事将来重要的几件事:

现代化的 HTTP

敌对的类型反对

对初学者更敌对的渐进式文档

对 ECMAScript 标准的反对和及时跟进

可观测性,包含 logging/metrics/tracing,以及 APM 等

更好的多线程反对

反对打包为单文件的散发形式

Fetch API
前端同学应该都很相熟 fetch()这个 API,它提供了规范的网络申请能力,取代了远古的 XMLHttpRequest。

反观 Node.js 侧,官网提供的 http.request(),太底层太根底了,用起来往往须要大量的封装。譬如 302 后主动跳转、文件上传、响应后果解析等等。

因而在 Node.js 社区有十分多的下层申请库封装:

已经广受社区欢送的 request 库去年发表进行保护发表进行保护后,也引起了社区比拟大的凌乱。。

咱们 Egg 内置的是 urlliburllib,积淀了阿里多年在网络申请上踩的坑,足够稳固,不过代码也有点长远了。

去年 Node.js 官网推出了 undiciundici,一个十分现代化的库,具备优越的性能,良好的扩展性,内置的 mock 等能力,集大成者。

从而 Node.js 终于内置了新的申请库,它遵循 Fetch 标准 Fetch 标准,底层就是基于 undici 来实现的。

const res = await fetch(‘https://nodejs.org/api/docume…’);if (res.ok) {const data = await res.json(); console.log(data);}复制代码
就这么简略,比 http.request()那一坨 callback-style 代码简洁多了,平时写个脚本啥的,不必再引入额定的类库了。

全局减少了 fetch, FormData, Headers, Request, Response 这几个 API,以及 Web Streams API。

可能是为了遵循标准,undici 的很多能力如 Mock,Proxy,Pool 等都没有提供进去。

Test Runner
单元测试很重要,很多新兴的编程语言都是会内置对应的能力,但前端这块始终都是由社区来实现,前端同学耳熟能详的 Test Runner 有 MochaMocha、Jest。

// mocha showcaseimport assert from ‘assert/strict’; describe(‘test/index.test.js’, () => {it(‘test1’, async () => {const res = await fetch(‘https://nodejs.org/api/docume…’); assert(res.ok); }); it.skip(‘skip some test’, () => {});}); 复制代码
终于,Node.js 在 18.x 里官网反对了 Test 能力 Test 能力:

import test from ‘node:test’;import assert from ‘assert/strict’; // 等价于 describe()test(‘asynchronous passing test’, async () => {const res = await fetch(‘https://nodejs.org/api/docume…’); assert(res.ok);}); test(‘multi level test’, async (t) => {// 等价于 it() await t.test(‘subtest 1’, (t) => {assert.strictEqual(1, 1); }); await t.test(‘subtest 2’, (t) => {assert.strictEqual(2, 2); });}); // 等价于 describe.skip() / it.skip()test(‘skip option’, { skip: true}, () => {}); // 等价于 describe.only() / it.only()test(‘only option’, { only: true}, () => {}); 复制代码
能够看到:

语法其实差不多,会更简洁一点,就一个 test(),options 除了 skip 和 only 外,还反对 concurrency 并发。

无需启动器,每一个文件都是一个可执行的 Node.js 代码。

暂未反对 before/after/beforeEach/afterEach 能力,看 issue 形容会后续反对。

暂未反对 Reporter,但日志输入为规范 TAP 格局,所以应该很容易能复用现有的社区生态。

相似覆盖率的演进过程,以前咱们须要通过 nyc 对代码转译打桩,当初变为的 Node.js 内置覆盖率输入,nyc 变为 c8 这样的覆盖率报告生成工具。

后续 mocha 等预计会变为相似的下层封装,提供批量执行 和 Reporter 等能力。

Build-time user-land snapshot
简略的说,能够把某个 js 间接编译成 v8 snapshot,从而能够极大的提速启动工夫。

目前这个版本,还只能通过 Node.js 源码来编译,且只能编译成 Node.js Runtime 的形式,即 Build-time。

把一段 markdown 渲染的逻辑,间接打包到 Node Runtime$ cd /path/to/node/source$ ./configure –node-snapshot-main=marked.js$ make node # 执行编译好的 Node Runtime$ out/Release/node> const html = globalThis.marked(‘# this is title’); 复制代码

秋怡正在持续推动该能力,将来能够无需编译 Node.js 源码:

$ node –build-snapshot –snapshot-blob marked.blob marked.js $ node –snapshot-blob marked.blob 复制代码
V8 引擎降级
内置的 V8 引擎降级到 10.1 版本,值得注意的个性:

class fields 和 private class methods 的性能优化。

Intl 标准 的反对,在做日期的本地化,字符串解决的时候十分有用。

数组反对 findLast() 和 findLastIndex() 等。

ESM 的反对
尽管在 18.x 中没有新的内容,但在过来的几个月中始终在继续推动 ECMAScript 模块实现:

对 JSON Import Assertions 的反对。

JSON 模块的正式反对。

对 HTTPS 和 HTTP 导入的实验性反对。

Node.js 加载器团队

也在持续开发 ECMAScript 模块加载器实现。

工具链和编译器的降级
Linux 版是在 RHEL8 上构建的,要求 glibc 2.28 以上版本。

macOS 要求 10.15 以上版本。

Windows 很多旧版本也不反对了。

关键词:前端培训

正文完
 0