Shim 和 Polyfill 的区别

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

举个栗子,有些旧浏览器不支持 Number.isNaN 方法,Polyfill 就可以是这样的:

if(!Number.isNaN) {
     Number.isNaN = function(num) {
         return(num !== num); 
      }
}

就是假如浏览器没有 Number.isNaN 方法,那咱们就给它添加上去,所谓 Polyfill 就是这样解决 API 的兼容问题的。

posted @ 2020-09-11 17:29  严格的阿b  阅读(273)  评论(0编辑  收藏  举报