Skip to content

【HTML】metadata 、<meta> 知多少 #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
SimoneCheng opened this issue Jan 29, 2022 · 0 comments
Open

【HTML】metadata 、<meta> 知多少 #3

SimoneCheng opened this issue Jan 29, 2022 · 0 comments

Comments

@SimoneCheng
Copy link
Owner

SimoneCheng commented Jan 29, 2022

🐳 前言

今天想要研究的主題是,網頁前端世界裡的三本柱 ── HTMLCSSJavaScript 之中的 HTML。雖然 HTML 並非如同 JavaScript 有很多程式語言相關的主題與議題能夠探討,但是也是有一些有趣的主題值得研究和探索。

之前在寫 side project 或是技術面試被問到該如何優化 SEO 時,當時只有辦法大概回答出可以透過 HTML 當中的 metadata 去優化 SEO,但是並不清楚 metadata 實際上有哪些用法,或是可以做到哪些事情,所以這次想要試著以一種更詳細和全面的角度來理解 HTML 當中會使用到的 metadata 和 <meta> 這兩個東西。(當然有機會的話,之後也想要寫一個 SEO 的系列文來理解 SEO 和知道如何優化它)

本文架構如下:

  • metadata 是什麼? → 首先會先定義 metadata 是什麼
  • metadata 有哪些? → 接著解釋 metadata 在 HTML 當中的應用
  • 淺談 <meta> → 最後會對 <meta> 這個用法做更深入的研究

你可能要有的先備知識:

  • 知道 HTML 是什麼
  • 了解 <head><body> 的差別

🐳 metadata 是什麼?

首先可以先從現有的網路資源當中,去尋找 metadata 的定義。在 MDN 文件當中,解釋了什麼是 metadata:

Metadata is — in its very simplest definition — data that describes data. For example, an HTML document is data, but HTML can also contain metadata in its <head> element that describes the document — for example who wrote it, and its summary.

直接翻譯的話,metadata 的意思就是「描述資料」的資料,這樣子聽起來可能還是一頭霧水,但如果我們以一個實際的例子來說明的話,可能會清楚許多。

假設現在有一個猜拳遊戲網頁的 HTML 檔,架構如下:

<!DOCTYPE html>
<html lang="zh-Hant-TW">
    <head>
        <!-- metadata, 使用者不會看到,但是會提供這個 HTML 檔相關的資訊,例如以下四行 -->
        <meta charset="UTF-8">
        <meta name="description" content="猜拳遊戲">
        <link rel="stylesheet" href="style.css">
        <title>Rock_Paper_Scissors Game</title>
    </head>
    <body>
        <!-- 使用者會看到的內容 -->
        <header></header>
        <main></main>
        <footer></footer>
    </body>
</html>

通常在 <body> 這個標籤中會放滿希望讓使用者看到的畫面;另外將描述這個網頁的資訊,比如這個網頁的作者、這個網頁的用途、這個網頁的編碼方式、要套用的 css 檔、要套用的 JavaScript 檔等等,放在 <head> 這個標籤當中。

這些放在 <head> 當中的資訊,並且用來描述這個 HTML 網頁檔是要用來做什麼、或是要運行什麼東西,都可以稱之為 metadata。通常這些 metadata 的資訊會被搜尋引擎的爬蟲爬取並解析,於是我們可以在這裡很簡單地暴力推測:如果 metadata 寫得越完整,對 SEO 的幫助越大,也可以說是優化 SEO 的方法之一。

🐳 metadata 有哪些?

在上一個小節理解 metadata 的定義之後,那接下來的問題就是:實際上要如何在 HTML 當中寫出 metadata 呢?這也是本小節試圖回答和整理的問題。

🦀 <title>

在每個 HTML 檔的 <head> 當中,基本上一定都會有 <title> 這個標籤(tag),它的語法如下:

<title>Insert Title Here | Follow it with the Website Name if you Wish</title>

藉由 title 這個標籤,可以讓搜尋引擎知道這個網頁的名稱,並將它顯示在搜尋結果頁上面。或是也可以在瀏覽器的頁籤上看到 <title> 的內容,讓使用者知道自己目前在哪個網頁,比如說進到臉書首頁時,在瀏覽器頁籤上看到 Facebook 字樣,是因為 <title>Facebook</title> 的緣故。

🦀 <link>

<link> 這個標籤的用途蠻多元的,目前我自己最常用到的是將 CSS 檔引入到 HTML 當中,讓網頁上的元素可以套用樣式,除此之外還有一些其他的用途,例如:加入網頁的 Logo、用標準網址(Canonical URL)整合重複性的網址等等。

CSS 檔引入(Load Stylesheets)

