chenxiaochun / blog

🖋️ChenXiaoChun's blog
181 stars 15 forks source link

shim和polyfill之间的区别是什么 #37

Open chenxiaochun opened 7 years ago

chenxiaochun commented 7 years ago

在 javascript 的世界里,我们经常会遇到shimpolyfill两个术语,那么它们之间到底有什么区别呢?

Shim

Shim 通常是一个代码库,它给旧环境(并不一定特指浏览器环境)带来的往往是全新的 api,而且这些 api 只能在这个环境当中运行。

Polyfill

在 2010年10月,Remy Sharp在他的博客中对 polyfill 做了如下定义:

Polyfill 就是一系列的代码或者插件,它为开发者提供的技术特性,都是希望浏览器本就应该原生支持的,并且抹平了 api 之间的使用差异。

因此,一个 polyfill 就是一个浏览器层面的 shim。典型地像检测浏览器是否支持某一个 api,如果不支持就加载一个 polyfill,这样就可以让开发者在任何情况下无缝的使用那些 api 了。Polyfill 这个术语其实来自于一款家居装修产品:

Polyfilla 是英国生产的一种用来抹泥修墙的膏状物,它因能够很好地修复墙壁上的裂纹而被人们所熟知。所以,试想浏览器就相当于一堵有裂纹的墙,这些 polyfill 能够抹平墙壁上的裂纹,也就是浏览器之间的 api 差异,使开发者能够正常的在浏览器上使用这些技术特性。

image

举两个非常著名的例子:

一个是爱尔兰的 Paul 发布的 html5 跨浏览器 polyfills,里面收集了所有能够给浏览器植入 html5 功能的 polyfills 和 shims。

另一个是 es5-shim,它在 ES3 引擎的基础上对 ES5 的很多特性进行了改进,因为纯粹是语言相关的,所以很多在 nodejs 上才能使用的特性在浏览器端同样能够运行。

原文链接:http://2ality.com/2011/12/shim-vs-polyfill.html

ifmung commented 6 years ago

多谢了~总结得很到位 !

chenxiaochun commented 6 years ago

@IfMung ,客气,多多交流:)

wangxibin commented 3 years ago

我找了很多的博客,都无法让我去理解这两者的关系,直到看到了您的issue。让我明白了最重要的一句话是“并不一定特指浏览器环境”让我豁然开朗了,感谢感谢。

chenxiaochun commented 3 years ago

@wangxibin 🤝 ,不客气