包含两次相同的JavaScript库有什么危险?

我正在使用的一个webapps是由许多部分HTML文件组成的。 如果部分需要YUI等JavaScript库,则YUI库将包含在部分中。

当部分在运行时组合时,生成的HTML通常会多次包含YUI库。

<html> ... <script type="text/javascript" src="/js/yahoo/yahoo-min.js"></script> ... <script type="text/javascript" src="/js/yahoo/yahoo-min.js"></script> ... <script type="text/javascript" src="/js/yahoo/yahoo-min.js"></script> ... </html> 

我已经看到了几次包括jQuery的奇怪行为,特别是在使用AJAX的时候。 具体来说,为什么不止一次地包含相同的JavaScript库是一个坏主意? 为什么它只是有时会导致问题?

根据图书馆,包括它不止一次可能会有不良影响。

可以这样想,如果你有一个脚本把一个点击事件绑定到一个button上,并且你包含了这个脚本两次,那么当点击这个button时,这些操作将会运行两次。

您可以编写一个简单的函数,您可以调用它来加载脚本,并跟踪已经加载的文件。 或者,我确定你可以使用一个预先存在的JS加载程序,比如LabJS并修改它。

您应该采取一种方法,我学会了检查HTML5 Boilerplate的来源:

 <script> !window.YAHOO && document.write( unescape('%3Cscript src="/js/yahoo/yahoo-min.js"%3E%3C/script%3E') ); </script> 

我不使用YUI,所以用任何全局的YUIreplace!window.YAHOO

如果这个方法不存在于全局范围内,这种方法将只加载这个库。

浏览器将caching文件,只下载一次。 然而它会被执行不止一次。 所以性能影响可以忽略不计,但正确性影响可能不会。

每次都执行 。 依赖文件,这可能是不可取的。 例如,如果文件包含alert("hello") ,则每次引用文件时都会显示警报框,而您可能只希望它只显示一次。

编写安全库:

如果您只需要一次性执行,则可以采取以下措施。 假设您正在编写一个库foobar.js ,它导出一个全局的foobar

 function foobar() { // ... } 

你可以确保任何重复执行的文件成为无操作,使用这样的代码:

 window.foobar = window.foobar || function foobar() { // ... }; 

使用不安全的库:

如果你不能修改库的源代码,并且你已经确定它是不安全的,这里有一种方法来解决它只加载一次库。 创build一个全局的,每次使用它来检查脚本是否已经被加载。 你必须自己设置全局为真。

 <script>(function() { if (! window.foobar) { var script = document.createElement('script'); script.async = true; // remove this if you don't want the script to be async script.src = 'foobar.js'; document.getElementsByTagName('head')[0].appendChild(script); window.foobar = true; } }();</script>