平常在撰寫網頁時,除了需要 HTML 來建立網頁的架構,也會需要 CSS 來讓網頁上的內容套用美美的樣式,通常會將 CSS 樣式寫在另外一個檔案裡,再引入到 HTML 當中,可以使用以下語法來引入:

<link href="[fileName].css" rel="stylesheet">

加入網頁 Logo(Add a Favicon)

打開一個網頁時,頁籤上除了會顯示 <title> 中的網頁名稱之外,也會看到在網頁名稱前面有個小小的 Logo(叫做 favicon),這個小小的 Logo 可以透過以下方式來新增到網頁當中:

<link href="favicon.ico" rel="icon">

隨著網路不斷演進,目前客戶端有多種瀏覽器和設備,所以 favicon 為了演進的需要也提供的多種置入的方式,比如不一定要用 .ico 的格式, .png、.svg 也可以,每個瀏覽器或是設備當中看到的 favicon 最佳大小可能也不相同。由於本文學習和研究的重心主要是在 <meta> ,對這部分的內容可能不夠詳盡,若想深入了解的話,也許可以參考這則在 stackoverflow 上的討論:HTML 5 Favicon - Support?

標準網址 (Canonical URL)

假設目前有以下的網址:

http://www.example.com/
http://www.example.com/index.html
http://example.com/
http://example.com/index.html

但其實這些網址連到的都是同一個網頁,或是在不同網頁上提供相似度極高的內容(例如:行動版和電腦版的網頁,兩者是不同網址但內容幾乎相同)。Google 搜尋引擎便會將這些不同的網址視為相同網頁的重複版本,從中選出一個網址作為「標準」版本進行檢索,然後將其他網址判定為「重複」網址並降低搜尋引擎爬取的頻率。

如果我們沒有設定一個標準網址的話,Google 搜尋引擎本身就會自己幫我們決定一個標準網址。為了避免這件事情發生,我們其實可以透過以下語法來設定一個自己想要的標準網址:

<link rel="canonical" href="http://www.example.com/" />

這也是 <link> 的用途之一。有關標準網址相關資訊,可以參考 Google 搜尋中心的說明:整合重複的網址。更多有關 <link>詳細的屬性解說可以參考 MDN 文件:: The External Resource Link elementLink types

🦀 <base>

<base> 標籤主要是控制網頁的連結屬性,可以指定網頁的連結根目錄,也可以指定網頁超連結的開啟方式,屬性有 href、target。我們可以直接來看以下兩個範例:

<html>
  <head>
      <title>這是標題</title>
      <!-- HTML base href, target 範例設定 -->
      <base href="https://www.example.com" target="_blank">
  </head>
  <body>
      <a href="products">產品資訊</a>
      <a href="about-us">關於我們</a>
      <a href="faq">問與答</a>
  </body>
</html>
<html>
  <head>
      <title>這是標題</title>
  </head>
  <body>
      <a href="https://www.example.com/products" target="_blank">產品資訊</a>
      <a href="https://www.example.com/about-us" target="_blank">關於我們</a>
      <a href="https://www.example.com/faq" target="_blank">問與答</a>
  </body>
</html>

以上兩個程式碼達成的效果其實是相同的。上面的程式碼有使用 <base>,直接指定整個網頁的連結開頭,還有這個網頁按下超連結時會使用開啟新分頁的方式,所以就不需要針對每一個 <a> 進行處理;下面的程式碼沒有使用 <base>,所以便會針對每一個 <a> 進行處理。

另外需要注意的是:只要有設定 <base>href,任何網頁中的連結都會被它給覆蓋過去。更多有關 <base> 的用法可以參考這些資源:base html 標籤是什麼? html tag 設定網頁連結 - SEAN 工作版: The Document Base URL element - MDN

🦀 <script>

可以使用 <script> 這個標籤來引入 JavaScript,執行一些這個 HTML 網頁所需要的程式碼,比如 CDN 、Gooogle Analytics、網頁互動邏輯等等,可以使用以下兩種不同的方式引入:

// 方法一:直接將 JavaSript 寫在裡面
<script> 
 <!-- 要執行的 JavaScript -->
</script>

// 方法二:插入一個 JavaScript 檔
<script src="[folder_name]/[file_name].js"></script>

另外在使用 <script> 這個標籤時,可以特別注意某些屬性是怎麼使用的,比如說:deferasync 的差別type="module" 怎麼用等等。更多詳細的屬性解說可以參考 MDN 文件:<script>: The Script element

🦀 <meta>

