通过https并发加载.js文件

3
我们正在考虑将我们的.js文件拆分为两个域名进行服务,目的是实现并发加载。
问题:a) 我们可以使用子域来实现这一目的吗?b) 这种并发加载是否也适用于https?
例如,我们想要如下请求两个文件:
https://www.example.com/firstfile.js
https://subdomain.example.com/secondfile.js

可以做到吗?还有其他选择吗?

只是出于好奇,是否可以在提供文件之前将它们合并,这样无论如何您都只需要提供一个事务? - Romain
1
@Romain,这就是我们最终想要比较的...哪个更好:1个大的.js文件请求还是2个并发的较小的.js文件请求。 - DA.
5个回答

3
据我所知,这种方法行不通。脚本已经设置为阻止并发下载。原因是并发加载脚本可能会在 JavaScript 中导致竞争条件。压缩或按需加载是您的最佳选择。

如果我错了,请纠正我,但我认为并行下载问题仅限于单个域名。(顺便说一下,我们也在进行代码压缩) - DA.
并行“下载”和并行“执行”之间有区别,不是吗?我不明白为什么前者行不通;后者肯定是不可能的,原因如Matt所述。 - Pekka
我不担心并行执行。所有的执行都将被包含在jQuery的$(document).ready中。我们只是试图在服务器请求和下载速度方面寻找任何性能提升。 - DA.
雅虎的性能建议在这方面有很好的说明: http://developer.yahoo.com/performance/rules.html实际上,问题的关键在于JavaScript的本质。如果同时加载两个文件,则可能会出现未定义的行为,因为一个文件可以对其更改的内容产生影响,而文件完成的顺序可能导致不同的结果。如果您想加快速度,请查看动态加载或按需加载: http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/ - Matt
1
@DA,我完全理解并且这是一个有效的案例,请查看我发布的第二个链接。它们解释了如何使用小型初始脚本来加载其他脚本而不会阻塞,我必须承认我还没有完全阅读和尝试过。但它似乎符合您的需求。@Pekka,请检查我发布的参考资料。脚本的行为与其他组件不同。 - Matt
显示剩余2条评论

3

我认为你需要考虑网络的延迟时间(每次往返调用都会累加一种失去的时间)。延迟是导致HTTP调用响应速度变慢的主要原因。

个人而言,我遵循减少HTTP调用次数的趋势。
我将所有文件合并成一个文件(+ 最小化 + 压缩)


我同意最小化+gzip的部分。此外,我会确保服务器填充所有相关标头以改善缓存管理(Content-Expires等),这样友好的浏览器只需一次访问服务器。 - Romain

1
脚本引起的问题是它们阻塞并行下载。HTTP/1.1规范建议浏览器每个主机名最多同时下载两个组件。如果您从多个主机名提供图像,则可以实现超过两个下载并行进行。然而,在脚本下载时,浏览器不会启动任何其他下载,即使在不同的主机名上。(source
听起来很棘手。

@驼峰命名法:这正是我们这样做的确切原因。请注意“每个主机名”的部分。我们的想法是通过从多个域请求它,消除那些大型 .js 文件的问题。 - DA.
@DA 这应该是可能的,但我怀疑这是否会给您带来任何性能提升:脚本的执行仍然会一个接一个地运行,而下载只会发生一次,然后数据被缓存。 - Pekka
1
最后一句话是最重要的:“然而,在脚本下载时,浏览器不会启动任何其他下载,即使在不同的主机名上也是如此。” - camomileCase

0

a) 可以。使用document.domain来避免同源策略问题。

b) 我不知道,但我想不出任何理由为什么不应该这样做。


谢谢,Pekka。你能解释一下document.domain相对于直接从两个不同的URL请求文件有什么作用吗? - DA.
直接来说,“document.domain”只是确保来自域1的脚本不会在访问域2上的内容时出现安全问题(也称为同源策略)。 - Pekka

0
在编程领域,书籍《更快的网站》或《更快的网站之道》中提出了一种可供选择的方案,建议使用JavaScript函数/方法以图表形式加载JavaScript文件,并将子节点添加到元素中。我建议你阅读这些书籍并进行一些研究,因为这是一个很好的实践方法,值得你考虑。祝好!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接