将JavaScript放在一个.js文件中,或将它分解成多个.js文件?
我的Web应用程序使用jQuery和一些jQuery插件(例如validation,自动完成)。 我想知道是否应该将它们粘贴到一个.js文件中,以便它可以更容易地caching,或者将它们分解成单独的文件,并且只包含给定页面所需的文件。
我还应该提到,我担心的不仅是下载.js文件所需的时间,还有根据加载的.js文件的内容减慢页面的速度。 例如,添加自动完成插件往往会使我的基本testing的响应时间减缓100ms左右,即使在caching时也是如此。 我的猜测是,它必须扫描DOM中导致延迟的元素。
我认为这取决于他们多久改变一次。 我们来看一下这个例子:
- JQuery:每年更换一次
- 第三方插件:每6个月更换一次
- 您的自定义代码:每周更换一次
如果您的自定义代码仅占总代码的10%,则不希望用户每周下载另外90%的代码。 你至less要分成两个j:JQuery +插件和你的自定义代码。 现在,如果您的自定义代码占全尺寸的90%,将所有内容放在一个文件中更有意义。
当select如何结合JS文件(和CSS相同),我平衡:
- 文件的相对大小
- 预计更新数量
常见但相关的答案:
这取决于项目。
如果你有一个相当有限的网站,其中大部分的function在网站的多个部分被重复使用,那么将所有脚本放到一个文件中是有意义的。
然而,在我所研究的几个大型Web项目中,将常见站点范围的function放入单个文件中,并将更多的特定于部分的function放入其自己的文件中更有意义。 (我们正在这里讨论大型脚本文件,这是针对几个截然不同的web应用程序的行为,所有这些都在同一个域中提供。)
把脚本分成单独的文件的好处是,你不必为用户提供他们不使用的不必要的内容和带宽。 (例如,如果他们从不访问网站上的“App A”,他们将永远不需要“App A”部分的脚本100K,但是他们需要通用网站的function。)
将脚本保存在一个文件中的好处是简单。 服务器上点击更less。 用户下载量更less。
像往常一样,虽然,YMMV。 没有硬性规定。 根据用户的使用情况,根据您的项目结构,做一些最符合您需求的内容。
如果每个页面都需要这些文件,请将它们放在一个文件中。 这将减lessHTTP请求的数量,并会改善响应时间(对于大量访问)。
请参阅雅虎最佳做法的其他提示
我几乎同意bigmattyh说,它取决于。
作为一般规则,我尽可能多地聚合脚本文件,但是如果你有一些只在网站的一些区域使用的脚本,尤其是那些在加载时执行大的DOM遍历的脚本,将这些文件留在单独的文件中。
例如,如果您只在联系页面上使用validation,为什么在您的主页上加载?
另外,有时你可以把这些文件偷偷地转换成插页式的页面,在这里没有太多其他的事情发生,所以当用户登陆一个需要的页面时,应该已经被caching – 谨慎使用,但是可以当你有人对你进行基准testing时,这是一个方便的技巧。
所以,尽可能less的脚本文件,在合理的范围内。
如果你发送一个100K的整体,但只有80%的页面使用20K,可以考虑分割它。
如果人们要访问您网站中的多个页面,最好将它们放在一个文件中,以便可以caching。 他们会在前面花一点时间,但是这将是他们花在你网站上的时间。
在一天结束时,这取决于你。
但是,每个网页所包含的信息越less,terminal用户下载的信息就会越快。
如果您只包含每个页面所需的js文件,那么您的网站似乎更有可能更高效和更stream畅
如果您喜欢单独的文件中进行开发的代码,您可以在缩小之前编写一个快速脚本将它们连接成单个文件。
其他海报表明,一个大文件可以更好地减lessHTTP请求。
这很大程度上取决于用户与您的网站进行交互的方式。
有些问题需要您考虑:
- 你的首页加载速度有多快?
- 用户通常将大部分时间用在网站的不同部分,并使用function子集?
- 在页面准备就绪的时候,你是否需要准备好所有的脚本,或者在页面加载完成之后,通过插入
<script>
元素来加载一些<script>
?
对用户如何使用您的网站有一个好的想法,以及如果您真的希望提高性能,您想优化的内容是一个好主意。
但是,我的默认方法是只是连接和缩小我的所有JavaScript到一个文件。 jQuery和jQuery.ui很小,开销非常低。 如果你使用的插件对页面加载时间有100ms的影响,那么可能是错误的。
几件事情来检查:
- 您的HTTP服务器上是否启用了gzipping?
- 您是否生成具有唯一名称的静态文件作为部署的一部分?
- 你是否提供永不停止caching到期的静态文件?
- 你是否把你的CSS包含在页面顶部,脚本在底部?
- 有没有更好的(更小,更快)的jQuery插件做同样的事情?
正如其他人所build议的,我也认为你应该走一条路。 但是,对于你只是被包含在你的大型js文件中的插件吃掉了周期:
在执行昂贵的操作之前,请使用一些检查来确保您甚至在需要操作的页面上。 也许你可以在运行自动完成插件之前检测到dom节点的存在(或不存在),并且只在必要时初始化插件。 没有必要浪费dom遍历页面或部分的开销,永远不需要某些function。
昂贵的代码块之前的一个简单的条件会给你两种方法的好处,你正在决定。