Babel 入门教程学习笔记


Posted in Javascript onJune 13, 2018

Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。

Babel 入门教程学习笔记

这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持。下面是一个例子。

// 转码前
input.map(item => item + 1);

// 转码后
input.map(function (item) {
 return item + 1;
});

上面的原始代码用了箭头函数,这个特性还没有得到广泛支持,Babel将其转为普通函数,就能在现有的JavaScript环境执行了。

一、配置文件.babelrc

Babel的配置文件是.babelrc,存放在项目的根目录下。使用Babel的第一步,就是配置这个文件。

该文件用来设置转码规则和插件,基本格式如下。

{
 "presets": [],
 "plugins": []
}

presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。

# ES2015转码规则
$ npm install --save-dev babel-preset-es2015

# react转码规则
$ npm install --save-dev babel-preset-react

# ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3

然后,将这些规则加入.babelrc

{
  "presets": [
   "es2015",
   "react",
   "stage-2"
  ],
  "plugins": []
 }

注意,以下所有Babel工具和模块的使用,都必须先写好.babelrc

二、命令行转码babel-cli

Babel提供babel-cli工具,用于命令行转码。

它的安装命令如下。

$ npm install --global babel-cli

基本用法如下。

# 转码结果输出到标准输出
$ babel example.js

# 转码结果写入一个文件
# --out-file 或 -o 参数指定输出文件
$ babel example.js --out-file compiled.js
# 或者
$ babel example.js -o compiled.js

# 整个目录转码
# --out-dir 或 -d 参数指定输出目录
$ babel src --out-dir lib
# 或者
$ babel src -d lib

# -s 参数生成source map文件
$ babel src -d lib -s

上面代码是在全局环境下,进行Babel转码。这意味着,如果项目要运行,全局环境必须有Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支持不同项目使用不同版本的Babel。

一个解决办法是将babel-cli安装在项目之中。

# 安装
$ npm install --save-dev babel-cli

然后,改写package.json。

{
 // ...
 "devDependencies": {
  "babel-cli": "^6.0.0"
 },
 "scripts": {
  "build": "babel src -d lib"
 },
}

转码的时候,就执行下面的命令。

$ npm run build

三、babel-node

babel-cli工具自带一个babel-node命令,提供一个支持ES6的REPL环境。它支持Node的REPL环境的所有功能,而且可以直接运行ES6代码。

它不用单独安装,而是随babel-cli一起安装。然后,执行babel-node就进入PEPL环境。

$ babel-node
> (x => x * 2)(1)
2

babel-node命令可以直接运行ES6脚本。将上面的代码放入脚本文件es6.js,然后直接运行。

$ babel-node es6.js
2

babel-node也可以安装在项目中。

$ npm install --save-dev babel-cli

然后,改写package.json。

{
 "scripts": {
  "script-name": "babel-node script.js"
 }
}

上面代码中,使用babel-node替代node,这样script.js本身就不用做任何转码处理。

四、babel-register

babel-register模块改写require命令,为它加上一个钩子。此后,每当使用require加载.js、.jsx、.es和.es6后缀名的文件,就会先用Babel进行转码。

$ npm install --save-dev babel-register

使用时,必须首先加载babel-register。

require("babel-register");
require("./index.js");

然后,就不需要手动对index.js转码了。

需要注意的是,babel-register只会对require命令加载的文件转码,而不会对当前文件转码。另外,由于它是实时转码,所以只适合在开发环境使用。

五、babel-core

如果某些代码需要调用Babel的API进行转码,就要使用babel-core模块。

安装命令如下。

$ npm install babel-core --save

然后,在项目中就可以调用babel-core。

var babel = require('babel-core');

// 字符串转码
babel.transform('code();', options);
// => { code, map, ast }

// 文件转码(异步)
babel.transformFile('filename.js', options, function(err, result) {
 result; // => { code, map, ast }
});

// 文件转码(同步)
babel.transformFileSync('filename.js', options);
// => { code, map, ast }

// Babel AST转码
babel.transformFromAst(ast, code, options);
// => { code, map, ast }

配置对象options,可以参看官方文档http://babeljs.io/docs/usage/options/。

下面是一个例子。

var es6Code = 'let x = n => n + 1';
var es5Code = require('babel-core')
 .transform(es6Code, {
  presets: ['es2015']
 })
 .code;
// '"use strict";\n\nvar x = function x(n) {\n return n + 1;\n};'

上面代码中,transform方法的第一个参数是一个字符串,表示需要转换的ES6代码,第二个参数是转换的配置对象。

