Skip to main content

開始建置 Docusaurus !

Docusaurus 是由 Facebook 團隊開發的靜態網站生成框架,起初 Facebook 團隊在開發專案時使用 Jekyll 產生共同模板,並用複製的方式複製到新項目,但是後來發現這種複製的方式會讓各個項目失去更新的控制權,例如 Facebook 團隊想要為各個項目提供 i18n 支持功能時,就非常難以更新這個功能到其他已經被複製過去的項目中。

因此為了方便維護更新、擴充功能,並且可以讓使用者靈活調整網站主題,於是開發了 Docusaurus,Facebook 也表示 Docusaurus 可以讓沒有太多 Web 開發經驗的人用基本的網站展示他們的項目。

建立環境


  • Node.js 版本 16.14 以上,推薦使用 nvm 管理 Node.js 版本。

所需技能


  • Markdown 語法 : 如果不會的話也沒關係,Markdown 語法並不難上手,可以參考 Markdown Guide 文件,Docusaurus 官方文件也有相關的語法說明。
  • Terminal comman line : 因為 Docusaurus 是由 Node.js 驅動,需要輸入 npm 相關指令建置或者部署你的網站。
  • React : 不一定要會,但會 React 的話,就算只是基礎的 React 操作也可以很好的客製自己的網站。

建置步驟


Step 1. 使用 npx 建立專案

npx create-docusaurus@latest [部落格名稱] [模板選擇]

模板選擇可以先照官方推薦的 classic 建置即可。

若要使用 TypeScript 開發,可在結尾加上 --typescript

npx create-docusaurus@latest [部落格名稱] [模板選擇] --typescript

此時 npx 指令會開始建置專案環境和安裝相關的套件

建置好後使用 cd 我們切換到該專案

cd [部落格名稱]

或者直接在 VSCode 重新開啟專案。


Step 2. 運行專案 ( development )

npm run start

這個指令會在 http://localhost:3000/ 本地端開啟網站,可以看到預設的 Docusaurus,在專案內存檔都可以及時更新內容 ( Hot reload )。

這樣就完成第一步了 ! 🎉


建立 GitHub Repo


note

請先安裝 Git,以及申請 GitHub 帳號。

為了保留專案的變動記錄,以及後續會介紹使用 Vercel 部署,將專案上傳到 GitHub repo 吧 !

Step 1. 新增 repo

在 GitHub 右上角 “+” 打開選單點選 New repository 建立新的 repo。

Step 2. 輸入 repo 名稱並建立



建立完成後複製 repo 的 url :

Step 3. Git init

切回到 VSCode,ctrl + ~ 打開 Terminal,建議切換到 Git Bash

按照順序輸入以下命令 :

git init
git add .
git commit -m 'first commit'
git branch -M main
git remote add origin [貼上剛剛複製的 repo url]
git push origin main

重新整理 GitHub repo 頁面,就會看到專案的檔案已經上傳囉 !



在這之後只要有新增、修改撰寫的文件或部落格,都建議使用 git 指令 commit 並上傳到 GitHub repo :

git add .
git commit -m '新增:第一篇部落格'
git push origin main

Docusaurus 專案架構說明


目前的專案檔案結構長這個樣子 :

解讀如下 :

docusaurus-demo /
├── blog/
│ └── ... // 放部落格文章
├── docs/
│ └── ... // 放文件
├── node_modules/
│ └── ...
├── src/
│ ├── components/ // 元件檔案
│ │ └── ...
│ ├── css/ // 樣式管理
│ │ └── ...
│ └── pages/ // 頁面管理
│ └── ...
├── static/ // 靜態檔案管理
│ └── img/
│ └── ...
├── .gitignore
├── babel.config.js
├── docusaurus.config.js // docusaurus 的配置設定檔
├── package-lock.json
├── package.json // npm 套件及指令設定
├── README.md
└── sidebar.js // 側邊欄設定檔
  • blog/ - 所有部落格文章的放置處。
  • docs/ - 所有文件的放置處,會由自動生成側邊欄,如果需要自訂側邊欄可以在 sidebar.js 和 docusaurus.config.js 調整設置。( 官方文件說明 )
  • src/ - 管理 React 元件、css 樣式、md、mdx。
    • src/pages/ - 支援將 jsxtsxmdmdx 轉換成頁面,並自動生成路由。
  • static/ - 管理靜態檔案,通常放置一些圖片檔、robots.txt 之類的,npm run build 後會直接複製到 build 資料夾底下。
  • docusaurus.config.js - Docusaurus 的配置設定檔,通常愈需要客製自己的網站,愈需要頻繁調整這邊的配置,包含網站主題、網站 icon、部署、全站 headmeta、docs、blog、頂部導覽列、底部 footer、docusaurus 內建 plugins、第三方套件、Google analytics 等等相關設定。( 官方文件說明 )
  • sidebar.js - 側邊欄設定檔,可由自動生成側邊欄項目改為自訂項目。( 官方文件說明 )
info

💡 詳細架構說明可以參考此官方文件


Docusaurus 常用基本設定


網站名稱、連結、主要目錄

以 GitHub page 配置 :

./docusaurus.config.js
const config = {
title: 'Docusaurus Demo', // 網頁標題
tagline: 'Dinosaurs are cool', // 網頁標語
url: 'https://tingminitime.github.io', // GitHub page 基本 url
baseUrl: '/docusaurus-demo/', // GitHub repo 名稱
// ...
}

以 Vercel 配置 :

./docusaurus.config.js
const config = {
title: 'Docusaurus Demo', // 網頁標題
tagline: 'Dinosaurs are cool', // 網頁標語
url: 'https://docusaurus-demo.vercel.app', // Vercel url
baseUrl: '/',
// ...
}

網站 icon

./docusaurus.config.js
const config = {
// ...
favicon: 'img/favicon.ico',
// ...
}

網站 icon 位於 ./static/img/ 目錄底下,可自行更換。

GitHub 部署設定

./docusaurus.config.js
const config = {
// ...
organizationName: '[你的 GitHub 名稱]', // Usually your GitHub org/user name.
projectName: '[GitHub repo 名稱]', // Usually your repo name.
// ...
}

i18n 多國語系

若以繁體中文內容為主,沒有其他語系可以這樣設置 :

./docusaurus.config.js
const config = {
// ...
i18n: {
defaultLocale: 'zh-Hant', // 預設語系
locales: ['zh-Hant', 'en'], // 網站包含語系
},
// ...
}

若有支援多語系,可以這樣設置 :

./docusaurus.config.js
const config = {
// ...
i18n: {
defaultLocale: 'zh-Hant', // 預設語系
locales: ['zh-Hant', 'zh-Hans', 'en'], // 網站包含語系
localeConfigs: {
'zh-Hans': {
label: '简体中文', // 更改語言下拉選單的顯示文字
direction: 'ltr', // 書寫方向
htmlLang: 'zh-Hans', // <html lang="..."> html lang 屬性語言
},
en: {
label: 'English',
direction: 'ltr',
htmlLang: 'en-US',
},
},
},
// ...
}

設置完後在根目錄創建 ./i18n/ 資料夾,在依照語系分別建立資料夾,放入 docs 檔案,架構大概是這樣 :

docusaurus-demo /
└── i18n/
├── zh-Hans/
│ └── ... // 簡體中文 docs
└── en/
└── ... // 英文 docs

然後在 docusaurus.config.js 將頂部導覽列的語系切換設定打開 :

./docusaurus.config.js
const config = {
// ...
themeConfig: {
navbar: {
items: [
// ...
{
type: 'localeDropdown',
position: 'left',
},
// ...
],
},
},
// ...
}

多語系更多教學可參考官方文件

Plugins 插件

./docusaurus.config.js
const config = {
// ...
plugins: [],
// ...
}

若使用 Sass/SCSS,需先安裝相關套件 :

npm install --save docusaurus-plugin-sass sass

加入到 plugins 設定中 :

./docusaurus.config.js
const config = {
// ...
plugins: ['docusaurus-plugin-sass'],
// ...
}

