在JavaScript的世界里,有两个词经常被提到,shim和polyfill.它们指的都是什么,又有什么区别?
一个shim是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现
一个polyfill就是一个用在浏览器API上的shim.我们通常的做法是先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了.术语polyfill来自于一个家装产品Polyfilla:
Polyfilla是一个英国产品,在美国称之为Spackling Paste(译者注:刮墙的,在中国称为腻子).记住这一点就行:把旧的浏览器想象成为一面有了裂缝的墙.这些[polyfills]会帮助我们把这面墙的裂缝抹平,还我们一个更好的光滑的墙壁(浏览器)
Paul Irish发布过一个Polyfills的总结页面“HTML5 Cross Browser Polyfills”.es5-shim是一个shim(而不是polyfill)的例子,它在ECMAScript 3的引擎上实现了ECMAScript 5的新特性,而且在Node.js上和在浏览器上有完全相同的表现(译者注:因为它能在Node.js上使用,不光浏览器上,所以它不是polyfill).
什么是Polyfill?
核心点:是一个js库、专门用于处理js的兼容性问题(js修补器)
Polyfill是一个js库,主要抚平不同浏览器之间对js实现的差异。比如,html5的storage(session,local), 不同浏览器,不同版本,有些支持,有些不支持。Polyfill(Polyfill有很多,在GitHub上https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills),帮你把这些差异化抹平,不支持的变得支持了(典型做法是在IE浏览器中增加 window.XMLHttpRequest ,内部实现使用 ActiveXObject。)
提到Polyfill,不得不提shim,polyfill 是 shim的一种。
shim是将不同 api封装成一种,比如 jQuery的 $.ajax 封装了 XMLHttpRequest和 IE用ActiveXObject方式创建xhr对象。它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现。
---------------------
如何使用?
直接引入项目,最简单就是CDN:
<script src="//cdn.polyfill.io/v1/polyfill.min.js" async defer></script>
作者:E_li_na
原文:https://blog.csdn.net/e_li_na/article/details/79925094
1.polyfill的作用是什么?
var users = [{name:”zhangsan”,age:18},{name:”jack”,age:20}];
这是一个对象数组。如果我们要查询名字为”jack”用户的年龄、常用的办法是什么?很多同学会想到遍历这个数组。
我们来看看新的语法:
var getUser = users.find(function(finder){
return finder.name = “jack”
});
注意:
这种新的语法目前被纳入了ES2015;
但是我之前使用的babel转换器只会转化新的句法,对一些API不转化;
同时你如果要直接在网页中赤裸裸的写这种代码,那么有些浏览器是不兼容的。这时babel-polyfill库就产生了。它起到了一个”修补”作用; 比如你执行了find方法,如果浏览器不支持,它就会自动帮你处理为”循环遍历”;
这就好比jQuery修补了ajax(针对不同的浏览器启用不同的xmlhttp对象)。
2.如何使用babel-polyfill这个工具呢?
安装:
$ npm install –save-dev babel-polyfill
然后我们引入:
<script src="node_modules/babel-polyfill/dist/polyfill.min.js"></script>
var users = [{name:"zhangsan",age:18},{name:"jack",age:20}];
var getUser = users.find(function(finder){
return finder.name = "jack"
});
console.log(getUser.age);
---------------------
作者:牟垚
原文:https://blog.csdn.net/m0_37631322/article/details/81633677