我已经将我所有的js库捆绑到一个大文件中,以节省大量的http请求。
但由于某些原因,下载这个1.2mb的捆绑包需要9.29秒(有时+15)。
在这种情况下,捆绑包没有缩小,但即使缩小了,783kb也需要4-7秒,所以也好不到哪里去。
但最大的谜团是:如果我快5-6次刷新页面,那么加载时间就会正常(~150ms)。每次我刷新的时候,它都是正常的。但如果我等了5分钟。也不要提出任何要求。然后加载时间再次变慢。
而且当我在本地环境中运行我的应用程序时,它总是加载得很快。
现在我有两个问题要问大家:
1:将我所有的库连接到一个文件中是错误的吗?
2:为什么在我的情况下,下载~1mb几乎需要10秒?
请务必查看图片,其中显示了请求加载时间和我的请求标头
发布于 2018-08-03 09:03:47
1:“将我所有的库连接到一个文件中是错误的吗?”
这里没有正确和错误的答案,它在很大程度上取决于捆绑包中的内容,以及它的使用方式(所以我假设您通常关心加载速度)。一些想法:
一般来说,合并和缩小JS、CSS总是一个好主意(图像应该合并到sprites
中)。更少的字节将传输更快,更少的请求产生更少的开销,哦,它的成本更低。但是..。
2:“为什么在我的情况下,下载~1mb几乎需要10秒?”
你自己说的--“本地环境……总是加载得很快”。你的问题是数据必须传输的距离,而不是它的包装有多好。在本地主机上运行几乎是瞬间的,无论你加载多少脚本,通过互联网往返都会增加建立连接的延迟。你的传输速度受到浏览器和服务器之间最慢的“链条中的一环”的限制。
为了减少你的计算机和服务器之间的距离,你应该考虑缓存你的文件,并在CDN后面托管它们。来自浏览器的请求被路由到CDN边缘位置服务器,该服务器在地理上是请求者的本地位置。如果CDN之前已经缓存了请求,它会立即返回(距离要短得多,所以更快)。如果CDN Edge location尚未缓存文件,它会代表您的最终用户(通过超级快速的专用网络)向您的服务器(称为Origin
)发出请求,如果headers允许缓存该文件以备将来的请求。
缓存可能会导致很大的问题,所以我的建议是使用cache busting query string
。这提供了CDN和浏览器级缓存的好处-即巨大的速度改进,但仍然允许您轻松更新代码,并确保访问者检索到最新版本。假设您有一个缩小的文件~/minified.js
,您可以将其引用为~/minified.js?v=1
(名称/值并不重要)。将来,您可以替换~/minified.js
,并将您的标记更新为~/minified.js?v=2
。这需要你实际的超文本标记语言不被缓存,或者至少使用短暂的缓存,但这意味着浏览器将把v=1
和v=2
作为两个独立的请求,所以会下载/缓存它们。
其他一些想法:
critical path
脚本,它很小,下载速度很快,并且包含允许页面开始呈现的最小脚本。然后是一个更大的、延迟加载的脚本,其中包含稍后在页面加载过程中下载的所有其他内容。虽然这增加了传输文件的总开销,并且基本上回避了这个问题,但它可以让您的页面更快地开始呈现,使它们更快地“显示”。此外,您可以将关键路径代码嵌入到HTML中-向初始有效负载添加几KB,以换取脚本在HTML生成后立即可用。parsed.https://stackoverflow.com/questions/51654706
复制相似问题