You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"use strict";require("core-js/modules/es.function.name.js");function_classCallCheck(instance,Constructor){if(!(instanceinstanceofConstructor)){thrownewTypeError("Cannot call a class as a function");}}function_defineProperties(target,props){for(vari=0;i<props.length;i++){vardescriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"indescriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}function_createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);returnConstructor;}varAnimal=/*#__PURE__*/function(){functionAnimal(){_classCallCheck(this,Animal);}_createClass(Animal,[{key: "constractor",value: functionconstractor(name){this.name=name;}}]);returnAnimal;}();
常用插件
@babel/plugin-transform-runtime
此插件可以复用 Babel 注入的辅助代码以减少代码体积;另一个作用可以避免全局注入 polyfill,从而避免污染全局。
Babel 会使用很多辅助函数来帮助实现代码转换,比如下面示例中的
_extends
,这些函数统称为helpers
。默认情况下,每个文件顶部会添加当前文件中所需要的helpers
,如果存在多个文件,就可能重复添加相同的helper
,编译输出中就会重复打包这些函数导致包体积增大。@babel/plugin-transform-runtime
的作用就是将所有helpers
都从@babel/runtime
模块导入,从而避免在编译输出中出现重复。因此使用此插件还需要安装@babel/runtime
作为生产依赖被编译到构建中。使用
@babel/plugin-transform-runtime
后:@babel/plugin-transform-runtime
的另一个作用是避免 polyfill 全局污染。无论是导入core-js
或@babel/polyfill
(Babel 7.4.0 开始已废弃),polyfill 的行为如全局添加内置对象(如Promise
)、内置对象新增静态属性(如Array.from
)或实例属性(如[].includes
),这些都会导致全局污染。虽然这对于应用程序或命令行工具来说可能没问题,但如果作为一个库供别人使用,或者你无法完全控制其运行的环境,这就会带来问题。@babel/plugin-transform-runtime
后(插件参数选项"corejs": 3
,详见下面):@babel/runtime-corejs3
是core-js3
的运行时版本,转换器为其添加别名进行调用,从而无需使用 polyfill。插件参数选项:
corejs
指定
core-js
的 runtime 版本。Babel v7 中已经把 helper 与它在运行时的 polyfilling 行为分开了。false
表示@babel/runtime
(仅包含 helper),指定数字(2
或3
)表示core-js
的 runtime 版本(包含 helper + polyfill,如@babel/runtime-corejs2
)。此选项需要更改用于提供 runtime helpers 的依赖项:
false
:默认,即@babel/runtime
,仅包含 helpers。2
:即@babel/runtime-corejs2
,包含 helpers + polyfill(对应core-js v2
)。仅支持全局变量(如Promise
)和静态属性(如Array.from
)。3
:即@babel/runtime-corejs3
,包含 helpers + polyfill(对应core-js v3
)。支持全局变量和静态属性,还支持实例属性(如[].includes
)。更改此选项需要安装对应的生产依赖(
@babel/runtime | @babel/runtime-corejs2 | @babel/runtime-corejs3
),例如npm install --save @babel/runtime-corejs3
。而
@babel/plugin-transform-runtime
作为开发环境依赖始终都是需要安装的。regenerator
generator
函数是否转换为使用不污染全局范围的regenerator runtime
。常用预设(
presets
)@babel/preset-env
@babel/preset-env
是一个智能预设,指定目标环境后即可使用最新的 JavaScript 特性,它会去管理需要哪些插件(以及 polyfill)。它利用 browserslist、compat-table(ECMAScript 兼容性表)数据,维护了目标环境中各版本与 JavaScript 语法或浏览器功能支持的映射表,以及这些语法和功能需要哪些 Babel 转换插件和
core-js
polyfill 的映射表。所以只需要你设置目标环境,@babel/preset-env
就能找到所需的插件和 polyfill。它同时替代了
preset-es2015/es2016/es2017/latest
这几个预设,对于开发者而言,直接关注目标环境而无需关注特性属于哪一套标准更加简单。预设参数选项:
主要选项说明:
targets
项目支持的环境或目标环境。
可以设置为 browserslist-compatible 查询,或者是一个描述支持的最低环境版本对象。
推荐使用
browserslist
配置(使用.browserslistrc
文件或package.json#browserslist
字段),因为这样可与其他工具共享配置,如Autoprefixer
、postcss-preset-env
。但与 browserslist 行为不同的是,当在 Babel 或 browserslist 配置中找不到目标配置时,它不使用
defaults
查询。而会将所有ES2015+ 代码转换为 ES5(类似preset-latest
),这种方式不推荐使用,因为没有使用其针对特定环境/版本的能力,为了避免可以显示的声明defaults
👇:corejs
指定 core-js 版本。
core-js 是 JavaScript 的模块化标准库。包括 ECMAScript 到 2021 年的所有 polyfill(如 promises、symbols、ECMAScript 提案、一些跨平台的 WHATWG/W3C 特性和提案等),
@babel/preset-env
依赖它来注入 polyfill。此选项仅在与
useBuiltIns: usage
或useBuiltIns: entry
一起使用时才有效。默认情况下,只注入稳定 ECMAScript 功能的 polyfill,如果你想注入提案阶段的 polyfill,有三个不同的选项:
使用
useBuiltIns: "entry"
时,可以直接导入一个 proposal polyfill:import "core-js/proposals/string-replace-all"
。使用
useBuiltIns: "usage"
时,有两种选择:shippingProposals
选项设置为true
。这将为浏览器已支持的提案启用 polyfill 和转换。corejs: { version: "3.8", proposal: true }
。这将启用[email protected]
支持的每个提案的 polyfill。useBuiltIns
配置
@babel/preset-env
如何优化注入 polyfill。如果全量注入 polyfill (
import "core-js";
)将增加包体积,useBuiltIns
选项的作用就是对其进行优化。当
useBuiltIns: 'entry'
时:@babel/preset-env
将import "core-js";
和import "regenerator-runtime/runtime"
(提供generator
、async
、await
的 polyfill) 语句替换为只引入目标环境可能用到的 polyfill。如果你只需要知道只需要其中的一部分 polyfill 怎么办?
使用
core-js@3
时,@babel/preset-env
能够优化每个core-js
入口点及其组合。例如你只想填充数组方法和 Math 新提案:当
useBuiltIns: 'usage'
时:polyfill 会在需要时(目标环境不支持、当前文件中使用到的)自动导入。
@babel/preset-env
会在每个文件的开头引入需要的(目标环境不支持,当前文件中使用到)polyfill。shippedProposals
是否开启对处于提案中的且浏览器已经实现的内置对象/特性的支持。
你的目标环境已经有了对某提案特性的原生支持,则会开启对应的语法插件以支持解析器完成解析,而不会执行任何代码转换操作。注意这不会开启与@babel/preset-stage-3 相同的转换,因为提案在登陆浏览器之前还会继续更改。
loose
是否允许预设中包含的插件使用松散模式转换代码。
默认
false
,即使用正常模式(normal
)。Babel 中的很多插件都支持两种模式。松散模式产生更简单的 ES5 代码,而正常模式会尽可能遵循ES6 语义。建议不要使用松散模式,松散模式优缺点:
下面是一段源码两种模式下的转换结果对比:
正常模式(normal mode):
松散模式(loose mode):
其他选项查看这里。
@babel/preset-react
解析、转换 React JSX。
此预设包含的插件:
@babel/plugin-syntax-jsx
:解析 JSX。@babel/plugin-transform-react-jsx
:转换 JSX。@babel/plugin-transform-react-display-name
:添加displayName
。如var bar = createReactClass({});
转换为var bar = createReactClass({ displayName: "bar" });
启用
development
选项后,如果预设选项runtime
设置为classic
还将添加以下两个插件:@babel/plugin-transform-react-jsx-self
:在 JSX 元素添加__self
prop,React 将使用它来生成一些运行时警告。@babel/plugin-transform-react-jsx-source
:将源文件、行号和列号添加到 JSX 元素。预设参数选项:
主要参数选项说明:
runtime
classic
是旧的转换 jsx 的方式,存在一些缺陷,如必须React
环境,React.createElement
有一些无法做到的性能优化和简化。下面是
classic
、automatic
转换 JSX 对比:importSource
:替换默认的导入源。默认使用react/jsx-runtime
,若设置为"custom-jsx-library"
,则替换为custom-jsx-library/jsx-runtime
。useSpread
参考
The text was updated successfully, but these errors were encountered: