iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Vue.js

Nuxt 3 實戰筆記系列 第 19

[Day 19] Nuxt 3 自動產生 Sitemap 網站地圖 - SEO 搜尋引擎最佳化系列

  • 分享至 

  • xImage
  •  

前言

Sitemap 網站地圖基本上都是由網頁開發人員進行製作,網站地圖內容包含了整個網站的連結,例如你的網站有首頁、文章列表、文章詳細頁面等,這些連結如果你想被搜尋引擎收錄,那麼就應該添加在網站地圖內,方便搜尋引擎的爬蟲做搜集。

當然,並不是所有搜尋引擎提供商都像 Google 有 Search Console 可以來提交網站地圖,所以這份網站地圖製作完成後會放置在網站的某處,這份網站地圖除了可以手動提供給搜尋引擎的服務商,也可以使用網址來進行訪問,讓不僅是 Google 的搜尋引擎的爬蟲可以來這個路徑下讀取網站地圖,以便收錄至其他搜尋引擎服務商的資料庫之中,通常以網站網址 /sitemap.xml 為多數,例如 https://www.apple.com/sitemap.xml 就可以看到網 Apple 網站的 Sitemap,網站地圖名稱命名為 sitemap.xml 算是一個約定成俗的名字了。

製作 Sitemap 對網站 SEO 的影響?能夠提升網站排名?

製作網站地圖最重要的一個優勢就是,能夠幫助搜尋引擎爬蟲能更快的收錄到你的網站。

以 Google 為例,搜尋引擎的爬蟲在網路世界蒐集網頁時,其中一種方式是利用網頁內提及的連結來進行拓展,所以就算沒有製作或手動提交 Sitemap,Google 或其他搜尋引擎仍有機會能夠爬取到你的網站資料,只是可能速度與機會不會這麼大,這會取決於你得網站在現有的全世界網頁中揭露的情況,這是比較被動的情況。

當然如果你已經製作好了,你可以扮演主動的一方,透過手動提交來告之 Google 或其他搜尋引擎來我的網站逛逛,並收錄進搜尋引擎資料庫之中,如此就能更快速的被使用者給搜尋到。

所以製作網站地圖,對於一個網站在搜尋引擎結果頁 SERP (Search Engine Results Page) 的排名沒有絕對關係,因為網站的排名由其他的更重要的資訊來演算,正確來說網站地圖所影響的並不是在網站排名

Sitemap 網站地圖的製作與格式

通常我們會先以 Google 的規則來作為首要實現的目標,製作網站地圖也只需要照著規則與語法就能快速的完成。

如下擷自 Google 所支援 Sitemap 格式與定義的比較圖,不同的 Sitemap 格式都有其優點和缺點,如果您是第一次使用 Sitemap 建議可以選擇 XML Sitemap 或文字 Sitemap。

https://ithelp.ithome.com.tw/upload/images/20231004/20152617QKzW6Eib3s.png

XML Sitemap

XML Sitemap 是系統可支援的 Sitemap 格式中用途最廣泛的。可以使用 Google 支援的 Sitemap 擴充元素,您也可以提供圖片影片新聞內容相關額外資訊,以及網頁的本地化版本

以下是相當基本的 XML Sitemap,只包含單一網址的位置,你也可以在 sitemaps.org 找到更複雜的範例和完整說明文件。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.example.com/foo.html</loc>
<lastmod>2023-09-16</lastmod>
</url>
</urlset>

文字 Sitemap

如果你想要更簡單一點製作 Sitemap,可使用簡單的文字檔案將網址條列,舉例來說,如果您的網站上有兩個網頁,可以依照下列方式將這些網頁加入 Sitemap:

https://www.example.com/file1.html
https://www.example.com/file2.html

其他製作 Sitemap 的方法

