4.8 部署
NoteCraftApp 使用文件 第 4 章・使用指南

4.8 使用指南

部署

把 notecraftapp build 的產物複製出來,放到 GitHub Pages、Netlify 或任何靜態主機;也說明筆記圖片怎麼進產物、子路徑怎麼設,以及部署出去的站少了哪些功能。

本頁目錄
  1. 產生產物
  2. 筆記裡的圖片
  3. 部署到子路徑
  4. 放上靜態主機
  5. 部署後少了什麼
  6. 全文搜尋

notecraftapp build 產生的是純靜態網站:HTML、CSS、JS 與一份 /wb-index.json,沒有任何執行期 API。能放靜態檔案的主機都能用。

產生產物

終端機
npx notecraftapp build ./notes

產物在 ~/.notecraft/cache/<hash>/dist/。<hash> 是筆記資料夾絕對路徑的 SHA-1 前 12 碼,build 結束時最後一行會印出完整路徑:

text
[notecraftapp] dist:      : /Users/you/.notecraft/cache/2bb4fbdcdaa2/dist

部署前先把它複製出來,不要直接拿快取目錄去部署。下一次 build 或 serve 的背景 rebuild 會整個換掉這個資料夾。

終端機
mkdir -p site-out
cp -R ~/.notecraft/cache/<hash>/dist/. site-out/

升級 notecraftapp 或改了下面提到的 NOTECRAFT_BASE 之後,下一次 build 會自動重建,不必加 --rebuild(1.8.1 起;更早的版本要加)。快取規則見運作原理。

1 npx notecraftapp build ./notes 站不在網域根目錄時,先設 NOTECRAFT_BASE
~/.notecraft/cache/<hash>/dist/ build 最後一行印出完整路徑;筆記引用的圖片已複製進 notes-assets/
2 複製到專案裡的資料夾 cp -R <dist>/. site-out/
不要這樣做 直接部署快取目錄 下一次 build 或 serve 的背景 rebuild 會整個換掉它
3 上傳 site-out/ GitHub Pages、Netlify 或任何靜態主機
唯讀的靜態站 沒有寫入 UI;有全文搜尋(pagefind/ 跟著產物走)
部署三步:build、把產物從快取複製出來、上傳。快取裡的 dist 會被下一次 build 換掉,不要直接拿它部署。

筆記裡的圖片

筆記用相對路徑引用的圖片,會被改寫成 /notes-assets/<相對於筆記資料夾的路徑>(見圖片與附件)。build 結束時會把產物實際引用到的檔案照同樣的相對路徑複製進 dist/notes-assets/,不必另外處理,直接部署就看得到。

以一篇引用 ./cover.png 與 sub/inner.png 的 hello.md 為例:

hello.md 裡寫的 dist/notes/hello/index.html 的 src 設 NOTECRAFT_BASE=/my-notes 時 ![](./cover.png) /notes-assets/cover.png /my-notes/notes-assets/cover.png ![](sub/inner.png) /notes-assets/sub/inner.png /my-notes/notes-assets/sub/inner.png ![](../outside.png) ../outside.png落在筆記資料夾外,照原樣保留 不會進產物
產物裡多出 dist/notes-assets/cover.png 與 dist/notes-assets/sub/inner.png;筆記資料夾裡沒被引用的圖片不會進產物。
hello.md 在筆記資料夾最上層:相對路徑改寫成 /notes-assets/…,引用到的檔案複製進 dist/notes-assets/;設了 NOTECRAFT_BASE 時網址再加上前綴。落在筆記資料夾外的路徑不處理。

幾個規則:

  • 只複製 HTML 裡真的出現的 /notes-assets/… 網址,筆記資料夾裡沒被引用的圖片不會進產物。手寫成 /notes-assets/ 開頭的 PDF 連結也算引用
  • 只複製支援的格式;.md、.mdx、.notecraft/ 不會被帶出去
  • 解析後落在筆記資料夾外面的路徑(含指向外面的 symlink)不複製
  • 引用的檔案不存在、或被上面兩條擋下時,build 照樣完成,log 會印一行 [WARN] [notecraft-notes-assets] 列出是哪個路徑

只改了圖片、沒動筆記時,build 也會發現上次複製過的圖片變了而重建,不需要 --rebuild。

部署到子路徑

站不在網域根目錄時(例如 GitHub Pages 的專案站 https://<帳號>.github.io/<repo>/),build 時設環境變數 NOTECRAFT_BASE:

終端機
NOTECRAFT_BASE=/my-notes npx notecraftapp build ./notes
  • 站內連結、CSS/JS 路徑、改寫後的圖片網址都會加上前綴,例如 /my-notes/notes-assets/cover.png
  • 產物的目錄結構不變,index.html 仍在 dist/ 最上層。把整份內容放到主機上 /my-notes/ 對應的位置
  • 圖片仍放在 dist/notes-assets/,跟著整份產物一起放上去就對得到 /my-notes/notes-assets/…

放上靜態主機

產物的每一頁都是 <路徑>/index.html,連結寫成 /notes 這種不帶結尾斜線的形式,主機要能把它對到 notes/index.html。GitHub Pages 與 Netlify 預設都會這樣處理。

主機做法
GitHub Pages用 GitHub Actions 部署:build、複製產物,交給 actions/upload-pages-artifact。若改用「從分支部署」,產物裡有 _astro/ 資料夾,要在根目錄放一個空的 .nojekyll
Netlify把 site-out/ 整個資料夾拖到 Netlify 的手動部署頁;在 Netlify 上 build 時,build 指令要包含複製產物,publish 目錄指向複製出來的資料夾
其他靜態主機上傳 site-out/ 的內容

在 CI 裡不知道 <hash>,從 build 最後印的那一行取路徑:

終端機
DIST=$(npx notecraftapp build ./notes --rebuild | sed -n 's/^\[notecraftapp\] dist: *: //p')
mkdir -p site-out
cp -R "$DIST"/. site-out/

CI 需要 Node 22(見系統需求)。第一次執行 npx notecraftapp 會先安裝一次,約 30 秒。

部署後少了什麼

部署出去的站就是 build 的產物,和 serve 看到的一樣是唯讀的:

項目在部署的站上
「+ 新增筆記」、標籤編輯、/tags 的重新命名與刪除不輸出
筆記頁首「⋯」選單(以 VS Code 編輯、重新生成提示、刪除筆記)不輸出,產物裡也不含本機絕對路徑
Drawer 的「複製生成提示」、沒有簡報時的「生成簡報」不輸出
/plugins 的啟用/停用開關只顯示狀態
閱讀進度、頁籤、收藏存在每位訪客自己的瀏覽器(localStorage),不會互通

產物裡不會有你電腦上的路徑。build 結束前會檢查所有 .html、.json,若含專案、筆記資料夾或 app 的絕對路徑,build 直接失敗並列出是哪些檔案(1.8.5 起)。遇到這個錯誤請回報 issue,附上終端機列出的片段。

寫入功能都要在本機用 view,見在介面新增與編輯。

全文搜尋

build 完會在產物裡建好 pagefind 索引(pagefind/ 資料夾),整個資料夾一起上傳,部署的站上 ⌘K 就能搜內文,不用另外跑 pagefind。若終端機印了建索引失敗的警告,站仍可部署,只是沒有「內文」分區。

搜尋範圍與限制見指令面板與全文搜尋。

在 GitHub 上修改這一頁