如何写好.babelrc?Babel的presets和plugins配置解析
什么是Babel
The compiler for writing next generation JavaScript.
官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器。
作为前端开发,由于浏览器的版本和兼容性问题,很多JavaScript的新的方法都不能使用,等到可以大胆使用的时候,可能已经过去了好几年。Babel就因此而生,它可以让你放心使用大部分的JavaScript的新的标准的方法,然后编译成兼容绝大多数的主流浏览器的代码。
在升级到了Babel6.x版本之后,所有的插件都是可插拔的。这也意味着你安装了Babel之后,是不能工作的,需要配置对应的.babelrc文件才能发挥完整的作用。下面就对Babel的presets和plugins配置做一个简单解析。
预设(presets)
使用的时候需要安装对应的插件,对应babel-preset-xxx,例如下面的配置,需要npm install babel-preset-es2015。
- {
- "presets": ["es2015"]
- }
env
- {
- "presets": ["env", options]
- }
最近新增的一个选项,有以下options选择。
targets: { [string]: number },默认{}
需要支持的环境,可选例如:chrome, edge, firefox, safari, ie, ios, node,甚至可以制定版本,如node: 6.5。也使用node: current代表使用当前的版本。
browsers: Array\<string\> | string,默认[]
浏览器列表,使用的是browserslist,可选例如:last 2 versions, > 5%。
loose: boolean,默认false
是否使用宽松模式,如果设置为true,plugins里的插件如果允许,都会采用宽松模式。
debug: boolean,默认false
编译是否会去掉console.log。
whitelist: Array\<string\>,默认[]
设置一直引入的plugins列表。
es2015/es2016/es2017/latest
- {
- "presets": ["es2015"]
- }
es2015
使用es2015的,也就是我们常说的es6的相关方法,简单翻译如下,更多细节可以参看文档。
- check-es2015-constants // 检验const常量是否被重新赋值
- transform-es2015-arrow-functions // 编译箭头函数
- transform-es2015-block-scoped-functions // 函数声明在作用域内
- transform-es2015-block-scoping // 编译const和let
- transform-es2015-classes // 编译class
- transform-es2015-computed-properties // 编译计算对象属性
- transform-es2015-destructuring // 编译解构赋值
- transform-es2015-duplicate-keys // 编译对象中重复的key,其实是转换成计算对象属性
- transform-es2015-for-of // 编译for...of
- transform-es2015-function-name // 将function.name语义应用于所有的function
- transform-es2015-literals // 编译整数(8进制/16进制)和unicode
- transform-es2015-modules-commonjs // 将modules编译成commonjs
- transform-es2015-object-super // 编译super
- transform-es2015-parameters // 编译参数,包括默认参数,不定参数和解构参数
- transform-es2015-shorthand-properties // 编译属性缩写
- transform-es2015-spread // 编译展开运算符
- transform-es2015-sticky-regex // 正则添加sticky属性
- transform-es2015-template-literals // 编译模版字符串
- transform-es2015-typeof-symbol // 编译Symbol类型
- transform-es2015-unicode-regex // 正则添加unicode模式
- transform-regenerator // 编译generator函数
总结:常用的都覆盖了,并不需要太关心内容,如果使用某些还不支持的语法导致报错,可以回头查一下支持的列表。
es2016
使用es2016的相关插件,也就是es7,更多细节可以参看文档。
- transform-exponentiation-operator // 编译幂运算符
es2017
使用es2017的相关插件,也就是es8?,更多细节可以参看文档。
- syntax-trailing-function-commas // function最后一个参数允许使用逗号
- transform-async-to-generator // 把async函数转化成generator函数
latest
latest是一个特殊的presets,包括了es2015,es2016,es2017的插件(目前为止,以后有es2018也会包括进去)。
react
react是一个比较特别的官方推荐的presets,大概是因为比较火吧。加入了flow,jsx等语法,具体可以看文档。
stage-x(stage-0/1/2/3/4)
stage-x和上面的es2015等有些类似,但是它是按照JavaScript的提案阶段区分的,一共有5个阶段。而数字越小,阶段越靠后,存在依赖关系。也就是说stage-0是包括stage-1的,以此类推。
stage-4
已完成的提案,与年度发布的release有关,包含2015年到明年正式发布的内容。例如,现在是2016年,stage-4应该是包括es2015,es2016,es2017。经过测试,babel-preset-stage-4这个npm包是不存在的,如果你单纯的需要stage-4的相关方法,需要引入es2015~es2017的presets。
stage-3
除了stage-4的内容,还包括以下插件,更多细节请看文档。
- transform-object-rest-spread // 编译对象的解构赋值和不定参数
- transform-async-generator-functions // 将async generator function和for await编译为es2015的generator。
stage-2
除了stage-3的内容,还包括以下插件,更多细节请看文档。
- transform-class-properties // 编译静态属性(es2015)和属性初始化语法声明的属性(es2016)。
stage-1
除了stage-2的内容,还包括以下插件,更多细节请看文档。
- transform-class-constructor-call // 编译class中的constructor,在Babel7中会被移除
- transform-export-extensions // 编译额外的exprt语法,如export * as ns from "mod";细节可以看这个
stage-0
除了stage-1的内容,还包括以下插件,更多细节请看文档。
- transform-do-expressions // 编译do表达式
- transform-function-bind // 编译bind运算符,也就是
::
插件(plugins)
其实看了上面的应该也明白了,presets,也就是一堆plugins的预设,起到方便的作用。如果你不采用presets,完全可以单独引入某个功能,比如以下的设置就会引入编译箭头函数的功能。
- {
- "plugins": ["transform-es2015-arrow-functions"]
- }
那么,还有一些方法是presets中不提供的,这时候就需要单独引入了,介绍几个常见的插件。
transform-runtime
- {
- "plugins": ["transform-runtime", options]
- }
主要有以下options选择。
helpers: boolean,默认true
boolean, 默认为 true。
是否切换将内联(inline)的 Babel helper(classCallCheck,extends 等)替换为对 moduleName 的调用(形式为var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
欲了解更多,请查阅 Helper aliasing。
polyfill: boolean,默认true
是否切换新的内置插件(Promise,Set,Map等)为使用非全局污染的 polyfill。
欲了解更多,请查阅 core-js aliasing。
regenerator: boolean,默认true
是否切换 generator 函数为不污染全局作用域的 regenerator 运行时。
欲了解更多,请查阅 Regenerator aliasing。
moduleName: string,默认babel-runtime
使用对应module处理。
string,默认为 "babel-runtime"。
当引入 helper 时,设置要使用的模块的名称/路径。
示例:
{
"moduleName": "flavortown/runtime"
}
import extends from 'flavortown/runtime/helpers/extends';
这里的options一般不用自己设置,用默认的即可。这个插件最大的作用主要有几下几点:
- 解决编译中产生的重复的工具函数,减小代码体积
- 非实例方法的poly-fill,如
Object.assign,但是实例方法不支持,如"foobar".includes("foo"),这时候需要单独引入babel-polyfill
更多细节参见文档。
为什么要使用Runtime transform
Babel 使用了非常小的 helpers 来实现诸如 _extend 等常用功能。默认情况下,它将被添加到每个通过 require 引用它的文件中。这种重复(操作)有时是不必要的,特别是当你的应用程序被拆分为多个文件时。
这时则需要使用 transform-runtime:所有的 helper 都会引用模块 babel-runtime,以避免编译输出的重复问题。这个运行时会被编译到你的构建版本当中。
这个转译器的另外一个目的就是为你的代码创建一个沙盒环境。如果你使用了 babel-polyfill,它提供了诸如 Promise,Set 以及 Map 之类的内置插件,这些将污染全局作用域。虽然这对于应用程序或命令行工具来说可能是好事,但如果你的代码打算发布为供其他人使用的库,或你无法完全控制代码运行的环境,则会成为问题。
转译器将这些内置插件起了别名 core-js,这样你就可以无缝的使用它们,并且无需使用 polyfill。
https://babeljs.cn/docs/plugins/transform-runtime/
transform-remove-console
- {
- "plugins": ["transform-remove-console"]
- }
使用这个插件,编译后的代码都会移除console.*,妈妈再也不用担心线上代码有多余的console.log了。当然很多时候,我们如果使用webpack,会在webpack中配置。
这也告诉我们,Babel不仅仅是编译代码的工具,还能对代码进行压缩,也许有一天,你不再需要代码压缩的插件了,因为你有了Babel!
自定义预设或插件
Babel支持自定义的预设(presets)或插件(plugins)。如果你的插件在npm上,可以直接采用这种方式"plugins": ["babel-plugin-myPlugin"],当然,你也可以缩写,它和"plugins": ["myPlugin"]是等价的。此外,你还可以采用本地的相对路径引入插件,比如"plugins": ["./node_modules/asdf/plugin"]。
presets同理。
plugins/presets排序
也许你会问,或者你没注意到,我帮你问了,plugins和presets编译,也许会有相同的功能,或者有联系的功能,按照怎么的顺序进行编译?答案是会按照一定的顺序。
- 具体而言,plugins优先于presets进行编译。
- plugins按照数组的index增序(从数组第一个到最后一个)进行编译。
- presets按照数组的index倒序(从数组最后一个到第一个)进行编译。因为作者认为大部分会把presets写成
["es2015", "stage-0"]。具体细节可以看这个。
总结
因为自己对.babelrc文件的设置有点疑问,花了大半天撸了下官方的文档。很多内容是英文的,可能翻译并不准确,希望大家多多指教。
- {
- "presets": [
- "es2015",
- "stage-0"
- ],
- "plugins": ["transform-runtime"]
- }
json
当然,如果你的项目需要react或者flow这些语法的编译,请在presets里加入对应的值即可。如果你需要非实例方法"foobar".includes("foo")之类的方法,按需引入babel-polyfill。
本文链接:https://excaliburhan.com/post/babel-preset-and-plugins.html
如何写好.babelrc?Babel的presets和plugins配置解析的更多相关文章
- [转] 如何写好.babelrc?Babel的presets和plugins配置解析
什么是Babel The compiler for writing next generation JavaScript. 官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器. 作为 ...
- .babelrc文件的一些简单的配置
首先现在根目录先生存.babelrc文件 这个文件是用来设置转码的规则和插件的 如果想使用es6语法,必须安装插件 npm install babel-preset-es2015 { "pr ...
- es6 babel转码器安装配置及常见命令
示例:在d盘,新建文件夹es6,文件夹里新建一个文件es6.js. (1)先全局安装babel-cli,输入命令npm install babel-cli -g (2)输入d:( 进入d盘),再输入c ...
- .babelrc和babel.config.js的相同配置不能合并
项目内部已经有了babel的配置文件babel.config.js module.exports = { presets: ["@vue/app"], }; 然后由于要按需引入el ...
- Babel配置中的presets、plugins、各个阶段stage的含义
什么是Babel Babel 官方文档: https://babeljs.io/ Babel 中文文档:https://www.babeljs.cn/ 我们知道各个浏览器对JavaScript版本的支 ...
- TOMCAT服务器不写端口号、不写项目名访问项目、虚拟目录配置
一.不写端口. 这个问题都被问烂了,因为TOMCAT默认的访问端口为8080,而TCP/IP协议默认80端口访问,大家之所以看到别的网站都不写端口号是因为人家用的的80端口访问的,而80端口因为的TC ...
- 《手写Mybatis》第5章:数据源的解析、创建和使用
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 管你吃几碗粉,有流量就行! 现在我们每天所接收的信息量越来越多,但很多的个人却没有多 ...
- babelrc 中的 presets 字段(env, react)和 plugins 字段(dynamic-import-webpack, transform-object-rest-spread, ...)
一.presets 字段 目前用到 presets: [ 'env', 'react' // react 转码规则 ]: 只有 env 时,作用和 latest 相同,包括 es5.es6.es7 ...
- babel的使用以及安装配置
简介 babel是一个广泛使用的转码器,可以将ES6代码转化为ES5代码,从而在现有环境执行,这意味着,你可以现在就用ES6编写程序,而不用担心现有环境是否支持. 安装及配置 npm install ...
随机推荐
- primary库新增数据文件后,standby库无法创建文件并终止数据同步
主库是RAC环境,使用asm存放数据文件,备库是操作系统本地文件系统存放数据文件.在主库执行以下操作: SQL> alter tablespace ysdv add datafile '+dat ...
- 适合初学者的python实际例子
最近在github上发现了一个有意思的项目,很适合初学者学习python代码. 学习一门语言刚开始的时候是很枯燥的,各种概念语法以及无聊的打印都会让人失去更进一步学习的动力. 很多同学在学习了一段时间 ...
- [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
(本文详情来源:android源码 http://www.eoeandroid.com/thread-296427-1-1.html 转载请注明出处!) [Android源码分享]飞鸽传书的An ...
- 第三部分:Android 应用程序接口指南---第二节:UI---第一章 用户界面和布局
第1章 用户界面和布局 应用程序的用户界面就是用户能看到并可以与它交互的任何东西.Android提供多种预置的UI组件,如结构化布局对象和允许你为应用程序创建图形用户界面的UI控件.Android也会 ...
- Atitit 数据融合merge功能v3新特性.docx
Atitit 数据融合merge功能v3新特性.docx 1.1. 版本历史1 1.2. 生成sql结果1 1.3. 使用范例1 1.4. 核心代码1 1.1. 版本历史 V2增加了replace部分 ...
- el表达式字符串与变量拼接
${empty navigationMenu.pageid? '':'&mpage='.concat(navigationMenu.pageid)}
- 业界常用的和不常用cad快捷键
AutoCAD 是目前世界各国工程设计人员的首选设计软件,简便易学.精确无误是AutoCAD成功的两个重要原因.AutoCAD提供的命令有很多,绘图时最常用的命令只有其中的百分之二十. 在CAD软件操 ...
- 【九天教您南方cass 9.1】 03 编码法绘制地形图
同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 测量空间的[九天教您南方cass]专栏是九天老师专门开设cass免费教学班.希望能帮助那些刚入行的同学,并 ...
- MAC /usr/local 文件夹权限问题
修改文件夹权限 sudo chown -R $(whoami) /usr/local/ 如果失败提示Operation not permitted 或其他权限不足,则需要关闭Rootless Root ...
- Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...