Skip to main content

Command Palette

Search for a command to run...

用 VuePress 製作說明文件頁面 — 3:導覽列

Published
3 min readView as Markdown
用 VuePress 製作說明文件頁面 — 3:導覽列
L

前端工程師 Augustus 的學習筆記 — solving problems, in simple ways.

本篇大綱


本篇要解決的問題

在上一篇〈用 VuePress 製作說明文件頁面 — 2:config.js 基本設定〉我們設定好了 title、description 等重要的基本資訊,本篇要寫的是在網站中重要中的重要項目:導覽列。

導覽列是讓使用者進來時,在短短幾秒內能熟悉「這個網站有什麼」的項目,SEO 上也是讓搜尋引擎蜘蛛能從一頁爬到全部頁面的重點設計。

這麼重要的項目,VuePress 當然能夠讓我們自行設定。


Navbar 頂部導覽列

文件:英文 | 簡中

VuePress 的頂部導覽列上有五個項目:Logo、導覽列連結、語系切換、Repository 連結、搜尋框。

文件上是說四個,但 Augustus 認為 Logo 是整個站很重要的一環,因此把 Logo 列為第五個。

語系切換的部份 Augustus 並未用到,本篇不會寫到,在此附上文件的連結請自行觀看:英文 | 簡中

搜尋框的部份用的是預設的功能,未做任何改變,說明文件上也是重在使用 Algolia 上,因此也是附上說明文件的連結,請自行觀看:英文 | 簡中

要設定 Logo 很簡單,打開「.vuepress/config.js」這個配置檔案,加上:

themeConfig: {
  logo: '圖檔路徑'
}

Logo 出現的位置是在頂部導覽列的左方:

Logo 在頂部導覽列的左方Logo 在頂部導覽列的左方

Logo 預設點了是回到整個站的首頁,也就是我們在 config.js 上設定的「base」。

靜態檔放 public 中

Logo 會是圖檔,在 VuePress 上要讀到靜態檔案,像是圖檔,就只能讀出放在「.vuepress/public/」中的檔案。

比方我們要讀的 Logo 是 logo.svg,那我們在 .vuepress 中先建立一個「public」的資料夾,然後把 logo.svg 放進去:

把 logo 放進 public 中把 logo 放進 public 中

這樣我們就可以使用這個檔案了。

在 config.js 的 logo 路徑上填 './logo.svg',頁面上就會抓得到這個 Logo 檔。

如果是其它頁面要各自使用,文件上建議把 <img>src 寫成以下:

<img :src="$withBase('/logo.svg')" alt="Logo">

如果哪一天我們改掉 base$withBase 會自動去抓 base 上的值,避免抓不到圖檔的狀況發生。

Repository 連結

Repository 連結要放的是 GitHub 上的專案連結,一樣寫在 config.js 上,有二個地方可以設定。

頂部導覽列

修改頂部導覽列的連結:

themeConfig: {
  repo: 'GitHub Repository 的連結',
  repoLabel: '要顯示的文字'
}

repo 是必填,可以填相對路徑如「letswritetw/vuepress」,也可以填絕對路徑。

填相對路徑的話預設是會去到 GitHub 上的連結。但大家都知道,人生難免有意外,除了 GitHub,GitLab 也是可以支持一下的啊,如果專案是存在 GitLab 的話,這邊就要填 GitLab 的絕對路徑囉。

repoLabel 是選填,如果不填的話預設文字會顯示「GitHub」。

顯示在各頁下方

我們一般看一些說明文件,會看見文件底部出現像這樣的一行字:

Edit this page on GitHubEdit this page on GitHub

Repository 連結也可以設定這邊的……如果你希望有其他善心人士協助編輯的話。

themeConfig: {
  // 假如文件檔的 Repository 跟上面設定的 repo 是不一樣的路徑:
  docsRepo: 'letswritetw/other_repo',

  // 假如文檔不是在 Repository 的根目錄下
  docsDir: 'docs',

  // 假如文檔在其他的分支下
  docsBranch: 'master',

  // 預設是 false,改為 true 就可以開啟這連結
  editLinks: true,

  // 連結顯示的文字,預設為「Edit this page」
  editLinkText: '帮助我们改善此页面!'
}

