专栏首页code秘密花园Node.js 18 来了!

Node.js 18 来了!

大家好,我是 ConardLi

概述

Node.js 刚刚发布了 18.0.0 版本,内置了 fetchnode:test 等标准模块。

「一句话点评:std lib 在标准化,user lib 在精细化。」

如何快速体验

推荐用 fnm,nvs,nvm 等 Node.js 版本管理器。

$ fnm install 18
Installing Node v18.0.0 (arm64)

$ fnm use 18
Using Node v18.0.0

$ node -v
v18.0.0

需要注意的是,该版本不是 LTS 版本,请勿在生产环境使用,需要等到 2022-10-25 才会成为 LTS 版本。

https://github.com/nodejs/release

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-10 工作,并讨论出了未来重要的几件事:

  • 现代化的 HTTP
  • 友好的类型支持
  • 对初学者更友好的渐进式文档
  • 对 ECMAScript 规范的支持和及时跟进
  • 可观测性,包括 logging/metrics/tracing,以及 APM 等
  • 更好的多线程支持
  • 支持打包为单文件的分发方式

譬如前面说的 Fetch 就和 Modern HTTP 的会议讨论有关,相关纪要。

6 月份的 OpenJS World 会议中将分享 ESM 和 Observability 进展,可以关注下相关动态。

Fetch API

前端同学应该都很熟悉 fetch() 这个 API,它提供了标准的网络请求能力,取代了远古的 XMLHttpRequest 。

反观 Node.js 侧,官方提供的 http.request() 太底层太基础了,用起来往往需要大量的封装。譬如 302 后自动跳转、文件上传、响应结果解析等等。因此在 Node.js 社区有非常多的上层请求库封装:

  • 曾经广受社区欢迎的 request 库去年宣布停止维护后,也引起了社区比较大的混乱。
  • 我们 Egg 内置的是 urllib,沉淀了阿里多年在网络请求上踩的坑,足够稳定,不过代码也有点久远了。
  • 更多参见 Alternative libraries to request, 以及 《天猪:那些你应该说再见的 npm 祖传老库》。

「去年 Node.js 官方推出了」 undici「,一个非常现代化的库,具备优越的性能,良好的扩展性,内置的 mock 等能力,集大成者。」

undici 的命名也很有趣:A HTTP/1.1 client → 11 → Eleven → Undici,即意大利语的 11。

从而 「Node.js 终于内置了新的请求库,它遵循」 Fetch 规范「,底层就是基于 undici 来实现的。」

// ConardLi
const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}

就这么简单,比 http.request() 那一坨 callback-style 代码简洁多了,平时写个脚本啥的,不用再引入额外的类库了。

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

目前还处于默认开启的实验性特性阶段,文档在 Globals 章节,近乎没有,有需要直接看 MDN 文档 即可。

可能是为了遵循规范, undici 的很多能力如 Mock,Proxy,Pool 等都没有提供出来。


Test Runner

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

// mocha showcase - code秘密花园
import assert from 'assert/strict';

describe('test/index.test.js', () => {
  it('test1', async () => {
    const res = await fetch('https://nodejs.org/api/documentation.json');
    assert(res.ok);
  });

  it.skip('skip some test', () => {});
});

终于,Node.js 在 18.x 里官方支持了 Test 能力:

import test from 'node:test';
import assert from 'assert/strict';

// 等价于 describe() - code秘密花园
test('asynchronous passing test', async () => {
  const res = await fetch('https://nodejs.org/api/documentation.json');
  assert(res.ok);
});