Presets 預置設定

./docusaurus.config.js
const organizationName = 'tingminitime'
const projectName = 'docusaurus-demo'

const config = {
// ...
presets: [
[
'@docusaurus/preset-classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
// docs 設定
docs: {
sidebarPath: require.resolve('./sidebars.js'),
// "編輯此頁"對應的url,將此移除則不會顯示"編輯此頁"
editUrl: `https://github.com/${organizationName}/${projectName}/tree/main/`,
showLastUpdateTime: true, // 顯示更新時間 ?
showLastUpdateAuthor: true, // 顯示更新作者 ?
},
// blog 設定
blog: {
showReadingTime: true, // 顯示預估閱讀時間
editUrl: `https://github.com/${organizationName}/${projectName}/tree/main/`,
},
theme: {
customCss: require.resolve('./src/css/custom.css'), // 全域 css 樣式
},
}),
],
],
// ...
}

主題外觀

以下內容皆對應至 config.themeConfig 裡面 :

./docusaurus.config.js
const config = {
// ...
themeConfig:
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
(
{
/* !! 這邊 !! */
}
),
// ...
}
  • colorMode : 亮暗主題配置
./docusaurus.config.js
colorMode: {
defaultMode: 'light', // 預設亮暗主題 : 亮
disableSwitch: false, // 是否禁止切換 ?
respectPrefersColorScheme: true, // 是否依照使用者 prefers-color-scheme 系統預設亮暗主題配置 ?
},
  • metadata : 自訂 meta 內容
./docusaurus.config.js
metadata: [
{
name: 'robots',
content: 'max-image-preview:standard',
},
// ...
],
  • image : 自訂 og:image
./docusaurus.config.js
image: 'img/og-img.png',
  • navbar : 頂部導覽列
./docusaurus.config.js
navbar: {
title: 'My Site',
hideOnScroll: false, // 向下滾動頁面是否隱藏頂部導覽列 ?
logo: {
alt: 'My Site Logo', // logo 圖片的 alt 屬性
src: 'img/logo.svg', // 亮色主題的 logo 圖片
srcDark: 'img/Tim-logo-white.svg', // 暗色主題的 logo 圖片
style: { margin: '0 1rem' }, // logo 圖片的 inline-style
},
items: [
{
type: 'doc', // doc 類別
docId: 'intro', // doc ID
position: 'left', // 位於導覽列位置 left | right
label: 'Tutorial', // 顯示文字
},
{
to: '/blog', // 連結 url,type 為 default
label: 'Blog',
position: 'left',
},
{
type: 'dropdown', // 下拉選單類別
label: '更多',
position: 'left',
items: [ // 下拉選單項目
{
to: '/more/about',
label: '關於我',
},
{
to: '/support/privacy-policy',
label: '隱私權政策',
},
// ...
],
},
{
href: 'https://github.com/facebook/docusaurus',
label: 'GitHub',
position: 'right',
},
],
},

更多頂部導覽列配置可參考官方文件說明

  • docs : 文檔主題設置
./docusaurus.config.js
docs: {
sidebar: {
hideable: true, // 是否顯示可隱藏側邊攔功能 ?
autoCollapseCategories: false, // 是否在打開側邊攔項目時,自動收和其他已打開項目 ?
},
},
  • footer : 底部 footer 設置
footer: {
style: 'dark', // 預設 dark 樣式 dark | light
links: [ // 照內容水平分區塊,最多 12 欄會換列
{
title: 'Docs',
items: [
{
label: 'Tutorial',
to: '/docs/intro',
},
],
},
{
title: 'Community',
items: [
{
label: 'Stack Overflow',
href: 'https://stackoverflow.com/questions/tagged/docusaurus',
},
// ...
],
},
{
title: 'More',
items: [
{
label: 'Blog',
to: '/blog',
},
{
label: 'GitHub',
href: 'https://github.com/facebook/docusaurus',
},
],
},
],
copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`,
},
  • prism : 程式碼區塊主題設置
./docusaurus.config.js
prism: {
defaultLanguage: 'javascript', // 預設語言 javascript,可更改
theme: lightCodeTheme, // default
darkTheme: darkCodeTheme, // default
// 自定義高亮程式碼註解語法及class name
magicComments: [
// 若有自定義則記得將原有預設語法加上去
{
className: 'theme-code-block-highlighted-line',
line: 'highlight-next-line',
block: { start: 'highlight-start', end: 'highlight-end' },
},
{
className: 'code-block-error-line', // 自定義 class name
line: 'error-next-line', // 自定義程式碼區塊註解語法
},
],
},

預設語言更改可參考 這裡


使用 Sass/SCSS 更改樣式


先安裝相關套件 :

npm install --save docusaurus-plugin-sass sass

加入到 plugins 設定中 :

./docusaurus.config.js
const config = {
// ...
plugins: ['docusaurus-plugin-sass'],
// ...
}

preset 預置設定中的 theme.customCss 將路徑及副檔名 ./src/css/custom.css 改為 ./src/scss/custom.scss

./docusaurus.config.js
const config = {
// ...
presets: [
[
'@docusaurus/preset-classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
// ...
theme: {
customCss: require.resolve('./src/scss/custom.scss'),
},
// ...
}),
],
],
// ...
}

這樣就可以在 custom.scss 中撰寫全域樣式囉 !

側邊攔自定義配置


./docs/ 底下的資料夾裡面會發現有 _category_.json 這個檔案,這是目錄在側邊欄的設定檔 :

_category_.json
{
"label": "Tutorial - Basics", // 目錄名稱
"position": 2, // 在側邊攔排序位置
"className": "custom-class-name", // 可在 ./src/css/custom.css 自訂樣式
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

官方文件說明


Docs-only


若想要只有文檔,不想要首頁、部落格,可以這樣設定 :

./docusaurus.config.js
const config = {
// ...
presets: [
[
'@docusaurus/preset-classic',
/** @type {import('@docusaurus/preset-classic').Options} */
({
// ...
docs: {
routeBasePath: '/', // 將 docs url 調整為 root url
// ...
},
blog: false, // 可將 blog 設定為 false 避免訪問
// ...
}),
],
],
// ...
}

然後將 ./docs/ 裡面 intro.md 的 front matter 中加上 slug: / :

---
slug: /
sidebar_position: 1
---

意思是這個 intro.md 文件的預設 url 會是整個網站的 root url,接下來將 ./src/pages/index.js 檔案加上底線 ./src/pages/_index.js :

Docusaurus 會略過這個檔案的編譯,或者將 ./src/pages/ 底下的檔案都刪除也 OK。

這樣網頁的入口就會是文檔頁面囉 !


Docs Front Matter


在 Markdown 的前言設置,例如 :

---
[Front Matter 內容]
---

...文件內容

.md.mdx 文件頂部加上 --- 包含設置內容,裡面會被解析為 YAML 格式。

在撰寫文件時,一般會常用到以下內容 :

---
id: [對應 url path] type: string
title: [文件標題] type: string
description: [對應 meta description] type: string
sidebar_label: [側邊攔顯示文字] type: string
sidebar_position: [側邊攔排序位置] type: number
tags: [文件標籤] type: array
---

Docusaurus 官方對應表


部署至 Vercel


如果想確認實際上線後整體網站的樣子,可以使用 npm run build 等待 build 完畢後,再使用 npm run serve 查看整個網站。

Step 1. 登入 Vercel

因為專案放在 GitHub 上,這邊使用 GitHub 登入。

Step 2. 匯入 repo

點選右上 “Add New…”,選擇 Project。

接著匯入已經上傳到 GitHub 的專案

Vercel 很貼心的提供 Docusaurus 2 的基本配置,直接點擊部署就 OK 囉 !

等待部署結束,就大功告成囉 !

點擊圖示就可以查看上線的網站了 !


VSCode 推薦擴充


  • Markdown All in One : 方便的 markdown 自動完成語法,各種 markdown 撰寫實用功能。

Reference