-
Notifications
You must be signed in to change notification settings - Fork 1
build_babel
zen edited this page Feb 21, 2022
·
2 revisions
箭头函数已经被转成常规函数了。Babel 的转换的核心其实就是 plugin,按照配置文件里 plugins 配置的顺序执行。类似函数式编程中的 compose,假设我们有如下配置
module.exports = {
plugins: [
'plugina',
'pluginb',
'pluginc',
],
};
转换的逻辑相当于执行了
pluginc(pluginb(plugina(source)));
假设有 2 个文件都使用了 Class
src/a.js
class A {}
src/b.js
class B {}
Babel 配置
module.exports = {
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'usage',
corejs: 3,
},
],
],
};
目标环境 ie10 转换后的代码 lib/a.js
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var A = function A() {
_classCallCheck(this, A);
};
lib/b.js
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var B = function B() {
_classCallCheck(this, B);
};
很明显转换后的两个文件中 _classCallCheck 的定义是重复的,会导致打包的体积变大。这种样板代码可以通过 @babel/plugin-transform-runtime 解决。安装依赖
npm i @babel/plugin-transform-runtime @babel/runtime --save-dev
修改配置
module.exports = {
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'usage',
corejs: 3,
},
],
],
plugins: [
'@babel/plugin-transform-runtime',
],
};
转换后的代码
lib/a.js
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var A = function A() {
(0, _classCallCheck2["default"])(this, A);
};
lib/b.js
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var B = function B() {
(0, _classCallCheck2["default"])(this, B);
};
样板代码被转换成了 require 的方式,保证了引入的唯一。
Presets 就是 plugin 的默认集合。官方提供的 presets 中最重要的就是 env,默认已经包含了官方列举的 plugin 中的 ES3、ES5、ES2015~ES2021、Modules 等 plugin 集合。
🤸♀️🤸♂️🕘➡🏩🌪🕘🪐👨🦼👩🦼👋
- JS
- CSS
- HTML
- 前端工程化
- React
- Vue
- Webpack
- Nodejs
- 服务端
- 浏览器
- 算法
- 数据结构
- 设计思想
- 网络安全
- 其他
- 产品交互和设计
- 业务重构
- React 实践进阶