包含两次相同的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>