有没有理由不使用<script defer =“”> TODAY?

时间:2017-03-01 22:57:05

标签: javascript html5 deferred-loading external-script

曾几何时,&lt; head&gt; &lt; body&gt; 中的&lt; script&gt; 引起了激烈的争论。

&#xA;&#xA;

许多SO帖子已经指出最佳做法 / 经验法则是放置 &lt; script&gt; &lt; body&gt; 结束之前,不阻止html解析器,从而加快了第一次屏幕绘制和客户端更快的DOM访问速度,从而提供了更好的用户体验。

&#XA;&#XA;
&#XA;

这必须是重复的╰(`□')╯

&#xA;
&#xA;&#xA;

等待... &lt; script&gt; < / code>现在可以 deferred ,实际上已经有一段时间了!

&#xA;&#xA;

旧帖子说

&#xA;&#xA ;
&#XA;

延迟脚本可能导致JS依赖性问题

&#xA;
&#xA;&#xA;

不,它不会。它在解析DOM时立即保留执行顺序。

&#xA;&#xA;
&#xA;

它不适用于跨供应商

&#xA;
&#xA;&#xA;

是的,它曾经是,但今天它几乎得到所有主要浏览器供应商的支持: http://caniuse.com/#search=defer ,除了IE可能有问题&lt; 10正如评论所指出的那样。

&#xA;&#xA;

然而,它提供的好处似乎是显而易见的,至少在我看来,因为它在早期时间(在开始解析之前)并行下载脚本DOM),因此无需稍后请求脚本并缩短整个页面交互式所需的时间。

&#xA;&#xA;

简而言之,这个问题类似于:任何有理由不使用

&#xA;&#xA;
 &lt; head&gt;&#xA; ...&#xA;&lt; script src = 'cdn / to / jquery'defer&gt;&#xA;&lt; script src ='cdn / to / bootstrap'defer&gt;&#xA;&lt; script src ='script / depends / on / jqueryandbootstrap'defer&gt;&#xA ;&lt; / head&gt;&#xA;  
&#xA;&#xA;

改为使用:

&#xA;&#xA;
 &LT;身体GT;&#XA ;. ..&#xA;&lt; script src ='cdn / to / jquery'&gt;&#xA;&lt; script src ='cdn / to / bootstrap'&gt;&#xA;&lt; script src ='script /依赖/ on / jqueryandbootstrap'&gt;&#xA;&lt; / body&gt;&#xA;  
&#xA;&#xA;

&#xA;注意:这个可能是一个有很多讨论的“古老”话题。但是,随着Web技术的快速发展,浏览器供应商更好地与新的Web规范保持一致,许多旧的stackoverflow答案可能无法保持最新​​。&#xA;

&#xA;

2 个答案:

答案 0 :(得分:3)

是的,但这只是因为你正在使用jQuery。

jQuery doesn't work with defer因为它会在页面变为交互式时立即触发。他们可以很快修复它(我在一年前提出了这个错误),因为改变准备行为以使用defer会破坏许多依赖于jQuery准备事件触发的组件on interactive(即在延迟脚本完成加载之前)。

如果您正在使用更现代的框架(React,Angular 2,Polymer,Vue或其他任何东西),那就去吧 - 或者甚至转到下一步并使用<script type=module IE浏览器中的新浏览器和旧版捆绑包。{/ 1}。

答案 1 :(得分:0)

here所述,您应该考虑对浏览器的支持,因为其中一些并不真正支持它。 IE <= 9中的某些版本(例如this one)中也存在一些众所周知的错误。

如果您的目标不是支持旧版浏览器(找到完整的支持列表here),那么没有真正的理由不选择推迟。