六、babel-polyfill

Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码。

举例来说,ES6在Array对象上新增了Array.from方法。Babel就不会转码这个方法。如果想让这个方法运行,必须使用babel-polyfill,为当前环境提供一个垫片。

安装命令如下。

$ npm install --save babel-polyfill

然后,在脚本头部,加入如下一行代码。

import 'babel-polyfill';
// 或者
require('babel-polyfill');

Babel默认不转码的API非常多,详细清单可以查看babel-plugin-transform-runtime模块的definitions.js文件。

七、浏览器环境

Babel也可以用于浏览器环境。但是,从Babel 6.0开始,不再直接提供浏览器版本,而是要用构建工具构建出来。如果你没有或不想使用构建工具,可以通过安装5.x版本的babel-core模块获取。

$ npm install babel-core@old

运行上面的命令以后,就可以在当前目录的node_modules/babel-core/子目录里面,找到babel的浏览器版本browser.js(未精简)和browser.min.js(已精简)。

然后,将下面的代码插入网页。

<script src="node_modules/babel-core/browser.js"></script>
<script type="text/babel">
// Your ES6 code
</script>

上面代码中,browser.js是Babel提供的转换器脚本,可以在浏览器运行。用户的ES6脚本放在script标签之中,但是要注明type="text/babel"。

另一种方法是使用babel-standalone模块提供的浏览器版本,将其插入网页。

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.4.4/babel.min.js"></script>
<script type="text/babel">
// Your ES6 code
</script>

注意,网页中实时将ES6代码转为ES5,对性能会有影响。生产环境需要加载已经转码完成的脚本。

下面是如何将代码打包成浏览器可以使用的脚本,以Babel配合Browserify为例。首先,安装babelify模块。

$ npm install --save-dev babelify babel-preset-es2015

然后,再用命令行转换ES6脚本。

$ browserify script.js -o bundle.js \
 -t [ babelify --presets [ es2015 react ] ]

上面代码将ES6脚本script.js,转为bundle.js,浏览器直接加载后者就可以了。

在package.json设置下面的代码,就不用每次命令行都输入参数了。

{
 "browserify": {
  "transform": [["babelify", { "presets": ["es2015"] }]]
 }
}

八、在线转换

Babel提供一个REPL在线编译器,可以在线将ES6代码转为ES5代码。转换后的代码,可以直接作为ES5代码插入网页运行。

九、与其他工具的配合

许多工具需要Babel进行前置转码,这里举两个例子:ESLint和Mocha。

ESLint 用于静态检查代码的语法和风格,安装命令如下。

$ npm install --save-dev eslint babel-eslint

然后,在项目根目录下,新建一个配置文件.eslint,在其中加入parser字段。

{
 "parser": "babel-eslint",
 "rules": {
  ...
 }
}

再在package.json之中,加入相应的scripts脚本。

{
  "name": "my-module",
  "scripts": {
   "lint": "eslint my-files.js"
  },
  "devDependencies": {
   "babel-eslint": "...",
   "eslint": "..."
  }
 }

Mocha 则是一个测试框架,如果需要执行使用ES6语法的测试脚本,可以修改package.json的scripts.test。

"scripts": {
 "test": "mocha --ui qunit --compilers js:babel-core/register"
}

上面命令中,--compilers参数指定脚本的转码器,规定后缀名为js的文件,都需要使用babel-core/register先转码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中对Attr(dom中属性)的操作示例讲解
Dec 02 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
jQuery实现图像旋转动画效果
May 29 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
jQuery实现上传图片前预览效果功能
Aug 03 jQuery
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
Nov 09 Javascript
在Vue mounted方法中使用data变量详解
Nov 05 Javascript
JS代码触发事件代码实例
Jan 02 Javascript
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 #Javascript
微信小程序支付功能 php后台对接完整代码分享
Jun 12 #Javascript
js replace 全局替换的操作方法
Jun 12 #Javascript
微信小程序自定义prompt组件步骤详解
Jun 12 #Javascript
js实现购物车功能
Jun 12 #Javascript
浅谈Node.js 中间件模式
Jun 12 #Javascript
浅谈Webpack打包优化技巧
Jun 12 #Javascript
You might like
PHP 简单数组排序实现代码
2009/08/05 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
Python列表元素常见操作简单示例
2019/10/25 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
护理个人求职信范文
2014/01/08 职场文书
优秀干部获奖感言
2014/01/31 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
迎新年主持词
2015/07/06 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
Python音乐爬虫完美绕过反爬
2021/08/30 Python