.babelrc配置详解

如何写好.babelrc?Babel的presets和plugins配置解析

什么是Babel

The compiler for writing next generation JavaScript.

官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器。

作为前端开发,由于浏览器的版本和兼容性问题,很多JavaScript的新的方法都不能使用,等到可以大胆使用的时候,可能已经过去了好几年。Babel就因此而生,它可以让你放心使用大部分的JavaScript的新的标准的方法,然后编译成兼容绝大多数的主流浏览器的代码。

在升级到了Babel6.x版本之后,所有的插件都是可插拔的。这也意味着你安装了Babel之后,是不能工作的,需要配置对应的.babelrc文件才能发挥完整的作用。下面就对Babel的presets和plugins配置做一个简单解析。

所有配置根据官方文档提供,更新时间:2016-12-05。

预设(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\ style="box-sizing: border-box;"> | string,默认[]</string>

浏览器列表,使用的是browserslist,可选例如:last 2 versions, > 5%。

loose: boolean,默认false

是否使用宽松模式,如果设置为true,plugins里的插件如果允许,都会采用宽松模式。

debug: boolean,默认false

编译是否会去掉console.log。

whitelist: Array<string\ style="box-sizing: border-box;">,默认[]</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

使用babel的helper函数。

polyfill: boolean,默认true

使用babel的polyfill,但是不能完全取代babel-polyfill。

regenerator: boolean,默认true

使用babel的regenerator。

moduleName: string,默认babel-runtime

使用对应module处理。

这里的options一般不用自己设置,用默认的即可。这个插件最大的作用主要有几下几点:

  • 解决编译中产生的重复的工具函数,减小代码体积
  • 非实例方法的poly-fill,如Object.assign,但是实例方法不支持,如"foobar".includes("foo"),这时候需要单独引入babel-polyfill

更多细节参见文档

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

这是我写了半天发现比较推荐的配置(真的是太简单了,还花了这么久去看文档)。强烈推荐使用transform-runtime

当然,如果你的项目需要react或者flow这些语法的编译,请在presets里加入对应的值即可。如果你需要非实例方法"foobar".includes("foo")之类的方法,按需引入babel-polyfill。

本文主要给大家介绍的是关于es7 Decorators(修饰器)的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

ES6 Decorators(修饰器)

修饰器(Decorator)是一个函数,用来修改类的行为。这是ES7的一个提案,目前Babel转码器已经支持

我们在游戏大型项目种经常会用到的方法,现在es6直接支持

想要使用Decorator的话需要我们配置一下文件夹,配置一下环境

npm install babel-plugin-transform-decorators-legacy --save-dev

完事配置一下babelrc文件
"plugins": ["transform-decorators-legacy"]

先说一下装饰器的特点

装饰器本质是一个函数

@hometown hometown()

装饰对象可以使用多个装饰器

@hometown("山西")

@school

class Student{

constructor(name){

this.name=name;

}

@studyke("HTML")

study(){

console.log(this.name+" is studying"+this.ke+"!")

}

}

装饰器可以带参数

function hometown(diqu){

//target.home="广灵";

return function (target){`

target.home=diqu;

}

}

@hometown("山西")

class...

装饰器修饰 类

function school(target){

console.log("123")

target.schoolName="师徒课堂";

}

function hometown(diqu){

//target.home="广灵";

return function(target){

target.home=diqu;

}

}

function studyke(kemu){

return function(target){

target.ke=kemu;

}

}

@hometown("山西")
@school
class Student{

constructor(name){

this.name=name;

}

@studyke("HTML")

study(){

console.log(this.name+" is studying"+this.ke+"!")

}

}

console.log(Student.schoolName);

console.log(Student.home);

let l=new Student("xiaoA");

l.study();

@school

function Teacher(){

}

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容