Babel presets stage
在一些新框架的代码中,常基于es6/7标准来书写代码。鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es3/5代码。
以.babelrc文件配置babel为例,presets预设编译规则(预设的编译插件集合)可以设置stage-0 至 stage-3, stage-0包含了stage-1 至 stage-3,也就是说如果设置为stage-0,stage-1 至 stage-3的编译功能默认都有了。
stage-0 至 stage-3代表了es标准支持的不同阶段。0阶段是最初级的阶段,可以理解为仅仅才开始讨论标准, 换句话说就是基本没有什么浏览器支持es新标准。3表示成熟阶段,意味着主流浏览器的新版本都支持大部分新标准,基础的es新标准特性不需要降级编译为es5,浏览器即可原生支持。
stage-3包括以下插件:
transform-async-to-generator 支持async/await
transform-exponentiation-operator 支持幂运算符语法糖,用两个**表示
stage-2包括stage-3的所有插件,额外还包括以下插件:
syntax-trailing-function-commas 支持尾逗号函数,额...很鸡肋
transform-object-reset-spread 支持对象的解构赋值
stage-1包括stage-2所有插件,额外还包括以下插件:
transform-class-constructor-call 支持class的构造函数
transform-class-properties 支持class的static成员(静态属性与静态方法)
transform-decorators 支持es7的装饰者模式即@,这其实是很有用的特性,对于HOC来说这是一个不错的语法糖
transform-export-extensions 支持export方法
stage-0包括stage-1所有插件,额外还包括以下插件:
transform-do-expressions 支持在jsx中书写if/else
transform-function-bind 支持::操作符来切换上下文,并且支持链式调用,作用类似于es5的bind
每个插件所支持的特性在代码上的具体体现可查看es6/7标准等详细资料,或babel官方站点,
Babel默认只转换新的JavaScript语法,但不会去转换新的 API ,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定在全局对象上定义的方法,例如:Object.assign等,这些都不会被转换。 默认不转码的 API 非常多,详情查看。
也就是当我们使用ES2015语法进行开发的时候,要去适配一些在ES2015定稿之前发行的浏览器,可能还需要使用到babel-polyfill,来保证上述提到的不被转换的API等都能够有ES3/5的支持,从而确保我们的项目在运行的时候不会因语法报错而白屏。