如果網站規模比較大一些,那麼條列網址或手動製作網站地圖就會比較花時間,所以有許多線上工具可以幫助你來產生網站地圖,比較常見與推薦的兩種製作工具如下:

  • XML Sitemaps Generator: 這是一個可以線上製作網站地圖的產生器,你只需要提供你的網站網址,例如 https://www.example.com/ 網址,產生器就會盡可能的爬取網站中所有的連結,並自動產生一個 Sitemap 檔案提供使用者下載,如果你的網站規模比較小,就可以使用他的免費額度來製作。
  • Screaming Frog SEO Spider Tool: 雖然是需要下載執行的應用程式,但是具備了爬蟲功能與豐富的參數,在 SEO 成效評估與搜尋引擎最佳化算是很實用的工具,該工具也可以用來製作 XML Sitemap圖片 Sitemap,對於電商產品網站或圖片比較多的網站也更加方便。

Nuxt 3 自動產生 Sitemap 網站地圖模組 - Nuxt Simple Sitemap

儘管有許多的線上工具與應用程式可以協助製作網站地圖,但在一些場景下仍不可避免無法自動產生出來,例如網址連結是動態產生的,網站內的列表不一定有完全揭露,最常見的如電商網站的產品、部落格文章的文章列表。

除了上述問題外,網站地圖的維護也需要人工介入,如果工具能契合 Nuxt 3 的專案來自動產生網站地圖,那麼將可以大大降低維護的成本,而 Nuxt Simple Sitemap 正是能自動產生網站地圖的模組。

Nuxt Simple Sitemap 不僅能自動產生網站地圖,也能為 Nuxt 3 伺服器提供一個網址入口 /sitemap.xml 來訪問自動產生的網站地圖,其網站地圖更是能依據頁面路由與處理動態連結的製作,在網站進行頁面或連結更新時、需要排除的連結,也都能同步的即時反應,讓維護成本降到最低。

安裝 Nuxt Simple Sitemap 模組的步驟如下

Step 1. 安裝套件

安裝 Nuxt Simple Sitemap 模組。

npm install -D nuxt-simple-sitemap

Step 2. 配置使用模組

在 ./nuxt.config.ts 中的 modules 屬性,添加模組的名稱 nuxt-simple-sitemap

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap']
})

Step 3. 開始使用

啟動開發伺服器

npm run dev

訪問預設自動產生的檔案 sitemap.xml,http://localhost:3000/sitemap.xml 網址,在瀏覽器中就可以看見條列出的網址連結與數量。

https://ithelp.ithome.com.tw/upload/images/20231004/20152617YdkCAYDh6l.png

上圖的頁面中,是模組幫我們添加樣式來方便瀏覽,如果想要確認原始的網站地圖 XML,你可以將模組的選項 xsl 設置為 false

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
  sitemap: {
    xsl: false
  }
})

https://ithelp.ithome.com.tw/upload/images/20231004/20152617A9d61ASbbe.png

當然,你也可以直接查看所接收到的原始碼,sitemap.xml 檔案的內容也正是使用 XML 格式的網站地圖。

https://ithelp.ithome.com.tw/upload/images/20231004/20152617WDXLUxirbh.png

Nuxt Simple Sitemap 運作方式

產生網站地圖所需的連結資料源

模組會使用下列三種方始來產生網站地圖內的連結:

  • 頁面檔案: 預設情況是會使用頁面檔案的路由連結來添加,如果要禁用可以將 inferStaticPagesAsRoutes 選項設定為 false
  • 動態路由: 針對如 [id].vue 這類需要參數的路由頁面,你需要額外的建立內部 API 來產生連結,模組就會將這批連結添加至網站地圖內。
  • 預渲染路由: 如果你有設定預渲染路由,路由網址也會被添加至網站地圖。

Nuxt Simple Sitemap 過濾或添加特定連結

如果有些網頁連結不希望被自動添加至網站地圖,或僅添加特定連結,你可以使用下列幾種方式來處理:

  • 模組選項 exclude

可以使用 exclude 模組選項來排除掉已有的連結,以陣列來表示多個連結的匹配模式,通常是管理頁面或不需要索引頁面等,例如調整 ./nuxt.config.tssitemap 設定,排除 (exclude) 掉登入與管理相關的頁面。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	sitemap: {
    exclude: ['/login', '/manage/**']
  }
})
  • 模組選項 include:

