再看 Babel

简介: 说到 Babel 我会想到的一些关键词,语言特性、tc39、补丁、扩展和生态、慢,你会想到啥?

作者|云谦 Alibaba F2E  9月6日


image.png题图:tumbao1949 @ unsplash.com


1. 说到 Babel 我会想到的一些关键词,语言特性、tc39、补丁、扩展和生态、慢,你会想到啥?


2. Babel 的出发点是让开发者提前用上 ECMAScript 提案里的特性,除此之外,我们还用他来打补丁、实现 Code Mod、识别文件特征、约束和卡点、magic 功能比如 auto css modules 等


3. 语言特性都是 Babel 官方提供,由很多插件组成,这些特性归属不同的 Stage,从 Stage 0 到 3,preset-env 不包含 3 以下的语言特性,所以通常使用方式是 preset-env + 手选的 stage 3 以下特性


4. 语言特性又分两类,编译类和补丁类。前者比如 `[1, 2, 3].map(n => n + 1)` 只要编译成 `[1, 2, 3].map(function (n) { return n + 1 })` 就好, 后者比如 `[1, 2, 3].includes(1)` 的 includes 是需要给不支持的浏览器额外 `Array.prototype.includes` 补丁的,有些特性需要两者结合使用


5. 语言特性的编译会产生很多辅助代码,比如 `class {}` 会需要 inherits、setPrototypeOf、createSuper、getPrototypeOf、classCallCheck 等辅助函数,babel 的编译是文件级的,所以会产生大量的重复代码,解法是 plugin-transform-runtime + `@babel/runtime` 的组合,`@babel/runtime`  封装上述辅助函数,plugin-transform-runtime 让编译产物使用 `@babel/runtime`


6. plugin-transform-runtime 不要配 corejs 带上补丁,不管是项目还是组件。大家可以想想为什么,算是这篇文章留的一道题


7. 补丁方案 Babel 提供了两种,通过 targets 配置 + preset-env 的 useBuiltIns 配置实现,两种方案分别对应的是 entry 和 usage 值,前者会替换 core-js import 为特性列表,后者会按使用引入用到的特性列表


8. Babel 作为编译器不应该处理 modules 类型的转换,比如 esm 到 cjs 或 systemjs,这层处理应交给 Bundler,Bundler 通常还要依赖 esm 模块做 tree-shaking,所以 preset-env 里的 modules 是个废配置,始终设为 false 就好


9. 慢!是个大问题。影响的不仅有开发者的效率,还有工程化方案。如果不慢,node_modules 也走 babel 编译,那很多问题根本不存在。比如补丁方案可以切到 usage 按需打,整体尺寸会更小;比如部分依赖没有用 es5 语法导致的 ie11 兼容问题;比如组件发布可以用 ts 写不用编译直接发布。这给 swc 等竞对方案留了很多可能性。


10. 生态很好,却没啥可用的。最后一条本想推荐一些三方插件,翻了下发现并没有啥,目前在 umi 在用的有 import、macros、svgr-webpack 和 named-asset-import。因为很多 Babel 能做的在 Bundler 层也能做而且更合理,Babel 覆盖范围只有项目代码,Bundler 层覆盖整个产物,像 remove-console 这种在 Bundler 层做就更合理。

相关文章
|
9月前
|
人工智能 Serverless
解决方案 | 函数计算玩转 AI 大模型评测获奖名单公布!
解决方案 | 函数计算玩转 AI 大模型评测获奖名单公布!
179 7
|
9月前
|
存储 算法 编译器
【C语言】register 关键字详解
`register` 关键字是C语言中的一种存储类修饰符,它用于提示编译器将变量存储在CPU寄存器中,而不是在内存中。这种做法旨在提高变量访问的速度,因为访问寄存器比访问内存快得多。
272 1
|
9月前
|
存储 数据挖掘
服务器数据恢复—ZFS文件系统下数据恢复案例
服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操作、断电、进水和其他机房不稳定因素。管理员重启服务器存储,系统无法进入,需要恢复服务器存储中的数据。
|
网络性能优化
第4章 数据链路层练习题答案(第三版)
第4章 数据链路层练习题答案(第三版)
372 0
|
NoSQL Linux 数据安全/隐私保护
轻松搭建Neo4j图数据库:一步步教你在Docker上安装Neo4j Community Server
轻松搭建Neo4j图数据库:一步步教你在Docker上安装Neo4j Community Server
|
存储 算法 关系型数据库
PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem
PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem
3715 1
|
JavaScript
js 找出两个数组中不同元素和相同元素的几种方法
js 找出两个数组中不同元素和相同元素的几种方法
|
监控 流计算 C++
公有云小白的大模型实践-ChatGLM on PAI
公有云小白的大模型实践-ChatGLM on PAI
1438 0
|
5G 存储 人工智能
带你读《智慧光网络:关键技术、应用实践和未来演进》——1.4 光网络演变趋势
带你读《智慧光网络:关键技术、应用实践和未来演进》——1.4 光网络演变趋势
|
编解码 前端开发 JavaScript
Cloudflare Workers 和微前端:为彼此而生
Cloudflare Workers 和微前端:为彼此而生
487 0