除了上述使用到的標籤之外,可能也還有很多 metadata 需要寫進 HTML 檔裡,比如這個網頁的編碼方式、這個網頁的作者、這個網頁的描述等等,這些都可以使用 <meta> 這個標籤來實現。簡單來說,除了前面提到的標籤以及它們的用途之外,其他的 metadata 都可以寫在 <meta> 這個標籤中,在下一個部分會針對 <meta> 的屬性做更詳細的理解與介紹。

🐳 淺談 <meta>

在這個部分會一一介紹幾個 <meta> 當中常用到的 attribute,了解這些 attribute 的用途。

🦀 name、content

首先第一個登場的 attribute 就是 name 和 content。name 和 content 可以用來描述一個網站的資訊,像是這個網站的作者、這個網站的描述、圖片等等,通常這兩者可以寫在一起,比如下面的範例:

<meta name="author" content="Simone">
<meta name="description" content="This is my page">
<meta name="image" content="xxx.jpg">

這三行程式碼如果直接寫成中文的話,大概呈現的方式如下:

作者:Simone
網站描述:This is my page
圖片:xxx.jpg

同時,這些資訊也可以讓搜尋引擎查詢,讓搜尋引擎知道這個網頁到底是什麼樣的網頁。

另外有一個可能需要特別注意的地方:

<meta name="keywords" content="html, css, javascript">

以往 name 有一個 keywords 的寫法,表示這個網站會用到的關鍵字,提供搜尋引擎尋找,但目前 Google 有說搜尋引擎目前不會查詢 keywords 了。所以如果有需要的話,可以改成寫在 meta description 當中。

🦀 charset

charset 這個 attribute 是用來設定該網頁會用何種方式來進行編碼,比如以下的範例使用 utf-8 方式還進行編碼,也是目前網頁常用到的編碼方式。HTML5 預設的編碼方式也是 utf-8。(編碼的方式有非常多種,也許之後也可以寫筆記來研究研究)

<meta charset="utf-8">

🦀 http-equiv

http-equiv 會告訴瀏覽器該如何處理這份文件。

在對伺服器發出 request 之後,伺服器會回傳 reponse,通常 response 裡面會有 headers。在 meta 當中使用 http-equiv 時,http-equiv 所包含的資訊會類似於 reponse 傳回來的 headers,比如下面兩個範例的意思其實是差不多的:

<!-- metadata in HTML -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
// 伺服器回傳的 headers
Content-Type: text/html; charset=utf-8

所以 http-equiv 可以理解成 HTTP response headers equivalent,當中的 equiv 其實就是 equivalent 的意思。

不過,HTTP response 不是都會有 headers ?為什麼還要在 HTML 文件放入類似的資訊?有可能使用者無法直接獲得 HTTP response headers,所以就需要靠 http-equiv 的資訊了。

http-equiv 還有另外一個用法是 refresh,可以設定幾秒過後重新整理,或是幾秒過後重新導向某個網址,比如以下的程式碼:

<!-- 3 秒後重新整理頁面 -->
<meta http-equiv="refresh" content="3">

<!-- 5 秒後導向 http://www.example.com -->
<meta http-equiv="refresh" content="5; url=http://www.example.com">

目前 HTML5 請直接使用 <meta charset="utf-8"><meta http-equiv="content-type" content="text/html; charset=UTF-8"> 是 HTML4 在用的。

🦀 Open Graph

平常在各個社群網站分享網址的時候,除了將一串網址貼到貼文上面之外,是不是還會看有一個區塊,上面會有你分享的網站的標題、敘述、圖片等等,例如下圖:

沒錯,上圖中用紅色框起來的部分就是用 Open Graph 辦到的,讓使用者在社群當中分享網站時,可以顯示美美的畫面,且只需要在 <meta> 當中寫下以下程式碼就可以辦到了:

<meta property="og:title" content="Open Graph protocol">
<meta property="og:type" content="website">
<meta property="og:url" content="https://ogp.me/">
<meta property="og:image" content="https://ogp.me/logo.png">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="300">
<meta property="og:image:height" content="300">
<meta property="og:image:alt" content="The Open Graph logo">
<meta property="og:description" content="The Open Graph protocol enables any web page to become a rich object in a social graph.">

Open Graph 的官方文件由此去:https://ogp.me/

🐳 結語

以上就是這次對 metadata、<meta> 的小小研究,透過這次的撰寫,得到的收穫大概是:對 metadata 和 <meta> 有更詳細的了解。同時也可以理解 metadata 當中對 SEO 有幫助的部分,例如:整合標準網址、將 <meta> 的 description 寫的詳細一點等等。

🐳 參考資源

@SimoneCheng SimoneCheng changed the title metadata 、<meta> 知多少 【HTML】metadata 、<meta> 知多少 Feb 18, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant