背景

  babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安,最近花了点时间整理了一下,分享给大伙。

babel常用配置

通常在前端或node项目中,进行以下配置:

入口文件app.babel.js里面配置:
 

// babel
require('babel-core/register')({
presets: ['es2015', 'stage-0']
});
require('babel-polyfill'); require('./app.js');
 
.babelrc文件中的设置:

{
"presets": ["es2015", "stage-0"]
}

babel基础概念

1.babel-core

  新的js语法之前是不存在的,需要将js代码分析抽象的语法树 ,方便各个插件分析语法进行相应的处理成低版本的js;

2.babel-register

  改写了require命令,会对.js、jsx、.es、es6 后缀的模块都会先转码,但并不会对当前文件进行转码;由于该转码是实时的,所以不能用在生产环境中。

3.babelrc文件

  babel-core只是生成了语法树,并没有转码,转码工作由插件完成。自从babel升级到6.x之后,babel的插件都是可以插拔的,只有设置了相应的插件,babel才能知道如何处理js代码。
  .babelrc主要对presets、plugins进行设置,其中presets主要是一套预设置的插件,如es-2015、stage-0等,plugins可以让用户选取需要的单个插件。

  目前babel提供了几个官方的preset,主要包括:env  es2015 es2016 es2017 flow latest react 。设置presets的时候需要提前npm安装相应的插件,插件名格式:babel-preset-xxx;如下:

{   "presets": ["es2015"] }

npm install babel-preset-es2015

  

  如果不需要一套plugins的预设置,可以通过plugins属性引入所需的plugin,比如以下的设置就会引入编译class函数的功能。
 
{   "plugins": ["transform-es2015-classes"] }

  

  需要注意的是,某些插件是不被presets预置的,如常用的transform-runtime插件和transform-remove-console插件。
 
  关于presets和plugins的优先顺序一般遵从3个原则:
  • plugins优先于presets进行编译。
  • plugins按照数组的index增序(从数组第一个到最后一个)进行编译。
  • presets按照数组的index倒序(从数组最后一个到第一个)进行编译。
  • 详细信息可以查看官方文档

4.babel-polyfill

  polyfill拥有自定义的regenerator runtime 和core-js;它模拟了ES2015的环境,一般使用在应用程序中,而不是当做库和工具使用;比如说babel-node中自带了babel-polyfill,babel-polyfill为node提供了ES6的REPL环境。REPL,即read-eval-print-loop交互式解释器。详情可参考阮老师的文章
  babel几乎能翻译所有的js新语法,但是对于APIs却并非如此,如新增对象Promise、Set、Map等,静态方法Object.assign等,这就需要创造一个ES6的运行环境。
可以通过babel-polyfill来转码新API,其实现办法就是向全局变量上挂新增的对象或在原型链上增加方法,如在node环境下将Promise挂在global对象上。缺点就是污染全局变量。
  还有一个避免全局污染的方法就是使用babel-runtime + babel-plugins-runtime-transform;babel-runtime 更像是分散的polyfill 模块,我们可以在自己的模块里单独引入,比如 require(‘babel-runtime/core-js/promise’) ,它们不会在全局环境添加未实现的方法,只是这样手动引用每个 polyfill 会非常麻烦。我们借助 Runtime transform 插件来自动化处理这一切。

webpack中如何使用babel

1.使用babel-runtime

需要安装babel-runtime和babel-plugin-transform-runtime
 
module: {
loaders: [{
loader: 'babel',
test: /\.js/,
include: path.join(__dirname, 'src'),
query: {
plugins: ['transform-runtime'],
presets: [ 'es2015', 'stage-0'],
}}]
}
 

2.使用babel-polyfi

将babel-polyfill放在入口设置处
entry: [ 'babel-polyfill','src/index.js', ],
module: {
loaders: [{
loader: 'babel',
test: /\.js/,
include: path.join(__dirname, 'src'),
query: {
presets: ['es2015', 'stage-0']
}}]
}

  

参考资料:

babel入门基础的更多相关文章

  1. [转] babel入门基础

    背景 babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安 ...

  2. ReactJS入门基础

    渲染这俩字可能在很多地方都见过.但可能不太理解是啥意思. 那么首先我们来理解一下渲染. 渲染 我觉得这样理解比较通俗. 我们做一个汽车,开始是没有喷漆的(没有css) 只是些框框架架(HTML标签). ...

  3. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  4. 01shell入门基础

    01shell入门基础 为什么学习和使用shell编程 shell是一种脚本语言,脚本语言是相对于编译语言而言的.脚本语言不需要编译,由解释器读取程序并且执行其中的语句,而编译语言需要编译成可执行代码 ...

  5. Markdown入门基础

    // Markdown入门基础 最近准备开始强迫自己写博文,以治疗严重的拖延症,再不治疗就“病入骨髓,司命之所属,无奈何”了啊.正所谓“工欲善其事,必先利其器”,于是乎在写博文前,博主特地研究了下博文 ...

  6. JavaScript入门基础

    JavaScript基本语法 1.运算符 运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=).算术运 ...

  7. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  8. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  9. Linux shell入门基础(六)

    六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...

随机推荐

  1. HDU5914

    Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. HDU4403(暴搜)

    A very hard Aoshu problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  3. 图论——Dijkstra算法

    图论其实是比较难的一种题型,但是一些模板题,是没有什么太大难度的! 这里给大家带来的是迪杰斯特拉(Dijkstra)算法. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄 ...

  4. asp.net权限认证篇外:集成域账号登录

    在之前的我们已经讲过asp.net权限认证:Windows认证,现在我们来讲讲域账号登录, 这不是同一件事哦,windows认证更多的是对资源访问的一种权限管控,而域账号登录更多的是针对用户登录的认证 ...

  5. SQLSERVER 中实现类似Mysql的 INSERT ON DUPLICATE KEY UPDATE

    通过SQLServer创建索引时,有一个IGNORE_DUP_KEY的选项,可以类似实现. IGNORE_DUP_KEY = { ON | OFF } 指定对唯一聚集索引或唯一非聚集索引执行多行插入操 ...

  6. css实现页面居中的一种方法

    在网页制作的过程中,为方便读者的阅读,会把网页内容限定在一个较小的方框中,并居中显示,如何实现这一功能呢? 1)把正文放在一个<div>标签中,只要这个标签居中整个网页就居中了. < ...

  7. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  8. ElasticSearch5集群部署指南

    本文简要介绍ES5版本集群部署时的要点. 更多相关信息请参阅官网. 部分配置未在生产环境体现. 生产中2个集群20台centOS,总数据15TB,90亿条. 实时写入5000条/s, 最大7万/s. ...

  9. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  10. 如何用docker安装laravel开发环境

    如何用docker安装laravel开发环境 看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但 ...