@@ -121,74 +121,238 @@ input.map(function (item) {
121121
122122上面的原始代码用了箭头函数,这个特性还没有得到广泛支持,Babel将其转为普通函数,就能在现有的JavaScript环境执行了。
123123
124- ### 命令行环境  
124+ ### 配置文件 ` .babelrc `  
125125
126- 命令行下,Babel的安装命令如下。
126+ Babel的配置文件是` .babelrc ` ,存放在项目的根目录下。使用Babel的第一步,就是配置这个文件。
127+ 
128+ 该文件用来设置转码规则和插件,基本格式如下。
129+ 
130+ ``` javascript 
131+ {
132+   " presets" :  [],
133+   " plugins" :  []
134+ }
135+ ``` 
136+ 
137+ ` preset ` 字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。
138+ 
139+ ``` bash 
140+ #  ES2015转码规则
141+ $ npm install --save-dev babel-preset-es2015
142+ 
143+ #  react转码规则
144+ $ npm install --save-dev babel-preset-react
145+ 
146+ #  ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个
147+ $ npm install --save-dev babel-preset-stage-0
148+ $ npm install --save-dev babel-preset-stage-1
149+ $ npm install --save-dev babel-preset-stage-2
150+ $ npm install --save-dev babel-preset-stage-3
151+ ``` 
152+ 
153+ 然后,将这些规则加入` .babelrc ` 。
154+ 
155+ ``` javascript 
156+   {
157+     " presets" :  [
158+       " es2015" 
159+       " react" 
160+       " stage-2" 
161+     ],
162+     " plugins" :  []
163+   }
164+ ``` 
165+ 
166+ 注意,以下所有Babel工具和模块的使用,都必须先写好` .babelrc ` 。
167+ 
168+ ### 命令行转码` babel-cli `   
169+ 
170+ Babel提供` babel-cli ` 工具,用于命令行转码。
171+ 
172+ 它的安装命令如下。
127173
128174``` bash 
129175$ npm install --global babel-cli
130- $ npm install --save babel-preset-es2015
131176``` 
132177
133- 然后在当前目录下,新建一个配置文件` .babelrc ` 。
178+ 它的命令行基本用法如下。
179+ 
180+ ``` bash 
181+ #  转码结果输出到标准输出
182+ $ babel example.js
183+ 
184+ #  转码结果写入一个文件
185+ $ babel example.js --out-file compiled.js
186+ #  或者
187+ $ babel example.js -o compiled.js
188+ 
189+ #  整个目录转码
190+ #  --out-dir 或 -d 参数指定输出目录
191+ $ babel src --out-dir lib
192+ #  或者
193+ $ babel src -d lib
194+ 
195+ #  -s 参数生成source map文件
196+ $ babel src -d lib -s
197+ ``` 
198+ 
199+ 上面代码是在全局环境下,进行Babel转码。但这意味着,如果项目要运行,全局环境必须有Babel,这就让项目产生了对环境的依赖,也无法支持不同项目使用不同版本的Babel。
200+ 
201+ 一个解决办法是将` babel-cli ` 安装在项目之中。
202+ 
203+ ``` bash 
204+ #  安装
205+ $ npm install --save-dev babel-cli
206+ ``` 
207+ 
208+ 然后,改写` package.json ` 。
134209
135210``` javascript 
136- //  .babelrc
137211{
138-   " presets" :  [' es2015' 
212+   //  ...
213+   " devDependencies" :  {
214+     " babel-cli" :  " ^6.0.0" 
215+   },
216+   " scripts" :  {
217+     " build" :  " babel src -d lib" 
218+   },
139219}
140220``` 
141221
142- Babel自带一个` babel-node ` 命令,提供支持ES6的REPL环境。它支持Node的REPL环境的所有功能,而且可以直接运行ES6代码。
222+ 转码的时候,就执行下面的命令。
223+ 
224+ ``` javascript 
225+ $ npm run build
226+ ``` 
227+ 
228+ ### babel-node  
229+ 
230+ ` babel-cli ` 工具自带一个` babel-node ` 命令,提供一个支持ES6的REPL环境。它支持Node的REPL环境的所有功能,而且可以直接运行ES6代码。
231+ 
232+ 它不用单独安装,而是随` babel-cli ` 一起安装。然后,执行` babel-node ` 就进入PEPL环境。
143233
144234``` bash 
145235$ babel-node
146- > 
147- >  console.log([1,2,3].map(x =>  x *  x))
148-     [ 1, 4, 9 ]
149- > 
236+ >  (x =>  x *  2)(1)
237+ 2
150238``` 
151239
152240` babel-node ` 命令也可以直接运行ES6脚本。假定将上面的代码放入脚本文件` es6.js ` 。
153241
154242``` bash 
155243$ babel-node es6.js
156- [1, 4, 9] 
244+ 2 
157245``` 
158246
159- ` babel ` 命令可以将ES6代码转为ES5代码 。
247+ ` babel-node  ` 也可以安装在项目中 。
160248
161249``` bash 
162- $ babel es6.js
163- " use strict" ; 
250+ #  安装
251+ $ npm install --save-dev babel-cli
252+ ``` 
164253
165- console.log([1, 2, 3].map(function (x) {
166-   return  x *  x; 
167- })); 
254+ 然后,改写` package.json ` 。
255+ 
256+ ``` javascript 
257+ {
258+   " scripts" :  {
259+     " script-name" :  " babel-node script.js" 
260+   }
261+ }
168262``` 
169263
170- ` -o ` 参数将转换后的代码,从标准输出导入文件。
264+ 上面代码中,使用` babel-node ` 替代` node ` ,这样` script.js ` 本身就不用做任何改变。
265+ 
266+ ### babel-register  
267+ 
268+ ` babel-register ` 模块改写` require ` 命令,为它加上一个钩子。每当使用` require ` 加载某个文件,就会先用Babel进行转码。
171269
172270``` bash 
173- $ babel es6.js -o es5.js
174- #  或者
175- $ babel es6.js --out-file es5.js
271+ $ npm install --save-dev babel-register
272+ ``` 
273+ 
274+ 使用时,必须首先加载` babel-register ` 。
275+ 
276+ ``` bash 
277+ require(" babel-register" ; 
278+ require(" ./index.js" ; 
176279``` 
177280
178- ` -d ` 参数用于转换整个目录。
281+ 然后,就不需要手动对` index.js ` 转码了。
282+ 
283+ 需要注意的是,` babel-register ` 只会对` require ` 命令加载的文件转码,而不会对当前文件转码。另外,由于它是实时转码,所以只适合在开发环境使用。
284+ 
285+ ### babel-core  
286+ 
287+ 如果某些代码需要调用API进行转码,就要使用` babel-core ` 模块。
288+ 
289+ 安装命令如下。
179290
180291``` bash 
181- $ babel -d build-dir source-dir
292+ $ npm install babel-core
293+ ``` 
294+ 
295+ 然后,在项目中就可以调用` babel-core ` 。
296+ 
297+ ``` javascript 
298+ var  babel =  require (" babel-core" 
299+ 
300+ //  字符串转码
301+ babel .transform (" code();" 
302+ //  => { code, map, ast }
303+ 
304+ //  文件转码(异步)
305+ babel .transformFile (" filename.js" function (err , result ) {
306+   result; //  => { code, map, ast }
307+ });
308+ 
309+ //  文件转码(同步)
310+ babel .transformFileSync (" filename.js" 
311+ //  => { code, map, ast }
312+ 
313+ //  Babel AST转码
314+ babel .transformFromAst (ast, code, options);
315+ //  => { code, map, ast }
316+ ``` 
317+ 
318+ 配置对象` options ` ,可以参看官方文档[ http://babeljs.io/docs/usage/options/ ] ( http://babeljs.io/docs/usage/options/ ) 。
319+ 
320+ 下面是一个例子。
321+ 
322+ ``` javascript 
323+ var  es5Code =  ' let x = n => n + 1' 
324+ var  es6Code =  require (' babel-core' 
325+   .transform (es5Code, {
326+     presets:  [' es2015' 
327+   })
328+   .code ;
329+ //  '"use strict";\n\nvar x = function x(n) {\n  return n + 1;\n};'
182330``` 
183331
184- 注意,` -d ` 参数后面跟的是输出目录。
332+ 上面代码中,` transform ` 方法的第一个参数是一个字符串,表示需要转换的ES5代码,第二个参数是转换的配置对象。
333+ 
334+ ### babel-polyfill  
185335
186- 如果希望生成source map文件,则要加上` -s ` 参数。
336+ Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如` Object.assign ` )。
337+ 
338+ 举例来说,ES6在` Array ` 对象上新增了` Array.from ` 方法。Babel就不会转换这个方法。如果想让这个方法运行,必须使用` babel-polyfill ` 。
339+ 
340+ 安装命令如下。
187341
188342``` bash 
189- $ babel -d build-dir source-dir -s 
343+ $ npm install --save babel-polyfill 
190344``` 
191345
346+ 然后,在脚本头部,加入如下一行代码。
347+ 
348+ ``` javascript 
349+ import  ' babel-polyfill' 
350+ //  或者
351+ require (' babel-polyfill' 
352+ ``` 
353+ 
354+ Babel默认不转码的API非常多,详细清单可以查看` babel-plugin-transform-runtime ` 模块的[ ` definitions.js ` ] ( https://github.com/babel/babel/blob/master/packages/babel-plugin-transform-runtime/src/definitions.js ) 文件。
355+ 
192356### 浏览器环境  
193357
194358Babel也可以用于浏览器。但是,从Babel 6.0开始,不再直接提供浏览器版本,而是要用构建工具构建出来。如果你没有或不想使用构建工具,只有通过安装5.x版本的` babel-core ` 模块获取。
@@ -237,70 +401,53 @@ $  browserify script.js -o bundle.js \
237401}
238402``` 
239403
240- ### Node环境  
241- 
242- Node脚本之中,需要转换ES6脚本,可以像下面这样写。
243- 
244- 先安装` babel-core ` 和` babel-preset-es2015 ` 。
404+ ### 在线转换  
245405
246- ``` javascript 
247- $ npm install -- save- dev babel- core babel- preset- es2015
248- ``` 
406+ Babel提供一个[ REPL在线编译器] ( https://babeljs.io/repl/ ) ,可以在线将ES6代码转为ES5代码。转换后的代码,可以直接作为ES5代码插入网页运行。
249407
250- 然后,在项目根目录下新建一个 ` .babelrc ` 文件。 
408+ ###  与其他工具的配合 
251409
252- ``` javascript 
253- {
254-   " presets" :  [" es2015" 
255- }
256- ``` 
410+ 许多工具需要Babel进行前置转码,这里举两个例子:ESLint和Mocha。
257411
258- 然后在脚本中,调用 ` babel-core ` 的 ` transform ` 方法 。
412+ ESLint用于静态检查代码的语法和风格,安装命令如下 。
259413
260- ``` javascript 
261- var  es5Code =  ' let x = n => n + 1' 
262- var  es6Code =  require (' babel-core' 
263-   .transform (es5Code, {presets:  [' es2015' 
264-   .code ;
265- //  '"use strict";\n\nvar x = function x(n) {\n  return n + 1;\n};'
414+ ``` bash 
415+ $ npm install --save-dev eslint babel-eslint
266416``` 
267417
268- 上面代码中,` transform ` 方法的第一个参数是一个字符串,表示需要转换的ES5代码,第二个参数是转换的配置对象。
269- 
270- Node脚本还有一种特殊的` babel ` 用法,即把` babel ` 加载为` require ` 命令的一个钩子。安装` babel-core ` 和` babel-preset-es2015 ` 以后,先在项目的根目录下面,设置一个配置文件` .babelrc ` 。
418+ 然后,在项目根目录下,新建一个配置文件` .eslint ` ,在其中加入` parser ` 字段。
271419
272420``` javascript 
273- //  .babelrc
274421{
275-   " presets" :  [" es2015" 
422+   " parser" :  " babel-eslint" 
423+   " rules" :  {
424+     ... 
425+   }
276426}
277427``` 
278428
279- 然后,在你的应用的入口脚本(entry script)头部,加入下面的语句 。
429+ 再在 ` package.json ` 之中,加入相应的 ` scripts ` 脚本 。
280430
281431``` javascript 
282- require (" babel-core/register" 
283- ``` 
284- 
285- 有了上面这行语句,后面所有通过` require ` 命令加载的后缀名为` .es6 ` 、` .es ` 、` .jsx ` 和` .js ` 的脚本,都会先通过` babel ` 转码后再加载。
286- 
287- 需要注意的是,Babel默认不会转换Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如` Object.assign ` )。如果你用到了这些功能,当前的运行环境又不支持。就需要安装` babel-polyfill ` 模块。
288- 
289- ``` bash 
290- $ npm install babel-polyfill --save
432+   {
433+     " name" :  " my-module" 
434+     " scripts" :  {
435+       " lint" :  " eslint my-files.js" 
436+     },
437+     " devDependencies" :  {
438+       " babel-eslint" :  " ..." 
439+       " eslint" :  " ..." 
440+     }
441+   }
291442``` 
292443
293- 然后,在所有脚本头部加上一行 。
444+ Mocha则是一个测试框架,如果需要执行使用ES6语法的测试脚本,可以修改 ` package.json ` 的 ` scripts.test ` 脚本如下 。
294445
295446``` javascript 
296- require (' babel-polyfill' 
297- //  或者
298- import  ' babel-polyfill' 
447+   " test" :  " mocha --ui qunit --compilers js:babel-core/register" 
299448``` 
300449
301- ### 在线转换  
302- 
303- Babel提供一个[ REPL在线编译器] ( https://babeljs.io/repl/ ) ,可以在线将ES6代码转为ES5代码。转换后的代码,可以直接作为ES5代码插入网页运行
450+ 上面命令中,` --compilers ` 参数指定脚本的转码器,意为后缀名为` js ` 的文件,都需要使用` babel-core/register ` 先转码。
304451
305452## Traceur转码器  
306453
0 commit comments