Babel: plugin, preset的区别于使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Babel: plugin, preset的区别于使用相关的知识,希望对你有一定的参考价值。
参考技术A 1, "plugins": [ "transform-es2015-arrow-functions", "transform-es2015-template-literals" ]`npm bin`/babel --plugins transform-es2015-arrow-functions,transform-es2015-template-literals index.js
如果没有预设,babel转化是需要指定用什么插件的,颗粒度小,效率高,但是插件需要逐个安装(babel 官方拆成了20+个插件)。
2, 为了解决插件依赖的问题,采用了Babel Preset。(Babel Preset视为Babel Plugin的集合, 比如babel-preset-es2015包含所有跟ES6转换有关的插件)
`npm bin`/babel --presets es2015 index.js
多个Plugin和Preset时执行顺序非常重要
1,先执行完所有Plugin,再执行Preset。
2,多个Plugin,按照声明次序顺序执行。
3,多个Preset,按照声明次序逆序执行。
eg: "plugins": [ "transform-react-jsx", "transform-async-to-generator" ], "presets": [ "es2015", "es2016" ]
"presets": [ "./mypreset.js" ]
// mypreset.js
module.exports = presets: [ require("babel-preset-es2015"), ], plugins: [ require("babel-plugin-transform-react-jsx"), ] ;
"presets": [ presetName01, // 没有配置 [ presetName02, presetOptions02 ] // 有配置 ]
eg: "presets": [ ["es2015", "loose": true, "modules": false ] ]
1,babel-preset-env 是一个新的 preset,可以根据配置的目标运行环境(environment)自动启用需要的 babel 插件。
babel-preset-es2015(转换为es5)、babel-preset-es2016(转化为es6)、babel-preset-es2017(转化为es7)、babel-preset-latest(转化最新stage4进度)
2,插件越来越多,效率变慢,浏览器升级,提出了 babel-preset-env, 默认配置的情况下,它跟 babel-preset-latest 是等同的,会加载从es2015开始的所有preset。
Eg: "presets": [ "env" ] ==== "presets": [ “latest" ]
Eg: 针对node环境 "presets": [ ["env", "targets": "node": "8.9.3" ] ]
Eg: 针对ie11 "presets": [ ["env", "targets": "browsers": "ie 11" ] ]
Eg: 针对Edge16 "presets": [ ["env", "targets": "browsers": "edge 16" ] ]
Eg: 针对Ie8+,chrome62+: "presets": [ ["env", "targets": "browsers": [ "ie >= 8", "chrome >= 62" ] ] ]
Eg: 服务端命令行编译:npm bin browserslist "ie >= 8, chrome >= 62”
3,env 原理
1、首先,检测浏览器对JS特性的支持程度,比如通过通过 compat-table 这样的外部数据。
2、将 JS特性 跟 特定的babel插件 建立映射,映射关系可以参考 这里 。
3、stage-x 的插件不包括在内。
4、根据开发者的配置项,确定至少需要包含哪些插件。比如声明了需要支持 IE8+、chrome62+,那么,所有IE8+需要的插件都会被包含进去。
Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法
1、为什么会报错 ?
这里抱着错误是因为 babel 的版本冲突。
多是因为你的 babel 依赖包不兼容。
可以查看你的 package.json 的依赖列表
即有 babel 7.0 版本的( @babel/core , @babel/preset-react )
也可命令查看 bebel-cli 的版本 ( babel -V )
也有 babel 6.0 版本的 ( [email protected] , [email protected] , [email protected] )
如果在你的 package.json 依赖包中既有 babel 7.0 版本,又有 babel 6.0 版本,就会报这个错误
很现实就是两个版本是不兼容的
2、处理方法
1、升级到 babel 7.0
将所有有关 babel 的包都升级为 7.0 版本
1
2
3
4
5
6
|
"@babel/core" : "^7.0.0-beta.40" , "@babel/cli" : "^7.0.0-beta.40" , "babel-loader" : "^8.0.0-beta.0" , "babel-plugin-lodash" : "^3.3.2" , "babel-plugin-react-transform" : "^3.0.0" , "@babel/preset-react" : "^7.0.0-beta.40" ,<br> "@babel/preset-stage-0" : ‘^7.0.0‘ |
并且修改 .babelrc 文件
对应的修改 presets 预设和 plugins 都改为 7.0 形式。
1
2
3
4
|
query: { presets: [ ‘@babel/react‘ , ‘@babel/stage-0‘ ], plugins: [ ‘‘ ] } |
2、降级到 babel 6.0 版本
有时候我们看们的 package.json 里面都是 babel 6.0 版本的。
如下:
1
2
3
4
5
|
"babel-core" : "^6.26.0" , "babel-loader" : "^7.1.2" , "babel-plugin-transform-runtime" : "^6.23.0" , "babel-preset-env" : "^1.6.1" , "babel-preset-stage-0" : "^6.24.1" , |
但是还是报错,为什么呢?
你不妨把 node_modules 删掉,重新 install ,这样就可以处理一部分兼容问题
如果上面的方法还是不行。
你可以查看一下 babel-cli 的版本
1
|
babel -V |
如果是 babel-cli 7.0 版本。
那你就重新安装全局和本地的 babel-cli 版本为 6.0
1
2
3
|
基本上面两个方法可以解决所有兼容问题。
以上是关于Babel: plugin, preset的区别于使用的主要内容,如果未能解决你的问题,请参考以下文章
Babel 插件 transform-remove-console 不适用于 Vue CLI 4 @vue/cli-plugin-babel/preset?
babel-preset-es2015,babel-polyfill 与 babel-plugin-transform-runtime
如何写好.babelrc?Babel的presets和plugins配置解析
Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法
babel版本兼容报错处理:Plugin/Preset files are not allowed to export objects