1. 引言

JavaScript 的进化从来就没有停止过。在上一篇文章中,我们回顾了 ES2024。其实,TC39 委员会已经早早锁定了 ES2025 的一部分特性。

以前,我们总说“JS 只是脚本语言”,不适合做高性能计算或底层系统。但随着 ES2025 候选特性的落地,JS 正在补齐最后两块短板:

  1. 原生资源加载能力:直接安全地导入 JSON、CSS 等非 JS 文件。
  2. 内存管理能力:零拷贝的内存转移,大幅提升处理二进制数据的性能。

本文带你提前“剧透” ES2025 最值得关注的硬核特性。


2. 正文

2.1 Import Attributes —— 安全地导入非 JS 资源

以前,如果你想在 ES Module 中导入一个 JSON 文件,你会怎么做?
要么只能用 require(Node.js 独有),要么用 Webpack 的 Loader。
ES2020 曾引入过 import assert 语法,但它有一个严重的安全隐患,最终被废弃,取而代之的就是 Import Attributes(导入属性)

1. 语法变化

  • 旧写法(已废弃)import data from "./config.json" assert { type: "json" };
  • 新写法(ES2025)import data from "./config.json" with { type: "json" };

2. 核心作用
with 关键字告诉浏览器或 Node.js:“我正在导入的这个文件,是一个 JSON 格式的文件,请按 JSON 解析它。”

这使得浏览器原生支持加载 JSON 模块,不再依赖打包工具。

// app.js
import config from "./config.json" with { type: "json" };

console.log(config.apiKey); // 直接拿到对象

未来展望
除了 JSON,未来还可能支持 CSS 模块(with { type: "css" }),让 JS 能够直接引入样式表进行操作,极大丰富模块化生态。

2.2 ArrayBuffer.prototype.transfer —— 零拷贝的“内存转移”

这是一个性能炸裂的特性。

在 Web 开发中,经常涉及处理二进制数据(如视频流、WebSocket 大包、WebAssembly 内存)。当你想把一个 ArrayBuffer 的数据从一个地方搬到另一个地方,或者转移控制权给另一个 Worker 线程时,以前必须拷贝数据。

问题:拷贝 100MB 的数据意味着 CPU 要复制 1亿次数据,既耗时间又占双倍内存。

ES2025 解决方案transfer()
它直接把内存的所有权转手,数据本身留在内存里一动不动。这就像寄快递,不是把房子搬走,而是把房产证交出去。

// 创建一个 1000 字节的 buffer
const oldBuffer = new ArrayBuffer(1000);
console.log(oldBuffer.byteLength); // 1000

// 转移所有权!
const newBuffer = oldBuffer.transfer();

// 检查旧 buffer
console.log(oldBuffer.byteLength); // 0 (它已经“死”了,不能用了)
console.log(newBuffer.byteLength); // 1000 (数据都在这里)

应用场景

  • OffscreenCanvas / Web Worker:将渲染后的图像缓冲区直接转移给主线程显示,延迟极低。
  • 文件处理:在读取大文件片段时,指针挪动比数据复制快得多。

此外还有 transferToFixedLength(),可以将缓冲区大小固定或裁剪,常用于内存回收和优化。

2.3 Atomics.waitAsync —— 不阻塞的线程等待

Atomics 对象通常用于多线程编程。以前 Atomics.wait 是阻塞式的,会让当前的 Worker 线程“睡死”过去,直到被唤醒。这在主线程是严格禁止的(会卡死页面)。

ES2025 引入的 waitAsync 允许线程异步等待,返回一个 Promise。

// Worker 线程中
const res = await Atomics.waitAsync(sab, 0, 0);
if (res.async) {
    console.log("等待中..."); // 不阻塞线程做别的事
}

这对于编写高性能的并发 JS 应用至关重要。


3. 常见问题 (FAQ)

Q1:import ... with 现在能在 Chrome 里跑吗?
A: 需要 Chrome 123+ 或 Edge 123+。Node.js 需要开启 flag 或使用较新版本。如果生产环境要兼容旧浏览器,目前依然需要 Babel 插件或构建工具来处理 JSON 导入。

Q2:oldBuffer.transfer() 之后,旧 buffer 怎么样了?
A: 旧 buffer 被“分离”了。它的 byteLength 变为 0。如果尝试再访问它,会报错:TypeError: Cannot perform Construct on a detached ArrayBuffer。这就像你把房子卖了,之前的钥匙就作废了。

Q3:ES2025 有什么关于“正则”的新特性吗?
A: 大部分正则增强在 ES2018-ES2024 已经完成了(如 s flag, v flag)。ES2025 更多聚焦于底层能力(如 Import Attributes, ArrayBuffer, Atomics)。


4. 总结

作为系列的额外篇章,我们看到 JavaScript 正在向两个方向进化:

  1. 更原生:通过 Import Attributes,不再依赖打包工具就能处理 JSON 等资源,让浏览器更强大。
  2. 更底层:通过 ArrayBuffer TransferAtomics,让 JS 真正具备了处理高性能、多线程任务的能力。

给开发者的建议

如果你做的是业务 CRUD 系统,这些特性暂时只需了解。但如果你涉足 音视频处理、WebAssembly、高性能可视化,ES2025 的这些特性将是你的神兵利器。

至此,我们关于 ES2015 到 ESNext 系列的内容真的全部结束了。从基础语法到底层内存,希望你现在的 JS 知识图谱已经完整!


如果觉得本文对你有帮助,请点赞👍、收藏⭐、关注👀,三连支持一下!

有问题欢迎在评论区留言:你最期待 JS 哪个方面的性能提升?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