<script> 标签应该放在 HTML 的什么位置?<link> 呢?

2024年7月10日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

<script> 应该放在 HTML 文件的什么位置?

<script> 可以放在 HTML 文件中的任意位置,不论是 <head><body> 甚至是 <div> 中,具体位置取决于要引入 JavaScript 档案的功能以及加载顺序的需要。

但要注意的是,HTML 解析的顺序是由上而下依序载入。也就是说,放置的位置会影响到加载的顺序。

此外,浏览器解析 HTML 时,会由上而下依序载入内容。当遇到 <script> 标签时,浏览器会暂停 HTML 解析,先下载并执行 JavaScript 档案,然后再继续解析剩余的 HTML 内容。

当 JavaScript 档案特别大、或是档案是从外部资源载入的,有可能会受到网路传输或外部伺服器的影响,如果加载过程太长,会阻塞 HTML 页面的解析,将会导致页面长时间停滞,影响使用者体验。

基于上述的原因,大部分会建议 <script> 放置在 </body> 底部前,这样做有以下好处:

  1. 画面更快呈现:浏览器会先解析完整个 HTML,再下载 JavaScript 档案、解析,因此使用者可以在第一时间看到画面,有更好的用户体验
  2. 避免 Script 异动到还未载入的 HTML 元素:Script 有可能会异动到 HTML 元素,因此将 <script> 置于 <body> 的底部,可以确保 HTML 元素已经完全载入,减少异动元素造成错误的风险。

程式码范例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello World</title>
  </head>

  <body>
    <div>...</div>
    <div>...</div>
    <div>...</div>
    <div>...</div>
    <!-- <script> 置于 <body> 的底部 -->
    <script src="https://explainthis.com/script"></script>
  </body>
</html>

<script> 放置在 <head> 中的问题

下方程式码为例,

<html>
  <head>
    <script>
      // 尝试异动特定的 HTML 元素
      var header = document.getElementById("header");
      header.innerHTML = "异动过的文字";
    </script>
  </head>
  <body>
    <h1 id="header">原始的文字</h1>
  </body>
</html>

因为 <script> 是放在 <head> 中,当页面载入时,Script 会立即执行,此时 HTML 元素还未载入 DOM,因此

document.getElementById("header")

会回传 null,导致错误。

这就是为什么在某些情况下,放置 Script 于网页的 <head> 中会造成错误的原因。

<script> 放置在 <body> 尾部的问题

但其实,<script> 放在尾部的也是有一些缺点,例如:网页一开始会没有功能性。因为 <script> 最后加载,所以功能还没有被载入,这种情况可能会导致使用者虽然看到画面,但却没有功能性的情况发生。

所以将 <script> 放在尾部也不是最优解,更好的方式,会是透过 defer 或 async 一边解析页面,一边下载 JavaScript。我们在 《<script> 的 async 与 defer 有什么不同?》 中有完整的说明。

<link> 应该放在 html 文件的什么位置?

<link> 标签通常应放置在 HTML 文件的 <head> 区域内。这个标签主要用于连接外部资源,如 CSS 样式表、字型档案和网站图示。

以下是一个简单的范例:

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
    <!-- 网页内容 -->
  </body>
</html>

<link> 放置在 <head> 内,可以确保浏览器在渲染网页内容之前已经载入所需的外部资源,所以当使用者开始看到画面时,样式不会有奇怪的变动。

如果把 <link> 放在页面的底部,那么当浏览器载入时,它会先载入页面的内容,然后再载入 CSS。因此,样式一开始会是浏览器预设,接着才会变成预期的样式。


相关文章

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們