導覽列連結

導覽列連結就是放到頂部導覽列上的連結,會放在頂部導覽列的右邊,一樣是寫在 config.js 上,如下:

themeConfig: {
  nav: [
    { text: '首頁', link: '/' },
    { text: '內部連結', link: '/guide/' },
    { text: '外部連結', link: 'https://google.com' },
    {
      text: '有第二層選單',
      ariaLabel: '第二層選單',
      items: [
        { text: '選單2-1', link: '/submenu/1/' },
        { text: '選單2-2', link: '/submenu/2/' },
        {
          text: '第二層選單的子標題',
          items: [
            { text: '選單2-3', link: '/submenu/3/' },
            { text: '選單2-4', link: '/submenu/4/' }
          ]
        }
      ]
    }
  ]
}

如果連結是外部連結,VuePress 一律會自動加上:target="_blank" rel="noopener noreferrer",想要改變的話就把外部連結的部份寫成以下:

{
  text: "Let's Write",
  link: 'https://www.letswrite.tw',
  target: '_self',
  rel: ''
}

要注意,如果要拿掉 rel="noopener noreferrer"target 就要設為 _self

如果有設第二層選單,外觀會是這個樣子:

頂部導覽列有第二層選單、第二層選單子標題頂部導覽列有第二層選單、第二層選單子標題


Sidebar 側邊導覽列

除了頂部導覽列,VuePress 也能編輯側邊的導覽列,位置是在頁面的左邊,到了手機時就會改成由一個漢堡按鈕來開啟。

要加入側邊導覽列,一樣是更新 config.js 這個檔案。

一般單純連結

只是單純加上連結的方式如下:

themeConfig: {
  sidebar: [
    '/',
    '/page-a',
    ['/page-b', '顯示文字']
  ]
}

連結設為 /,預設就是首頁連結,顯示的文字就是 config.js 裡的 title

如果只設連結而不設文字,預設的顯示文字是檔案裡最大的那個標題。

如果想設定連結的顯示文字,那就是把連結包進陣列裡,第一個值是連結,第二個值是顯示文字。

將連結分組

我們很常會需要將連結分組,比方網站中分為美食、旅遊,美食下分西式、中式,旅遊下分國內、國外。

分組的設定方式如下:

themeConfig: {
  sidebar: [
    {
      title: '美食',       // 必填
      path: '/food/',     // 選填,一定要有這個資料夾及檔案
      collapsable: **false**, // 分組項目是否關上,true 關上、false 打開,
      sidebarDepth: 1,    // 要抓到檔案中的第幾層標題,預設抓標題 1
      // 這個分組底下有哪些連結
      children: [
        '/'
        ['/west', '西式'],
      ]
    },
    {
      title: '旅遊',
      children: [
        ['/', '遊遊首頁']
      ]
    }
  ]
}

分組的方式,就是把各組寫在各自的 object 裡即可。

path 有填寫的話,分組的標題也會加上連結。

collapsable 為 true,那這個分組的項目就不會被打開,false 就會被打開。

children 這個分組底下有哪些連結,就寫在這裡面,寫的方式跟上面一段的「一般單純連結」相同。

以上這些是 Augusts 目前有用到的部份。

文件裡面還有寫到更多的使用方式,就麻煩自行看文件囉:英文 | 簡中


原始碼、Demo

本篇開始,原始碼跟 Demo 都會放在 GitHub 上,歡迎取用。

Demo 會隨著系列文更新,所以看到的程式碼會逐漸豐富。

取用之前可以先對本篇點個讚或分享~

原始碼 GitHub - letswritetw/letswrite-vuepress-document: 由 Let's Write 製作的 VuePress Demo 頁面 由 Let's Write 製作的 VuePress Demo 頁面. Contribute to letswritetw/letswrite-vuepress-document development by creating an…github.com

Demo Let's Write VuePress | Let's Write VuePress 範例 由 Let's Write 製作的 VuePress Demo 頁面,歡迎多多分享~letswritetw.github.io


用 VuePress 製作說明文件頁面系列

  1. 安裝

  2. config.js 基本設定

  3. 導覽列

  4. 佈景主題、外掛

  5. 改樣式、加元件

  6. 部署

More from this blog

圖片壓縮:用 Compressor.js 自動調整品質壓縮至指定大小

本篇要解決的問題 很多網站功能會需要處理使用者上傳的圖片,比方讓使用者上傳會員照片。 但隨著手機相機愈做愈好,拍出來的照片隨便都是幾 MB,直接上傳的話,耗時也佔空間。 雖然網路上搜尋有許多圖片壓縮工具,但大多只能設定固定的壓縮的品質,無法保證壓縮後的檔案大小符合需求。 本筆記文將使用 Compressor.js 套件,實作一個圖片壓縮功能,符合以下需求: 自動嘗試不同的壓縮品質,直到檔案小於指定大小(ex: 600KB)為止。 將圖片轉換為 WebP 格式。 長、寬限制最大尺寸。 這...

Oct 4, 20254 min read
圖片壓縮:用 Compressor.js 自動調整品質壓縮至指定大小

使用 pm2.web 建立免費 PM2 監控系統

本篇要解決的問題 PM2 是 Node.js 裡常用的 process manager,一般如果是透過網頁監控、重啟,大概會使用官方的 Keymetrics。 但,But!就是這個 But!免費版最多只能監控 4 個 Process,再多就要掏出魔法小卡了。 問了 ChatGPT 後,發現有一個開源的替代方案:pm2.web,可以自己架設,不管幾個 process 都完全免費。 以下筆記如何使用 Vercel + MongoDB Atlas 部署 pm2.web,免費監控我們的 PM2。 架構...

Sep 26, 20252 min read
使用 pm2.web 建立免費 PM2 監控系統

GitHub Copilot + Figma MCP Server 實戰:用 AI 快速切版教學

本篇要解決的問題 最近在研究 MCP,剛好在 Threads 上看到有人實測 Figma MCP,想試看看是否真的能透過 AI 進行切版。 實作了一下後,還真的可以,不過目前僅針對簡單設計稿進行測試,結果略有跑版現象,整體效果尚可接受。 但目前就有這成果覺得厲害,再給它一段時間,也許前端工程師可以省掉切版的時間,把心力放到別的地方。 前提是,客戶要很明確的知道自己要什麼 XD,不然靠 AI 微調,還不如人工直接改程式還比較快。 用到的資源 以下是要實作用 Figma MCP 來切版,需要的資源:...

Apr 12, 20252 min read
GitHub Copilot + Figma MCP Server 實戰:用 AI 快速切版教學

使用 Google Apps Script 串接 Google Analytics API,整合多站數據

本篇要解決的問題 一間公司裡可能旗下會有多個網站,想同時查看所有網站的 GA 數據,通常需要開啟多個瀏覽器視窗並排顯示,操作較為繁瑣。 如果可以改由 API 來取得 GA 的數據,工程師就可以把各站的資料顯示在一個頁面上,而不用同時開多個 GA 來看。 開通 GA API 取得 GCP 專案編號 要先有 Google Cloud Platform(GCP)的專案,沒有的話登入自己的 Google 帳號,就可以先增一個。 專案編號就在 資訊主頁 上: 開通 GA API 功能 在使用 API ...

Mar 29, 20254 min read
使用 Google Apps Script 串接 Google Analytics API,整合多站數據

監聽 localStorage 事件:如何在同一頁面內偵測變更

本篇要解決的問題 我們有時會把資訊存在瀏覽器的空間裡,像是 Cookies、Local Storage、IndexedDB。 Local Storage 原生的 storage 事件主要用於跨分頁同步,如下: window.addEventListener("storage", () => {}); 但如果想要在同一個頁面內監聽變更,就需要手動覆寫 localStorage 方法。 localStorage event listener 我們可以透過 Storage.prototype 覆寫...

Mar 3, 20251 min read
監聽 localStorage 事件:如何在同一頁面內偵測變更
L

Let's Write

63 posts

前端工程師 August 的學習筆記 — solving problems, in simple ways.