不少同窗搞不清楚babel与polyfill的关系以及区别,这儿给你们细致解惑。javascript
Babel:Babel 是一个普遍使用的 ES6 转码器,能够将 ES6 代码转为 ES5 代码。注意:Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API。有的同窗可能分不清哪些是ES6句法,哪些是API,这个暂时先放一放,后面会讲。html
Polyfill:Polyfill的准确意思为,用于实现浏览器并不支持的原生API的代码。java
下面用一个例子来说:webpack
//使用babel转码前的代码 require('babel-polyfill'); (x => x * 2)(1); var b = Array.of(1,2,4);
//使用babel转码后的代码 'use strict'; require('babel-polyfill'); (function (x) { return x * 2; })(1); var b = Array.of(1, 2, 4);
这个例子中,Babel转换了ES6的箭头函数句法,但对于Array.of并无转换,由于Array.of是ES6的API。有些同窗可能仍是不清楚哪些是句法,哪些是API,这个没关系,我是新人的时候也是花了很长时间才理解的,须要多写代码慢慢体会,潜移默化。对于什么是API,讲一个例子帮助你们理解吧。web
if (!Array.of) { Array.of = function() { return Array.prototype.slice.call(arguments); };
咱们都知道Array是ES5就存在的一个对象了,可是该对象没有of方法,这个方法就是一个API,但ES6有这个API了。对于不支持ES6的浏览器,咱们经过引入babel-polyfill使其支持ES6的API,相似于上面的代码来实现的。浏览器
下面再给一个现实的例子:babel
我在旧版浏览器(火狐23.0,2013年发布的)打开下面的页面直接报错(新版的Chrome和火狐不会报错,这两个已经支持ES6)函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <!-- <script type="text/javascript" src="polyfill.js"></script> --> <script type="text/javascript"> var b = Array.of(1, 2, 4); console.log(b) </script> </body> </html>
当把Babel官网提供的polyfill.js(就是babel-polyfill)引入后,即反注释上面代码中已经注释掉的polyfill.js,就能够正常运行了。工具
另外,还有些同窗要问,require()怎么转换成ES5啊?其实,浏览器里这个经过Babel是不能转换的,要经过webpack等打包工具把代码打包用。ui