我应该将javascript拆分为多个文件吗?

我应该将javascript拆分为多个文件吗?,javascript,html,Javascript,Html,我习惯于使用Java,其中(正如我们所知)每个对象都在自己的文件中定义(一般来说)。我喜欢这个。我认为它使代码更易于使用和管理 我开始使用javascript,我发现自己希望在一个页面上使用不同的脚本使用不同的文件。我目前仅限于使用几个.js文件,因为我担心如果我使用的文件超过这个,我将来会因为一些我目前无法预见的事情而感到不便。也许是循环引用 简言之,将脚本拆分为多个文件是一种不好的做法吗?这里有两个问题:a)开发的易用性b)下载JS资产时的客户端性能 就开发而言,模块化从来都不是一件坏事;还

我习惯于使用Java,其中(正如我们所知)每个对象都在自己的文件中定义(一般来说)。我喜欢这个。我认为它使代码更易于使用和管理

我开始使用javascript,我发现自己希望在一个页面上使用不同的脚本使用不同的文件。我目前仅限于使用几个.js文件,因为我担心如果我使用的文件超过这个,我将来会因为一些我目前无法预见的事情而感到不便。也许是循环引用


简言之,将脚本拆分为多个文件是一种不好的做法吗?

这里有两个问题:a)开发的易用性b)下载JS资产时的客户端性能

就开发而言,模块化从来都不是一件坏事;还可以使用Javascript自动加载框架(如和)来帮助您管理模块及其依赖关系


但是,为了解决第二点,最好将所有Javascript合并到一个文件中并缩小它,这样客户端就不会花太多时间下载所有资源。有一些工具(requireJS)也可以让您做到这一点(即,将所有依赖项合并到一个文件中)。

这里有两个问题:a)易于开发b)下载JS资产时的客户端性能

就开发而言,模块化从来都不是一件坏事;还可以使用Javascript自动加载框架(如和)来帮助您管理模块及其依赖关系


但是,为了解决第二点,最好将所有Javascript合并到一个文件中并缩小它,这样客户端就不会花太多时间下载所有资源。有一些工具(requireJS)也可以让你做到这一点(即,将所有依赖项合并到一个文件中)。

从2020年开始更新:按照互联网标准来看,这个答案非常古老,目前还远没有完整的答案,但仍然会偶尔看到投票,因此我觉得有必要提供一些提示,说明自发布以来发生了哪些变化。对
async
脚本加载的良好支持、HTTP/2的服务器推送功能以及多年来对加载过程的一般浏览器优化,都对将Javascript分解为多个文件如何影响加载性能产生了影响

对于那些刚开始使用Javascript的人,我的建议是一样的(使用bundler/minifier,并相信它在默认情况下会做正确的事情),但是对于任何发现这个问题的有更多经验的人,我会邀请他们研究
async
加载和服务器推送带来的新功能

2013年的原始答复:



由于下载时间的原因,您应该始终尝试将脚本制作为单个大文件。但是,如果您使用缩小器(您应该这样做),它们可以为您将多个源文件合并为一个源文件。因此,您可以继续处理多个文件,然后将它们缩小为一个文件进行分发

这方面的主要例外是jQuery之类的公共库,您应该始终从公共CDN加载它们(更有可能是用户已经加载了它们,因此不需要再次加载它们)。如果您确实使用公共CDN,则在失败时,始终有一个从您自己的服务器加载的备用方案

正如评论中提到的,真实的故事要复杂一些

脚本可以同步加载(
)或异步加载(
s=document.createElement('script');s.async=true;…
)。同步脚本阻止加载其他资源,直到加载完毕。例如:

<script src="a.js"></script>
<script src="b.js"></script>

它要复杂得多,但将同时加载a.js和b.js,而不会相互阻塞或其他任何东西。最终,
async
属性将得到正确的支持,您可以像同步加载一样轻松地完成这项工作。最终。

从2020年开始更新:按照互联网标准,这个答案非常古老,现在还远没有完整的答案,但仍然会看到偶尔的投票,因此我觉得有必要提供一些提示,说明自发布以来发生了什么变化。对
async
脚本加载的良好支持、HTTP/2的服务器推送功能以及多年来对加载过程的一般浏览器优化,都对将Javascript分解为多个文件如何影响加载性能产生了影响

对于那些刚开始使用Javascript的人,我的建议是一样的(使用bundler/minifier,并相信它在默认情况下会做正确的事情),但是对于任何发现这个问题的有更多经验的人,我会邀请他们研究
async
加载和服务器推送带来的新功能

2013年的原始答复:



由于下载时间的原因,您应该始终尝试将脚本制作为单个大文件。但是,如果您使用缩小器(您应该这样做),它们可以为您将多个源文件合并为一个源文件。因此,您可以继续处理多个文件,然后将它们缩小为一个文件进行分发

这方面的主要例外是jQuery之类的公共库,您应该始终从公共CDN加载它们(更有可能是用户已经加载了它们,因此不需要再次加载它们)。如果您确实使用公共CDN,则在失败时,始终有一个从您自己的服务器加载的备用方案

正如评论中提到的,真实的故事要复杂一些

脚本可以同步加载(
)或异步加载(
s=document.createElement('script');s.async=true;…
)。同步脚本阻止加载其他资源,直到加载完毕。例如:

<script src="a.js"></script>
<script src="b.js"></script>
它要复杂得多,但将同时加载a.js和b.js,而不会相互阻塞或其他任何东西。最终,
async
属性将得到正确的支持,您可以像同步加载一样轻松地完成这项工作。