记录一下:shim和polyfill

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 )。

猜你喜欢

转载自blog.csdn.net/qq_38652871/article/details/130521473