陈随易:Node.js v22更新记录

大家好,我是前端之虎陈随易。

目前是:

  • 农村程序员 (自 2020 年离职至今都在农村待着)
  • 独立开发者 (有多个已经在盈利中的产品)
  • 自由职业者 (睡到自然醒,困就马上睡)
  • 个人创业者 (注册了自己的公司,为产品服务)
  • 自驾爱好者 (经常自驾,边看风景边敲码)
  • 小说写作者 (抽空码字中)
  • 开源推进者 (自 2019 年持续开源至今)

欢迎跟我交朋友:

让我们一起积极向上,为自己而努力奋斗!

正文

2024年04月25日,Node.js v22 版本正式发布了,让我们来看看这个版本的更新内容吧~

ESM:放弃对导入断言的支持

用过 assets 没?它的写法是这样的。

javascript 复制代码
import data from './data.json' assert { type: 'json' };

使用 asset 来指定导入资源的类型。

那么在 CommonJS 时代,导入 js 和导入 json 都不用特意区分的。

javascript 复制代码
const data = require('./data.json');

本次的 Node.js v22 版本发布后,asset 被废弃了。

那么我要使用 import 导入 json 文件,该怎么做呢?

其实很简单,把 assets 换成 with 即可。

javascript 复制代码
import data from './data.json' with { type: 'json' };

Chrome 浏览器也将会在 v126 版本,讲 asset 语法移除,请大家注意,根据自身情况调整。

内置测试框架被标记为稳定

用一个图来说明下。

图片来源:@liran_tal

也就是说,v22 版本以前,你要做测试用例时需要安装红色部分的一大堆依赖。

这个版本以后,红色部分都可以删掉了,只需要图中 3 行绿色代码即可。

不得不说,Node.js 真是越来越好用了。

默认启用 WebSocket 客户端

v22 以前的版本

javascript 复制代码
console.log(WebSocket);

得到:

bash 复制代码
console.log(WebSocket);
            ^

ReferenceError: WebSocket is not defined
    at file:///D:/codes/yicode.tech/labs/test.js:1:13
    at ModuleJob.run (node:internal/modules/esm/module_job:222:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:323:24)
    at async loadESM (node:internal/process/esm_loader:28:7)
    at async handleMainPromise (node:internal/modules/run_main:113:12)

Node.js v20.12.1

v22 版本以后,得到:

bash 复制代码
[class WebSocket extends EventTarget] {
  CONNECTING: 0,
  OPEN: 1,
  CLOSING: 2,
  CLOSED: 3
}

require 可以导入 esm 模块了

官方的 ESM 规范发布以来,以前的语法 require 导入 esm 包的问题一直处于争论中。

那么 v22 版本后,这个问题已经解决了一部分,现在可以使用 require 去导入 esm 模块了。

esm 文件:

javascript 复制代码
// point.mjs
export function distance(a, b) {
    return (b.x - a.x) ** 2 + (b.y - a.y) ** 2;
}
class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}
export default Point;

require 导入 esm 文件:

javascript 复制代码
// main.js
const required = require('./point.mjs');
// [Module: null prototype] {
//   default: [class Point],
//   distance: [Function: distance]
// }
console.log(required);

(async () => {
    const imported = await import('./point.mjs');
    console.log(imported === required); // true
})();

fs 新增 glob 和 globSync 方法

难道是跟 Bun 学的?

在 v22 版本以前,我们要获取某个目录所有以 .js 结尾的文件,那么我们要么获取全部文件,然后遍历过滤。

要么使用第三方库,比如 fast-glob 处理。

那么在 v22 版本以后,可以直接使用 fs.globfs.globSync 来实现这个功能了。

javascript 复制代码
import { glob } from 'node:fs/promises';

for await (const entry of glob('**/*.js')) {
    console.log(entry);
}

Node.js 的一小步,好用了一大截。

随易总结

Node.js v22 版本的更新,真的是下血本了。

几个重要的,实验性的功能都标记为稳定版了。

期待 Node.js 越来越好。

相关推荐
ChalesXavier1 小时前
Fetch API 的基本用法
javascript
是上好佳佳佳呀2 小时前
【前端(十三)】JavaScript 数组与字符串笔记
前端·javascript·笔记
巴沟旮旯儿2 小时前
vite项目配置文件和打包
前端·设计模式
彩票管理中心秘书长2 小时前
Pinia 插件架构与组合式函数:如何让你的 Store 长出“超能力”
前端
彩票管理中心秘书长2 小时前
Pinia 比 Vuex 强在哪?我用同一个模块写了两种实现,你自己看
前端
yingyima2 小时前
用 Cron 加 Webhook 打通自动化工作的任督二脉
前端
JackieDYH2 小时前
CSS Flexbox 与 Grid 的默认行为-布局的底层机制
前端·css·html
彩票管理中心秘书长2 小时前
E2E测试入门:别让用户帮你点鼠标了,找个机器人替你打工吧
前端
菜蒙爱学习2 小时前
【Markdown】可用的所有 HTML 标准颜色
前端·html
里欧跑得慢2 小时前
CSS 嵌套:编写更优雅的样式代码
前端·css·flutter·web