shim 和 polyfill 都是打补丁,它们有什么不同呢?为什么一个叫 shim,一个叫 polyfill 呢?
直接解释:
Shim
Shim 指的是在一个旧的环境中模拟出一个新 API ,而且仅靠旧环境中已有的手段实现,以便所有的环境具有相同的行为。
比如:Object.defineProperty 是 ES5 中一个无法 shim 的特性,意思就是,Object.defineProperty这个特性是无法使用低级浏览器中的方法来实现的,这也就是为什么 Vue 不支持 IE8 以及更低版本浏览器。
Polyfill
polyfill 是一段代码(或者插件),提供了那些开发者们希望浏览器原生提供支持的功能。程序库先检查浏览器是否支持某个API,如果不支持则加载对应的 polyfill。
总结
shim 的概念要比 polyfill 更大一些,可以将 polyfill 理解为专门兼容浏览器 API 的 shim 。简单的说,如果浏览器X支持标准规定的功能,那么 polyfill 可以让浏览器 Y 的行为与浏览器 X 一样。
例如 es5-shim
es5-shim 是一个 shim,而不是 polyfill
。因为它是在 ECMAScript 3 的引擎上实现了 ECMAScript 5 的新特性,而且在 Node.js
上和在浏览器上有完全相同的表现。(注:因为它能在 Node.js
上使用,不光浏览器上,所以它是 shim 不是 polyfill
)。