test('multi level test', async (t) => {
  // 等价于 it()  - code秘密花园
  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

PS:这个能力用在命令行 CLI 的独立打包好像也不错。https://github.com/nodejs/node/issues/42566


V8 引擎升级

内置的 V8 引擎升级到 10.1 版本,值得注意的特性:

  • 「class fields 和 private class methods 的性能优化。」
  • Intl 规范 的支持,在做日期的本地化,字符串处理的时候非常有用。
  • 数组支持 findLast() 和 findLastIndex() 等。

秋怡也写了一篇文章 Faster initialization of instances with new class features 分享了背后的实现。

PS:ECMAScript 双月报告:装饰器提案进入 Stage 3 ,阿里的 Node 架构团队今年会推动 Decorator 方案在 V8 的落地实现,不过肯定赶不上了,只能 Node.js 20.x 见了。


ESM 的支持

虽然在 18.x 中没有新的内容,但在过去的几个月中一直在持续推动 ECMAScript模块实现:

  • 对 JSON Import Assertions 的支持。
  • JSON 模块的正式支持。
  • 对 HTTPS 和 HTTP 导入的实验性支持。
  • Node.js 加载器团队也在继续开发 ECMAScript 模块加载器实现。

工具链和编译器的升级

  • Linux 版是在 RHEL8 上构建的,要求 glibc 2.28 以上版本。
  • macOS 要求 10.15 以上版本。
  • Windows 很多旧版本也不支持了。

PS:CentOS 7 官方不再维护了,它对应的 glibc 版本太低,所以升不了。。。

相关资料

作者:天猪 https://www.zhihu.com/people/liuyong25/posts

  • http://nodejs.org/en/blog/announcements/v18-release-announce
  • https://nodejs.org/en/blog/release/v18.0.0/
文章分享自微信公众号:
code秘密花园

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:天猪
原始发表时间:2022-04-24
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • node.js 9 来了!重大版本更新!

    大概原因可能是node 基于 v8引擎,v8没一直实现的原因吧 现在谷歌浏览器一直也不支持

    疯狂的技术宅
  • 解读官方博客:React18真的来了

    所以「Andrew」在v16.13.1时需要先完成lanes优先级调度算法的开发。

    公众号@魔术师卡颂
  • Java 18 要来了,你会选择用吗?

    Java 开发工具包 (JDK) 18 将于 2022 年 3 月 22 日发布。新版本的标准 Java 将有九个新特性,该特性集已于 12 月 9 日冻结,进...

    Java技术精选
  • 塔荐 | 号称最快的 Node.js 应用框架来了

    前 言 一个号称目前最快的 Node.js 应用框架横空出世,高度专注于以最少开销和强大的插件架构为开发者提供最佳的体验。 作为开发者,让项目跑得更快一直是坚...

    灯塔大数据
  • Node.js v14 官方发布说明来了

    本文由Michael Dawson 和 Bethany Griggs 撰写,同时 Node.js 社区委员会和 Node.js 技术指导委员会也提供了贡献。

    疯狂的技术宅
  • Node.js 16 来了,14 将支持到 2023 年

    参见 Node.js 官方网站[1] 的发布记录,Node.js 16 版本已于 2021 年 4 月 20 日发布,重点包括:将 JavaScript v8 ...

    五月君
  • Node.js v17 来了,看看都有哪些新功能?

    Node.js v17 版本已发布,取代了 v16 做为当前版本,新的 v17 版本提供了一些新功能:基于 Promise 的其它核心模块 API、错误堆栈尾...

    coder_koala
  • Node.js v17 来了,看看都有哪些新功能?

    Node.js v17 版本已发布,取代了 v16 做为当前版本,新的 v17 版本提供了一些新功能:基于 Promise 的其它核心模块 API、错误堆栈尾...

    五月君
  • Java 18 都要来了,你不会还在用Java 8吧?

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 |...

    芋道源码
  • 来了来了,TAPD 项目模板真的来了

    在日常的项目管理和团队协作过程中,管理员对于同类型的项目有着标准化的管理方式。 我们在与TAPD管理员沟通过程中,常常也会听到这样的诉求: “我们公司经常会有...

    TAPD敏捷研发
  • 来了来了,Java14 它真的来了!

    译文链接:https://blog.csdn.net/Milogenius/article/details/104997807

    逆锋起笔
  • 来了来了,Java14它真的来了

    语言必须发展,否则它们就有变得无关紧要的风险,” Brian Goetz (甲骨文公司)在2019年11月在 Devoxx 举行的“ Java 语言期货”演讲中...

    麦洛
  • 来了!他来了!支持MVVM的BRVAH来了!

    博客:https://blog.csdn.net/Shaojihan/article/details/103673399

    陈宇明
  • 【Node.js】初识Node.js

      因组里项目需要,我和另外一名同事要学习Node.js。之前接触过Javascript,都是前台处理html时用到,现在要用Javascript做后端,学习N...

    宋凯伦
  • 它来了它来了!您点播的MeterSphere来了!

    MeterSphere 是一站式的开源企业级持续测试平台, 涵盖测试跟踪、接口测试、性能测试、 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和...

    TestOps
  • 1/8 绪论

    $$ 语句频度=ΣΣΣ1=ΣΣj=Σi(i+1)/2 =n(n+1)(n+2)/6=O(n^3) $$

    ClancyCC
  • JavaScript(18)

    在JavaScript中,我们可以使用setInterval()方法来设置“重复性”调用的函数。其中clearInterval()可以用来取消执行setTime...

    Qwe7

扫码关注腾讯云开发者

领取腾讯云代金券