拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
摘要: 本文是JavaScript新特性系列的收官篇,揭秘TC39标准制定流程与提案的5个阶段(Stage 0-4),指出Stage 3+的特性可安全使用。回顾ES2022-2024核心特性(如top-level await、Array.at()等),并介绍ESNext提案(装饰器、Temporal等)。解析构建工具(Babel/SWC)如何通过编译和垫片实现新旧语法兼容,给出不同场景的升级策略。
文章目录
1. 引言
在这个系列的前九篇文章里,我们穿越了从 var 到 let/const、从回调到 async/await、从 Object 到 Map 的进化之路。
但很多同学可能会感到焦虑:“JS 更新太快了!今年出一个新特性,明年又出一个,我感觉永远学不完。”
其实,你不需要“追”着每一个特性跑。JavaScript 的进化是有规律的,它的背后有一个严谨的组织——TC39。
本文作为系列的收尾篇,不写具体的代码,而是想教你一套**“渔”**:
- JS 的新特性是怎么诞生的?
- 看到一个炫酷的“新语法”,怎么判断它能不能在生产环境用?
- 现代前端项目是如何通过工具链,让我们提前用上未来的?
2. 正文
2.1 揭秘 TC39 与提案流程
JavaScript 的标准叫 ECMAScript。负责制定这个标准的委员会叫 TC39(Technical Committee 39)。
每一个新特性的诞生,都要经历 5 个阶段,从“想法”到“标准”,就像打怪升级:
- Stage 0(Strawman):稻草人。有人提了一个想法(比如“我想在 JS 里加管道操作符”),这只是一个初步的提案。
- Stage 1(Proposal):提案。TC39 成员觉得这事儿靠谱,值得讨论。
- Stage 2(Draft):草案。初步确定了具体语法和语义描述。这个阶段的特性可能会变,不建议盲目使用。
- Stage 3(Candidate):候选。关键阶段! 语法已经定死,浏览器厂商开始实现这个功能。对于前端开发者来说,Stage 3 的特性通常是可以尝试使用的(通过 Babel 插件),但要注意后续微调。
- Stage 4(Finished):完成。正式标准! 这个特性将被加入到下一个发布的 ES 版本(如 ES2024)中。
结论:只有达到 Stage 4 的特性,才能被视为标准,建议在没有构建工具的生产环境(如静态 HTML)中使用。但在工程化项目中,我们常用 Stage 3 的特性。
2.2 近三年新特性巡礼(复习)
让我们快速复习一下最近几年进入 Stage 4/正式发布的关键特性,看看你都掌握了没:
- ES2022:
Top-level await:模块顶层可以直接await。- Class 字段声明:
class C { #x = 1; }。 Array.at():支持负索引arr.at(-1)。
- ES2023:
- 数组的非破坏性方法:
toSorted、toReversed(不改变原数组)。 findLast/findLastIndex:从后往前找。
- 数组的非破坏性方法:
- ES2024:
Object.groupBy:数组分组。Promise.withResolvers:更灵活的 Promise 控制。
- ESNext(正在路上的明星):
- Decorators:装饰器(Stage 3,React/Vue 开发者必关注)。
- Temporal:下一代日期时间 API(Stage 3,干掉 Moment.js 的希望)。
- Iterator Helpers:像数组方法一样操作迭代器(Stage 3)。
2.3 从提案到生产的策略
既然标准更新这么快,浏览器(尤其是旧浏览器)肯定跟不上。构建工具就是连接“未来 JS”和“现在浏览器”的桥梁。
1. 编译
使用 Babel 或 SWC,将 ES6+ 的代码转译成 ES5。
- 你可以在
babel.config.js里配置targets。 - 比如
"targets": "> 0.25%, not dead"意思是:支持市场份额超过 0.25% 的浏览器,排除那些已经停止更新的旧浏览器。 - 配置好后,Babel 会自动决定哪些特性需要转译,哪些特性(如
Promise)只需要引入polyfill。
2. 垫片
有些 API(如 Array.prototype.includes)是没法通过简单转语法实现的,必须在运行时加载一段代码来模拟。这就是 core-js 或 @babel/polyfill 做的事。
3. 升级策略
- 业务项目:追求稳定。建议配置为“Stage 4” 或 ES2020 规范。
- 库/组件开发:追求前沿。可以尝试 Stage 3 特性,但在文档里注明需要特定的 Babel 插件支持。
2.4 系列文章总结与学习路线
到这里,我们 “ES2015-ESNext 重要特性” 系列就全部结束了。让我们把这十篇内容串起来,形成一张完整的 “现代 JS 技能树”:
- 基础语法(地基):
- 变量:
let/const(篇 2) - 语法糖:解构、展开、模板字符串(篇 3、8)
- 类型:
BigInt、Symbol(篇 9)
- 变量:
- 逻辑控制(骨架):
- 流程:异步编程
Promise/async-await(篇 4) - 循环:
for...of、for...in、数组方法(篇 7)
- 流程:异步编程
- 组织架构(框架):
- 模块化:
ES Modules(篇 5) - 面向对象:
class、继承、私有属性(篇 6) - 数据结构:
Map、Set(篇 7)
- 模块化:
- 生态与未来(进化):
- 标准库:
Object、String、Array新增方法(篇 8、9) - 工程化:TC39 流程、构建工具(本篇)
- 标准库:
给不同水平的学习建议:
- 初级:熟练掌握篇 2、篇 3、篇 4,这是日常工作 80% 的内容。
- 中级:搞定篇 5、篇 6、篇 7,能独立开发复杂模块,不再畏惧异步和类。
- 高级:精通篇 8、篇 9,并关注 TC39 提案,具备技术选型和性能优化能力。
3. 常见问题 (FAQ)
Q1:我学完这个系列,是不是就不用学 TypeScript 了?
A: 不是!JS 的标准在演进,TS 的标准也在演进。TS 不仅提供了类型,还支持一些 JS 还没定稿的新特性(通过 experimentalDecorators 等)。本系列打好了 JS 基础,学 TS 会如虎添翼。
Q2:Babel 现在还必须装吗?现在 Vite 不是很火吗?
A: Vite 底层开发环境用 esbuild(Go 写的超快编译器),生产环境打包用 Rollup。但它们依然需要处理语法转换。虽然 Babel 变慢了,但它对 Stage 3 提案的支持和 Polyfill 的能力依然不可替代。很多 Vite 项目依然会配合 @vitejs/plugin-react 和 @babel/core 使用。
Q3:Node.js 环境下,要不要用 Babel?
A: 现在的企业级 Node.js 项目(如 NestJS、Koa),通常运行环境可控(比如指定用 Node 18)。Node 18 支持绝大部分 ES2022 特性,通常不需要全量 Babel,只有当你要用顶级实验特性或需要兼容旧 Node 版本时才需要。
4. 总结
在这个系列中,我们见证了 JavaScript 从一个“简单的脚本玩具”成长为一门“成熟的工程语言”。
- 语法:
let/const、解构、箭头函数让代码更纯粹。 - 能力:
Promise、Class、Modules让逻辑更严谨。 - 生态:
Map/Set、Iterators、Intl让功能更强大。
技术永远在变,但底层原理是相通的。理解了 TC39 的流程,理解了异步与模块的本质,无论未来是 ES2025 还是 ES2030,你都能从容应对。
最后,感谢你跟随这个系列学习到第十篇。
如果觉得本系列对你有帮助,请点赞👍、收藏⭐、关注👀,你的支持是我持续输出的动力!
有问题欢迎在评论区留言:你准备在下一个项目里尝试哪个新特性?
更多推荐


所有评论(0)