内联脚本最大的问题是无法正确缓存。如果您将所有脚本存储在一个缩小的 js 文件中(使用编译器),那么浏览器可以为整个站点只缓存一次该文件。
如果您的网站趋于繁忙,从长远来看,这会带来更好的性能。为您的脚本拥有一个单独的文件的另一个优点是您倾向于不“重复自己”并尽可能多地声明可重用的函数。DOMContentReady 不会导致糟糕的用户体验。至少它预先为用户提供了内容,而不是让用户等待 UI 加载,这可能最终成为用户的一大障碍。
此外,使用内联脚本并不能确保 UI 比与 DOMContentReady 一起使用时响应更快。想象一个场景,您使用内联脚本进行 ajax 调用。如果你有一个表格提交罚款。有不止一种形式,你最终会重复你的 ajax 调用..因此每次都重复相同的脚本。最后,它会导致浏览器缓存更多的 javascript 代码,而不是在 DOM 准备好时加载的 js 文件中分离出来。
使用内联脚本的另一大缺点是您需要维护两个独立的代码库:一个用于开发,另一个用于生产。您必须确保两个代码库保持同步。开发版本包含代码的非缩小版本,生产版本包含缩小版本。这是开发周期中的一个大难题。您必须手动将隐藏在那些庞大的 html 文件中的所有代码片段替换为缩小版本,并且最终希望没有代码中断!但是,在开发周期中维护一个单独的文件,您只需要在生产代码库中用已编译的缩小版本替换该文件。
如果您使用 YSlow,您会看到:
使用外部 JavaScript 和 CSS 文件通常会产生更快的页面,因为这些文件由浏览器缓存。每次请求 HTML 文档时,都会下载 HTML 文档中内联的 JavaScript 和 CSS。这减少了 HTTP 请求的数量,但增加了 HTML 文档的大小。另一方面,如果 JavaScript 和 CSS 位于浏览器缓存的外部文件中,则 HTML 文档的大小会减小,而不会增加 HTTP 请求的数量。
当且仅当代码更改如此频繁以至于将其放在单独的 js 文件中无关紧要并且最终会产生与这些内联脚本相同的影响时,我才能保证内联脚本。尽管如此,这些脚本并没有被浏览器缓存。浏览器缓存脚本的唯一方法是将其存储在带有etag的外部 js 文件中。
但是,这绝不是 JQuery vs Google 的闭包。闭包有其自身的优势。然而,闭包库使得将所有脚本都放在外部文件中变得很困难(尽管这不是不可能的,只是让它变得很困难)。您只是倾向于使用内联脚本。