Babel与Polyfill的关系和区别

  不少同窗搞不清楚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

相关文章
相关标签/搜索