起首,作为入门的话,Babel的用户手册是个很不错的挑选,内里基本覆蓋了Babel运用的各方面。所以下面主假如我进修Babel的一些笔记,权且看成是一篇入门吧。
Babel是什么
根据Babel官网的说法,Babel是一个Javascript编译器。它能够把用最新范例编写的Javascript代码编译成如今的浏览器或许node环境下能运转的代码,这个历程叫做“源码到源码”编译,又称转译(transpiling)。经由过程这个体式格局,我们就能够提早运用下一代的范例和特征举行编码,然后在如今的环境下运转。
装置Babel
一般我们运用Babel的babel-cli
东西在敕令行下举行文件的编译。我们能够对babel-cli举行全局装置,也能够把它装置到项目里。这里我挑选了把它装置到项目里。如许做的优点是:
差别的项目能够会运用差别版本的Babel,运用全局的话只能运用一致的版本
轻易项目标布置,运用全局装置的话意味着对环境有个隐式的依靠。
除了
babel-cli
,另有其他运用Babel的体式格局,详细能够看用户手册。
下面我们最先装置babel-cli
。起首新建一个事情目次,并建立package.json
文件:
$ npm init -y
装置babel-cli
:
$ npm install --save-dev babel-cli
装置完我们能够如许运转:
$ ./node_modules/babel-cli/bin/babel.js -V
6.11.4 (babel-core 6.11.4)
然则如许运转很不轻易,我们能够经由过程npm scripts
来运转Babel。在package.json
文件里,我们增添scripts
字段,并增加一个剧本:
{
"scripts": {
"build": "babel src -d lib"
},
"devDependencies": {
"babel-cli": "^6.11.4"
}
}
这里增添了一条名字为build
的剧本,敕令的内容是把src
里的文件经由过程Babel转译到lib
目次里。然后我们能够经由过程以下敕令运转剧本:
$ npm run build
固然,如今运转这个敕令会报错,因为我们并没有src
文件夹。下面我们正式进入正题。
Babel的基本运用
转译初探
起首我们建立src
目次,然后建立一个js文件index.js
:
[1,2,3].map(n => n + 1);
然后运转npm run build
敕令,就会看到lib
文件夹里多了一个转译后的文件index.js
。然则翻开来看会发明这个转译后的文件跟源文件并没有区分。因为Babel须要你经由过程插件(Plugin)
或许预设(presets)
通知它做什么。比方我们能够经由过程babel-preset-es2015
通知Babel把ES2015的文件转译成ES5。这也是Babel最经常使用的一个用法之一。
设置文件
要运用插件或许预设(相当于一组插件),我们须要在Bable的设置文件内里举行设置。有两个体式格局举行设置。
第一个体式格局是经由过程.babelrc
文件:
{
"presets": [],
"plugins": []
}
第二个体式格局是运用package.json
文件:
{
"name": "my-package",
"version": "1.0.0",
"babel": {
"presets": [],
"plugins": []
}
}
运用预设
上面说过,预设就是一组插件的鸠合,比方预设babel-preset-es2015
就是把一堆跟ES2015有关的插件组合起来供应编译ES2015代码为ES5代码的功用。下面我们最先运用babel-preset-es2015
预设来把ES2015转译成ES5。
起首我们装置这个预设:
$ npm install --save-dev babel-preset-es2015
然后在设置文件里增加这个预设:
{
"presets": [
"es2015"
],
"plugins": []
}
末了我们再次运转一次npm run build
敕令,再次翻开lib/index.js
文件,我们会看到代码已被编译成ES5的语法:
"use strict";
[1, 2, 3].map(function (n) {
return n + 1;
});
Babel的实行
Polyfill
像上面那段转译后的代码我们能够直接运用在当前的环境下,然则并非一切转译后的文件我们都只能直接运用,因为虽然Babel能够编译现在险些一切的ES2015语法,然则一些新的API能够在当前的Javascript环境下没法支撑。比方下面的代码(假定文件为lib/index.js
):
function addAll() {
return Array.from(arguments).reduce((a, b) => a + b);
}
转译后会变成:
function addAll() {
return Array.from(arguments).reduce(function(a, b) {
return a + b;
});
}
能够看到语法上已转译成ES5了,然则并非一切的Javascript环境都支撑Array.from
,比方我们在IE上运转以下页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="lib/index.js"></script>
<script>
console.log(addAll(1, 2, 3, 4, 5));
</script>
</body>
</html>
能够会报以下的毛病:
对象不支撑“from”属性或要领
Babel的处理要领就是运用Polyfill手艺(运用了core-js和regenerator),经由过程在当前的运转环境模拟不存在的API来到达运用新API的目标。
起首我们装置babel-polyfill
:
$ npm install --save babel-polyfill
注重这里运用的是--save
而不是--save-dev
,因为我们须要在代码里引入babel-polyfill
。我们须要在文件顶部导入它:
import "babel-polyfill";
在增加这句代码后,上面的代码在转译后会变成下面这个模样:
"use strict";
require("babel-polyfill");
function addAll() {
return Array.from(arguments).reduce(function (a, b) {
return a + b;
});
}
因为Babel编译时默许运用的是CommonJS的模块范例,所以会看到转译后的代码运用了require
要领来加载babel-polyfill
。这个在node环境下运转没有题目,然则在浏览器环境下运转就会报错,因为浏览器现在还不原生的支撑模块的加载。那在浏览器下怎样运用babel-polyfill
呢?
我们能够把babel-polyfill
经由过程外部js的体式格局加载进来,而不是在js代码里举行引入:
<script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
<script src="lib/index.js"></script>
然则假如你打算在项目里运用模块,上面显著不是很好的处理方案。下面我们看看假如处理在浏览器环境下模块的加载题目。
运用模块
要在浏览器环境下加载依靠模块,有许多体式格局,比方运用webpack
或许browserify
之类的打包东西(发起的体式格局,然则这里我们先不触及)。或许我们能够运用浏览器端的模块加载器举行加载,比方我们运用AMD模块范例举行编译,然后用RequireJS举行加载。下面我运用SystemJS来做例子。
起首我们装置es2015-modules-systemjs
插件:
$ npm install babel-plugin-transform-es2015-modules-systemjs
然后修正设置文件,在plugins
里增加插件:
{
"plugins": ["transform-es2015-modules-systemjs"]
}
我们修正下lib/index.js
,把addAll
要领导出为模块的要领:
import "babel-polyfill";
export function addAll() {
return Array.from(arguments).reduce((a, b) => a + b);
}
再次对文件举行编译,编译后的lib/index.js
变成如许:
"use strict";
System.register(["babel-polyfill"], function (_export, _context) {
"use strict";
return {
setters: [function (_babelPolyfill) {}],
execute: function () {
function addAll() {
return Array.from(arguments).reduce(function (a, b) {
return a + b;
});
}
_export("addAll", addAll);
}
};
});
然后我们须要在HTML里引入system.js
。因为SystemJS依靠于Promise
,它会加载目次下system-polyfills.js
文件,所以我们须要确保这个文件的存在。在加载system.js
后,我们就能够运用SystemJS举行模块的加载了:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="system.js"></script>
<script>
System.config({
baseURL: './lib',
map: {
'babel-polyfill': './node_modules/babel-polyfill/dist/polyfill.min.js'
}
});
System.import('index.js').then(function(m) {
console.log(m.addAll(1, 2, 3, 4, 5)); // 15
});
</script>
</body>
</html>
出于机能的斟酌,也能够用像Bluebird和es6-promise如许的polyfill做替换,在
system.js
之前加载。
跋文
自此,我们进修到了Babel的一些基本用法,包含装置和运转,以及设置和预设的用法,同时也初探了一些编译后的文件的运转题目。然则要用好Babel,另有许多题目须要继承讨论,期待我的下一篇笔记。
参考
https://babeljs.io/
https://github.com/thejamesky…
https://github.com/systemjs/s…