如何提供ECMAScript 5(ES 5)shim?

37

ECMAScript第五版(于2009年12月发布)引入了一些新方法(详见此表)。然而,仍然有一些旧版本的浏览器无法实现这些新方法。

幸运的是,有一个方便的JavaScript脚本—ES5-shim,可以在没有这些方法的环境中手动实现它们。

但是,我不确定如何提供ES5-shim... 我应该像这样向所有浏览器“提供”它吗:

<script src="es5-shim.js"></scipt>

那我是否应该添加一个检查来仅在必要的情况下“干扰”那些真正需要它的浏览器,像这样:

<script>
    if ( !Function.prototype.hasOwnProperty( 'bind' ) ) {
        (function () {
            var shim = document.createElement( 'script' );
            shim.src = 'es5-shim.js';
            var script = document.getElementsByTagName( 'script' )[0];
            script.parentNode.insertBefore( shim, script );
        }());
    }
</script>

(我正在使用 Function.prototype.bind 来检查浏览器是否实现了所有新的ECMAScript 5方法。根据我上面链接的兼容性表,bind是实现ECMAScript 5方法的“最后堡垒”。)

当然,要使这个shim生效,它必须在所有其他脚本之前执行,这意味着我们希望在页面早期(在HEAD中,在所有其他SCRIPT元素之前)包含上述SCRIPT元素。

那么,这个第二个示例是否是向浏览器提供ECMAScript 5-shim的好方法?还有更好的方法吗?

3个回答

23

ES5-Shim 只会给那些浏览器没有实现的部分打补丁,因此应将其提供给所有浏览器。它将处理需要打补丁和不需打补丁的检测。

但请注意所列出的注意事项,在某些情况下,这些 shim 不会正确地工作。我曾经遇到过这些问题,直到意识到答案非常简单之前,它会带来很多麻烦...


10
但这将迫使ES5兼容的浏览器(最新的IE、Chrome、Firefox以及即将推出的Opera)下载并执行shim,从而不必要地减慢网页加载速度。如果我能通过一些简单的JavaScript检查来避免这种情况,我将非常乐意这样做。 - Šime Vidas
3
@ŠimeVidas说:“它只有8kB。通过适当的缓存,这不是什么需要担心的问题。” - You
1
正如@You所说,它是8kb(在gzip压缩之前)并且很容易被缓存。如果额外的HTTP请求真的是一个问题,可以将其与您的主要脚本合并。 - JaredMcAteer
4
@epascarello,你说得对。现代浏览器比这更好。但是如果您要支持旧的浏览器,就必须做点什么。问题在于Chrome、Safari、Firefox和IE9都对ES5功能集有不同的支持,因此除了测试所有功能之外(这将增加1k的大小),您还需要进行用户代理和版本检测,并维护此内容以跟踪疯狂的Chrome和Firefox发布计划。如果额外的HTTP请求真的很麻烦,可以将其内联并避免请求。您的移动网络仍然比9600波特调制解调器快得多。 - tkone
2
如果你担心额外的HTTP请求,只需将JS脚本压缩并合并成一个(或几个)文件即可。在生产系统中,您应该始终这样做以最小化HTTP调用。 - PeterToTheThird
显示剩余6条评论

14

这对我来说似乎有效:

<!--[if lt IE 9]><script src="java/es5-shim.min.js"></script><![endif]-->

1
不支持ES5的非IE浏览器怎么办? - Bergi
3
@Bergi:我认为那些实际上并不存在。 - gen_Eric
1
@RocketHazmat:我想你的意思是“它们很少被使用”,但它们确实存在。例如一些流行浏览器的ES5之前版本,或者一些嵌入式或移动浏览器。 - Bergi
37
为什么它在一个“java”文件夹中? - Eugene Kuzmenko

8
目前,与ES5-Shim 最兼容的解决方案是在所有环境中使用该库,并允许它在运行时检测需要修补的功能。更好的方法是从社区CDN传递它,以最大程度地提高跨站点缓存命中率。
话虽如此,有一个开放的机会可以创建系统,结合了特征检测、代理指纹识别和动态捆绑,自动生成并交付目标补丁子集。问题的范围远远超出了ES5-Shim,可以应用于各种类型的补丁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接