什么JavaScript应该包含在<head>中以及<body>中包含的内容?

Yug*_*dle 26 html javascript css jquery

我很困惑哪些JavaScript应该包含在哪里?

例如:

  • 应该在哪里包含jQuery库?在<head>关闭</body>元素之前还是之前?

  • 如果JavaScript在底部定义<body>,它可以在体内使用吗?

  • 如果它阻止并行下载,那为什么它从未说过将CSS包含在底部呢?

Jos*_*eph 22

CSS

加载CSS是<head>为了防止Flash Of Unstyled Content(FOUC),这种情况下你的页面会在瞬间显示没有样式.加载它们<head>是一个小小的牺牲,以确保在呈现内容时您的页面看起来很完美.

JS

一般案例:

JS在底部加载了几个(但不限于以下)原因:

  • 这样它就不会阻止其他资源的加载和页面的呈现.

  • JS的传统用法是增强,如客户端验证和次要特效.这些通常是可选的,不会影响页面的总体用途.因此它们最后加载.

  • 在内容之后添加脚本可确保安全访问脚本引用的元素,因为它们已经在DOM上.

例外:

但该规则有一些例外:

  • "飞行前图书馆",如Modernizr

    Modernizr在<html>标签上应用类来表示功能的可用性,这些功能可用于JS和CSS目的.延迟这种情况可能会因类添加而导致样式突然转移,以及由于先前没有进行检查而导致JS损坏.

  • 像LESS/SASS这样的CSS解析器和影响样式的脚本

    远程LESS/SASS样式通过AJAX加载,因此无论样式是否准备好,页面都会呈现.将它们装入头部将使它们尽可能早地加载样式以避免FOUC.

  • 像RequireJS这样的"Bootloader库"需要尽早加载以并行下载其他脚本.

  • Web应用程序需要JS作为平台.你最好早点加载这些库.此外,在webapp中,应用程序运行之前存在最少的页面内容.

边缘案例:

这里有两个值得提及的脚本属性,它们是deferasync.

基本上,我们的想法是defer只在解析DOM之后运行脚本标记,并且async异步加载脚本的脚本标记不会阻止其他操作.可以暗示您可以在头部使用脚本,应用于async并行加载它们,并defer确保DOM在执行时已准备好,但每个都有它自己的问题.

这是一个MDN文档,解释了它们的内容以及几乎可以解释它们的历史,支持和当前状态的答案.

  • 我总是习惯使用术语FOBUC(Butt-Ugly内容的Flash),但我认为它是"FOUC". (7认同)

use*_*064 10

<script>元素的位置

脚本元素阻止渐进式页面下载.
浏览器一次下载几个组件,但是当它们遇到外部脚本时,它们会停止进一步下载,直到下载,解析和执行脚本文件.
这会损害整个页面时间,尤其是在页面加载期间多次发生这种情况时.
要最小化阻止效果,可以将脚本元素放在页面末尾,就在结束标记之前.
这样,脚本就没有其他资源可以阻止.其余的页面组件将被下载并且已经吸引用户.
最糟糕的反模式是在文档的头部使用单独的文件:

<!doctype html>
<html>
<head>
    <title>My App</title>
    <!-- ANTIPATTERN -->
    <script src="jquery.js"></script>
    <script src="jquery.quickselect.js"></script>
    <script src="jquery.lightbox.js"></script>
    <script src="myapp.js"></script>
</head>
<body>
...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

更好的选择是组合所有文件:

<!doctype html>
<html>
<head>
    <title>My App</title>
    <script src="all_20100426.js"></script>
</head>
<body>
    ...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

最好的选择是将组合脚本放在页面的最后:

<!doctype html>
<html>
<head>
    <title>My App</title>
</head>
<body>
    ...
    <script src="all_20100426.js"></script>
</body>
Run Code Online (Sandbox Code Playgroud)

"JavaScript模式,Stoyan Stefanov(O'Reilly).版权所有2010 Yahoo!,Inc.,9780596806750."