可以使用 include 模組選項來建立網站地圖,以陣列來表示多個連結的匹配模式,當你使用了這個屬性,網站地圖僅會列出包含的連結,並非以添加的方式至已有連結的網站地圖,例如調整 ./nuxt.config.tssitemap 設定,包含 (include) 文章列表,那麼網站地圖僅會有一個連結 /articles。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	sitemap: {
    exclude: ['/articles']
  }
})
  • Nitro 路由規則:

你可以修改 Nuxt ConfigrouteRules 屬性來來調整 Nitro 路由規則,同時也可以在路由規則中使用選項 index 來控制路由是否被添加至網站地圖中。

將路由規則 /manage/** 的選項 index 設定為 false,表示該路由不想被索引即不會被添加至網站地圖中,舉例來說,修改 ./nuxt.config.ts 如下,管理相關的頁面 /manage/** 禁止索引,便不會被添加至網站地圖中

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	routeRules: {
    '/manage/**': { index: false }
  }
})

反之如果 index 設定為 true,當然就會被索引添加至網站地圖,與模組選項的 include 的差異在,使用路由規則設定 index添加連結,所以很適合動態連結的頁面,甚至就算連結不存在路由中,也能添加至網站地圖中。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	routeRules: {
    '/manage/**': { index: false },
    '/articles/1': { index: true },
    '/articles/2': { index: true },
    '/test': { index: true }
  }
})

上述的動態連結 /articles/1/articles/2 與不存在的路由 /test 都能添加至網站地圖中。

https://ithelp.ithome.com.tw/upload/images/20231004/20152617I8ZbXTfLGD.png

Nitro 路由規則更多選項

前面我們提到,你可以設定 Nuxt ConfigrouteRules 屬性來來調整 Nitro 路由規則是否索引,在路由規則中,可以以個別設定每個連結的網站地圖 sitemap 屬性,例如 <priority><changefreq><lastmod> 的值。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	routeRules: {
    '/articles': { 
      sitemap: {
        changefreq: 'daily',
        priority: 1
      }
    },
    '/about': {
      sitemap: {
        changefreq: 'monthly',
        priority: 0.8,
        lastmod: '2023-09-16 00:00 +08:00'
      }
    }
  }
})

XML Sitemap 的屬性值注意事項

  • Google 會忽略 <priority> 和 <changefreq> 值。
  • Google 會使用 <lastmod> 值,前提是該值必須始終保持準確且可供驗證 (例如可將該值與網頁上次修改的版本進行比較)。

Nuxt Simple Sitemap 模組自動調整最後修改時間

XML Sitemap 每個條目皆可以設定一個最後修改時間的屬性 <lastmod>,預設情況下模組將會自動檢查路由頁面檔案的修改時間 mtime 來進行關聯,如果檔案與時間無法正確關聯則會使用目前時間。

你也可以調整模組選項 autoLastmodfalse,來禁用自動調整最後修改時間的行為。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
  sitemap: {
    autoLastmod: false
  }
})

Nuxt Simple Sitemap 模組預渲染注意事項

當你的網站使用預渲染作為建構打包步驟的一部分時,你需要設定網站的基礎 URL 才能為網站產生正確規範的連結。

你可以調整 Nuxt Config 的 site.url 屬性,設定網站網址作為基礎 URL。

export default defineNuxtConfig({
  site: {
    url: 'https://example.com'
  }
})

或者使用調整 .env 檔案來建立環境變數

NUXT_PUBLIC_SITE_URL=https://example.com

Nuxt Simple Sitemap 模組處理動態連結

對於網站內不確定或動態的頁面連結,因為無法自動被索引,所以你可能需要手動添加至網站地圖內,Nuxt Simple Sitemap 模組推薦建立內部 API 的方式來自動處理這些動態連結,預設情況模組會檢查 /api/_sitemap-urls 這個 endpoint,我們只需要實作內部 API 可以列出動態路由的連結列表,模組就能自動將這些連結添加至網站地圖內。

首先我們建立 ./server/api/_sitemap-urls.js 檔案,來實作 /api/_sitemap-urls API,範例程式如下:

export default defineEventHandler(() => {
  return [
    {
      loc: 'http://localhost:3000/articles/1',
      changefreq: 'monthly',
      priority: 0.8,
      lastmod: '2023-09-16 00:00 +08:00'
    },
    {
      loc: 'http://localhost:3000/articles/2',
      changefreq: 'monthly',
      priority: 0.8,
      lastmod: '2023-09-17 00:00 +08:00'
    },
    {
      loc: 'http://localhost:3000/articles/3',
      changefreq: 'monthly',
      priority: 0.8,
      lastmod: '2023-09-18 00:00 +08:00'
    }
  ]
})

每當產生網站地圖時,Nuxt Simple Sitemap 模組就會呼叫這個 API 來取得動態連結的列表,並添加至網站地圖中。

當然實務上在使用,肯定不是在 API 中直接回傳一個固定的陣列,通常會去呼叫文章列表、產品列表等等能夠列出動態連結的 API,如下範例調整 ./server/api/_sitemap-urls.js 檔案,從多個列表 API 來整合這些連結,並提供建構 sitemap 屬性回傳給模組使用。

export default defineEventHandler(async () => {
  const [
    articles,
    authors,
    products
  ] = await Promise.all([
    $fetch('/api/articles'),
    $fetch('/api/authors'),
    $fetch('/api/products')
  ])
  return [...articles, ...authors, ...products].map((page) => {
    return { loc: page.url, lastmod: page.updatedAt }
  })
})

如果你想調整模組預設呼叫的 API 路徑 /api/_sitemap-urls,你可以調整 dynamicUrlsApiEndpoint 選項。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
	sitemap: {
    dynamicUrlsApiEndpoint: '/api/**_**sitemap-urls',
  }
})

在建構打包時處理

如果你的網站規模比較小,也可試試更簡單的配置方式,它適用於在建構打包時提供動態的連結給模組產生網站地圖。

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
  sitemap: {
    urls: async () => {
      const articles = await getArticles()
      return articles.map(page => ({
        loc: `/articles/${page.id}`,
        changefreq: 'daily',
        priority: 0.8,
        lastmod: page.updatedAt,
      }))
    },
  },
})

Nuxt Simple Sitemap 模組的網站地圖快取

預設情況下生產環境會啟用快取,將網站地圖快取 1 小時,快取將有助於提升效能並減少伺服器的負擔。

你也可以調整模組選項 cacheTtl 數值,來調整網站地圖快取的毫秒數,如果想禁用快取可以將數值設定為 0

export default defineNuxtConfig({
  modules: ['nuxt-simple-sitemap'],
  sitemap: {
    cacheTtl: 1000 * 60 * 60 * 24 // 1 day
  }
})

如果你想要清除快取,可以傳遞查詢參數 ?purgesitemap.xml 的連結。

https://example.com/sitemap.xml?purge

小結

Sitemap 網站地圖幾乎是現在網站上線時需要完善的一個環節之一,尤其對於需要利用搜尋引擎被曝光時尤其重要,當網站規模比較小時你可能可以手動的來建立網站地圖,但如果是規模比較大或者頻繁更新的網站,那我們在 Nuxt 3 的專案就可以借助 Nuxt Simple Sitemap 模組來幫我們自動產生網站地圖來提昇效率,更多的選項與配置可以參考官方文件


感謝大家的閱讀,歡迎大家給予建議與討論,也請各位大大鞭小力一些:)
如果對這個 Nuxt 3 系列感興趣,可以訂閱接收通知,也歡迎分享給喜歡或正在學習 Nuxt 3 的夥伴。

參考資料


上一篇
[Day 18] Nuxt 3 自動產生連結縮圖 OG Image - SEO 搜尋引擎最佳化系列
下一篇
[Day 20] Nuxt 3 管理網站的 robots.txt 與 Robots Tags - SEO 搜尋引擎最佳化系列
系列文
Nuxt 3 實戰筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言