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