Open sunmaobin opened 7 years ago
本文将帮助你理解这几个概念:shim、polyfill 和 vanilla。
shim
polyfill
vanilla
是一个小的类库(lib),提供独立的API,以弥补人们在不同的环境下使用原生语言需要考虑兼容性的问题。比如:使用js原生Ajax操作时,你用 XMLHttpRequest 创建xhr对象,但是在IE8上,你就得用 ActiveXObject,为了解决这些兼容问题,同时简化操作,jQuery出现了。jQuery的核心理念就是: write less,do more!
XMLHttpRequest
ActiveXObject
write less,do more
所以,jQuery 就可以看成一个 shim。
jQuery
是一个小的类库(lib),用于实现浏览器并不支持的原生API的代码。比如:IE9以下不支持html5新增的一些标签,于是 HTML5 shim 出现了;当前ES6,以及ES6+的一些语法并未完全普及时,如果你要使用,那么晚了可以使用 Babel 来编译成 ES5 的语法。
HTML5 shim
Babel
ES5
这里注意概念中的一点:原生API的代码,指能称得上polyfill的类库,解决方案一定是在不兼容的环境下,重新定义JS本身的语法,不会重新定义API。
原生API的代码
比如:IE9以下不支持 <header> 标签,HTML5 shim 的核心原理就是通过js创建这样一个对象。
<header>
//@see [https://github.com/aFarkas/html5shiv/blob/master/src/html5shiv.js](https://github.com/aFarkas/html5shiv/blob/master/src/html5shiv.js) //line 127 function createElement(nodeName, ownerDocument, data){ if (!ownerDocument) { ownerDocument = document; } if(supportsUnknownElements){ return ownerDocument.createElement(nodeName); } ... }
再比如:如果要让IE9以下支持 XMLHttpRequest,两种方案:
function getXMLHttpRequest() { var xhr = null; if (window.XMLHttpRequest || window.ActiveXObject) { if (window.ActiveXObject) { try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { xhr = new XMLHttpRequest(); } } else { alert("Your browser doesn't support XMLHTTPRequest..."); return null; } return xhr; }
if(!window.XMLHttpRequest){ window.XMLHttpRequest = xxx; };
参考实现:https://github.com/LuvDaSun/xhr-polyfill/blob/master/src/XMLHttpRequestProxy.js
这个概念一般说的少一些,了解下就可以了。
在计算机软件领域中,如果你对原生系统没有做任何定制性的修改,就是Vanilla。
比如,这个网站就跟我们开了个玩笑:http://vanilla-js.com/,下载下来是空的,其实看域名就知道了,作者建议你使用原生API!
本文将帮助你理解这几个概念:
shim
、polyfill
和vanilla
。shim
是一个小的类库(lib),提供独立的API,以弥补人们在不同的环境下使用原生语言需要考虑兼容性的问题。比如:使用js原生Ajax操作时,你用
XMLHttpRequest
创建xhr对象,但是在IE8上,你就得用ActiveXObject
,为了解决这些兼容问题,同时简化操作,jQuery出现了。jQuery的核心理念就是:write less,do more
!所以,
jQuery
就可以看成一个shim
。polyfill
是一个小的类库(lib),用于实现浏览器并不支持的原生API的代码。比如:IE9以下不支持html5新增的一些标签,于是
HTML5 shim
出现了;当前ES6,以及ES6+的一些语法并未完全普及时,如果你要使用,那么晚了可以使用Babel
来编译成ES5
的语法。这里注意概念中的一点:
原生API的代码
,指能称得上polyfill的类库,解决方案一定是在不兼容的环境下,重新定义JS本身的语法,不会重新定义API。比如:IE9以下不支持
<header>
标签,HTML5 shim
的核心原理就是通过js创建这样一个对象。再比如:如果要让IE9以下支持
XMLHttpRequest
,两种方案:shim
的解决方案polyfill
的解决方案是:参考实现:https://github.com/LuvDaSun/xhr-polyfill/blob/master/src/XMLHttpRequestProxy.js
shim 和 polyfill
shim
和polyfill
的目的都是为了解决浏览器兼容性,并且给大家提供方便的,这也是类库(lib)的一个作用;shim
包含了polyfill
,范围更广,可以重新定义API,而polyfill
相对狭义一些,API的使用上一定是JS标准;vanilla
在计算机软件领域中,如果你对原生系统没有做任何定制性的修改,就是Vanilla。
比如,这个网站就跟我们开了个玩笑:http://vanilla-js.com/,下载下来是空的,其实看域名就知道了,作者建议你使用原生API!
参考