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

Xle*_*lee 15 javascript html5 external-script deferred-loading

曾几何时,有很多激烈的争论<script><head><body>.

许多SO帖子已经指出了最佳实践/经验法则<script><body>不阻止html解析器之前放置前端,从而更快地获得第一次屏幕绘制和更快的客户端DOM访问,从而获得更好的用户体验.

这必须是重复的("□")╯

等等...... 现在<script>可以deferred,实际上已经有一段时间了!

老帖说

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

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

它不适用于跨供应商

是的,它曾经是,但今天它几乎得到了所有主要浏览器供应商的支持:http://caniuse.com/#search=defer,除了评论指出IE <10之外可能还有一些问题.

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

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

<head>
...
<script src='cdn/to/jquery' defer>
<script src='cdn/to/bootstrap' defer>
<script src='script/depends/on/jqueryandbootstrap' defer>
</head>
Run Code Online (Sandbox Code Playgroud)

而是使用这个:

<body>
...
<script src='cdn/to/jquery'>
<script src='cdn/to/bootstrap'>
<script src='script/depends/on/jqueryandbootstrap'>
</body>
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*ith 6

是的,但只是因为您使用的是 jQuery。

jQuery 无法使用,defer因为它会在页面变为交互式时立即触发。他们无法在短期内修复它(我在一年前提出了那个错误),因为更改就绪行为以使用defer将破坏许多依赖于交互式 jQuery 就绪事件触发的组件(即在延迟脚本完成加载之前) .

如果您使用的是更现代的框架(React、Angular 2、Polymer、Vue 或几乎任何其他框架),那么请继续使用它 - 或者甚至转到下一步并<script type=module在新浏览器中使用并在<script nomodule defer...IE 中使用旧版包。