我正在尝试分析一个网站的性能,我非常有信心通过加载页面上的JavaScript文件来降低速度。
页面上多次包含相同的JavaScript文件,<script />
标记分散在整个页面中,而不是included at the bottom。
正如我所怀疑的那样,在查看FireBug的“网络”标签时,大部分时间(并非全部)加载JavaScript时,都不会请求其他文件。浏览器等待JavaScript完成加载。
然而,有一些例外。在某些情况下加载JavaScript,但同时,其他资源似乎被加载,例如其他JavaScript文件和图像。
我一直以为JavaScript会阻止页面上其他资源的加载。我是否认为这是错误的,或者这种行为是否因浏览器或浏览器版本而异?
更新
对于那些解释了如何加载脚本阻止加载其他资源的人,我已经意识到了这一点。我的问题是为什么脚本不会阻止加载其他资源。 Firebug显示某些JavaScript文件不阻止加载其他资源。我想知道为什么会这样。
答案 0 :(得分:7)
Javascript资源请求确实是阻塞的,但是有很多方法可以解决这个问题(例如:头脑中注入了DOM的脚本标记,以及AJAX请求),而且我自己看不到这个页面可能就是这里发生的事情。
包含相同JS资源的多个副本非常糟糕但不一定是致命的,并且是典型的大型网站,可能是因为单独的团队的工作,或者仅仅是旧的不良编码,计划或维护。
至于雅虎建议将脚本放在正文的底部,这会提高 percieved 响应时间,并且可以在一定程度上改善实际加载时间(因为所有以前的资源都允许异步第一),但它永远不会像非阻塞请求那样有效(尽管它们具有很高的技术能力障碍)。
非阻塞JS here的相当不错的讨论。
答案 1 :(得分:2)
我并不完全确定Firebug真实地反映了浏览器中发生的事情。资源加载的时机似乎很好,但我不确定它是否真正反映了究竟发生了什么。我有幸使用HTTP嗅探器/代理应用程序来监控来自浏览器的实际HTTP请求。我使用Fiddler,但我知道还有其他工具。
简而言之,这很多都是工具的问题,而不是资源的实际加载方式......至少值得排除。
答案 2 :(得分:1)
我认为您使用的是Firefox 3.0.10和Firebug 1.3.3,因为这些是最新版本。
Firebug 1.4 beta在网络标签上做了很多改进,但它需要Firefox 3.5。如果要在Firefox 3.0中进行测试,请使用之前的1.4 alpha versions之一。但即使有了改进,我仍然很难理解结果。我希望Firebug开发人员能够更准确地记录下载的每个部分的含义。对我来说,连接后为什么排队是没有意义的。
我的结论是不相信Firebug中的结果,最终使用WebPageTest。来自美国在线的这一点非常好; - )
此外,与javascript同时加载什么样的资源?尝试追踪同时加载的资源,看看它是否在css / iframe / html-ajax中引用。我猜测没有其他任何东西被加载的原因,是因为浏览器在看到脚本标记(没有延迟)时停止解析当前的HTML。由于无法继续解析HTML,因此无需再请求。
如果您可以提供指向您正在谈论的网页的链接。这将有助于每个人提供更准确的答案。
答案 3 :(得分:0)
我认为内容是下载的,但在JavaScript加载完成之前不会呈现。
从服务器的POV来看,这不是什么大不了的事,但对用户而言,它可以在速度上产生巨大的差异。
答案 4 :(得分:0)
如果您考虑一下,标记必须先完成处理才能继续呈现内容。如果标签使用了document.write或其他一些非常愚蠢的东西怎么办?在脚本标记内的任何内容完成运行之前,页面无法确定它将显示的内容。
答案 5 :(得分:0)
浏览器通常会为一个域打开一定数量的连接 因此,如果您从同一个域加载所有脚本,通常会一个接一个地加载它们 但是,如果这些脚本是从多个域加载的,那么它们将并行加载。
答案 6 :(得分:0)
浏览器在JavaScript下载期间阻止的原因是浏览器怀疑在脚本中会创建DOM节点。
例如,脚本中可能存在“dcoument.write()”调用。
一种向浏览器提示脚本不包含任何DOM生成的方法是使用“defer”属性。 所以,
<script src="script.js" type="text/javascript" defer="defer"></script>
应该允许浏览器继续并行化请求。
参考文献:
http://www.w3.org/TR/REC-html40/interact/scripts.html#adef-defer
答案 7 :(得分:0)
正如其他人所说,脚本可能正在通过DOM注入加载其他资源。
Script.aculo.us实际上通过这样做加载其子组件/脚本 - 将其他<script>
标签注入DOM中。
如果您想查看是否是这种情况,请使用Firebug的分析器并查看脚本正在执行的操作。
答案 8 :(得分:0)
与其他人说的一样,一种非阻止方法是在页面<script>
中注入head
个标签。
但是firefox也可以并行执行加载的<script>
:
复制以下两行:
http://streetpc.free.fr/tmp/test.js
http://streetpc.free.fr/tmp/test2.js
然后转到this page,粘贴输入textarea,单击“JavaScript”,然后“加载脚本”(构建并向<script>
添加head
子元素)。
在FF中尝试:你会看到“test2 ok”,移动对话框看“test ok”。 在其他浏览器中,您应该看到“test ok”(后面没有其他对话框)然后“test2 ok”,(Safari 4除外,在测试前显示tes2)。
答案 9 :(得分:0)
Firefox 3引入了连接并行功能,以便在加载网页时提高性能,我敢打赌这是您问题的根源;)
当您打开包含许多内容的网页时 它上面有不同的对象,比如图像, Javascript文件,框架,数据源, 等等,浏览器尝试 立即下载其中几个 获得更好的表现。