在实际配置babel presets stage的时候,可以根据业务要求、书写爱好、文件大小以及要兼容的浏览器及其版本来酌情设置。
对于babel的核心和其他插件,在实际项目开发中我们常用的到的还有:
babel-core
它是babel实现最基础代码转译功能的核心,用于将我们书写的高级EcmaScript语法转成AST语法抽象树,分发给不同的插件进行语法分析,进而转译成低级的EcmaScript语法。
babel-plugin-transform-runtime
这个插件的存在解决了polyfill引入而带来的全局变量污染和语法降级helper重复的问题。试想如果我们的项目不是全写在一个JS文件里,而是分散到不同的JS文件中去的,同一个高级EcamaScript语法可能在多个JS文件中被使用到,在降级转译高级语法的时候,会出现多个用于降级转译的helper,比如_extend、_defineProperty等,文件分散得越多,重复得可能性越大,最后转译出的静态资源也就越大,这是很可怕的。这个插件的存在就是为了解决这个问题,他提供了一个统一的文件来保存所有的helper,当每个JS文件被转译时,其所需的helper都从这个统一的文件中require,而不是自己申明一个,这样就避免了重复。并且它提供了一个沙盒环境用来限制一些新API的命名空间,防止全局变量出现污染,这对你在一个库或者一个工具里使用babel来说特别重要,你肯定不希望你的库或者工具分发给他人使用时,你的库中的变量直接污染了全局变量空间吧。当然如果只是我们在自己的项目应用中使用,这种污染是可以接受的。
babel-plugin-import
支持模块的按需加载,比如我们使用React和Antd作为MVVM的库和UI组件库。对于Antd提供的UI组件我们可能并非所有的组件都有用到,因为一次性引入整个Antd(包括js和css)对我们来说不是必要的,而我们又不愿意import一个组件很长的文件路径和对应的样式路径,对于我们来说直接 import {Button} from 'antd'; 才是最方便的。该插件即提供了这个功能,我们只需要这样写就行,babel会帮我们自动引入其关联的样式文件,而非整个Antd库。
还有其他的插件也有很大几率使用到,这取决于你的开发和测试需求,这里就不再过多讲解,在babel官网中会有相应介绍,有兴趣的同学可以自行查看。
另外的,在.babelrc文件中,我们一般需要配置plugins和presets,plugins的每个内容项为单独的一个插件,执行顺序从上到下。而presets里的每个内容项表示为实现某个功能的某些插件的集合,可能一个presets的配置项包含有多个插件,执行顺位为从下到上。总执行顺序为先执行plugins,在执行presets的内容。
Babel presets stage的更多相关文章
- babel presets stage-x
在一些新框架的代码中,常基于es6/7标准来书写代码.鉴于这些标准被没有被浏览器广泛支持,我们一般使用babel来将使用e6/7标准书写的代码降级编译(或者说转译)为浏览器可解析的es4/5代码. 以 ...
- babel ---- presets字段设定转码规则
presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装. # ES2015转码规则 $ npm install --save-dev babel-preset-es2015 # re ...
- babel plugin和presets是什么,怎么用?
https://www.fullstackreact.com/articles/what-are-babel-plugins-and-presets/ 当开发react或者vuejs app时,开发者 ...
- babel分析
现在都用 ES6 新语法以及 ES7 新特性来写应用了,但是浏览器和相关的环境还不能友好的支持,需要用到 Babel 转码器来转换成 ES5 的代码 相信大家都看到过如下的名词: babel-pres ...
- babel(一)
一.babel npm babel src/index.js -d lib 二.@babel/core @babel/cli @babel/core 转换语法核心 @babel/cli 执行 ...
- babel-preset-env: a preset that configures Babel for you
转载 babel-preset-env is a new preset that lets you specify an environment and automatically enables t ...
- 前端利器躬行记(2)——Babel
Babel是一个JavaScript编译器,不仅能将当前运行环境不支持的JavaScript语法(例如ES6.ES7等)编译成向下兼容的可用语法(例如ES3或ES5),这其中会涉及新语法的转换和缺失特 ...
- 【前端】在Gulp中使用Babel
Install $ npm install --save-dev gulp-babel babel-preset-es2015 用法1: const gulp = require('gulp'); c ...
- 何为babel / gulp
Babel主要用来将新版本的javascript(ES6,ES7)编译为ES5,目前它对于新标准的支持程度甚至高于Chrome浏览器.通过引入预设babel-preset-react,babel还能解 ...
随机推荐
- SSL/TLS抓包出现提示Ignored Unknown Record
SSL/TLS抓包出现提示Ignored Unknown Record 出现这种提示有两种情况.第一种,抓包迟了,部分SSL/TLS的协商数据没有获取,Wireshark无法识别和解析.第二种,数据包 ...
- 如何用python下载一张图片
如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...
- js计算发表的时间...分钟/小时以前/以后
网上找的都好复杂,这本来就是个粗略显示通俗的时间,绕来绕去都晕了 function timeAgo(o){ var n=new Date().getTime(); var f=n-o; var bs= ...
- vbs脚本实现自动打字祝福&搞笑
脚本祝福礼物 概述 听说抖音上流行一种用代码做程序表白的东西,,,, 当然我也不是要表白,,,, 但是好像蛮有意思的,,,, 于是,又学了一下vbs脚本,做了几个很不错的祝福脚本,不懂代码的可以直接戳 ...
- 不定高元素的高度transition动画实现
分析文档描述 CSS 支持动画的属性中的 height 属性如下: height :yes, as a length, percentage or calc() 即:当 height 的值是 leng ...
- 201771010126 王燕《面向对象程序设计(java)》第十一周学习总结
实验十一 集合 实验时间 2018-11-8 1.实验目的与要求 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: Vector类实现了长度可变的数组. Vecto ...
- layui 表格在排序之后没有重新渲染问题
问题描述: 在layui表格中,最后一列增加了操作按钮,并且在某些行设置了样式,但是在排序之后,按钮的点击事件失效了,样式也没有了,可能是没有执行done回调 原因: done回调只有在render和 ...
- unittest生产html测试报告
需要添加HTMLTestRunner.py文件,我用的ubuntu16.04下的python3.5.2,所以我放在/usr/lib/python3.5下 import unittest import ...
- C# 使用NPOI 处理Excel(Datable与Excel相互转换)
VS上有自带的程序集可以读取,但是总是会出现这样或那样的问题,让人恨得牙疼!而且效率太慢了.用NPOI就好多了,比较快,而且稳定,还简单,引用相应的程序集就好了. Excel转换成Datable pr ...
- 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)
散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...