1960 字
10 分鐘

Starlight 0.42 升級要檢查什麼?Popover、JavaScript 與 sidebar

Starlight 0.42 的升級不只是把 @astrojs/starlight 版本號改掉。這個版本把行動版選單改用 Popover API,套件發布方式也改成編譯後的 JavaScript 與型別定義;大型、深層 sidebar 的資料處理則有明顯改善。對一般文件站來說,最該檢查的是自訂選單、型別檢查、sidebar 結構與 JavaScript 失效時的行為。

直接答案是:先用官方升級工具更新 Starlight 與相關 Astro 套件,再讀 package.json 和 lockfile 的 diff;接著跑 pnpm checkpnpm build,並用瀏覽器實測行動版選單、鍵盤焦點、無 JavaScript、sidebar active state 與自訂 CSS/script。不要只因 build 成功就把升級視為完成。

0.42 這次真正會影響什麼#

變更對文件站的影響升級後要驗證
行動版選單改用 Popover API開關與關閉行為更依賴原生互動語意點擊、Escape、鍵盤焦點、JavaScript 失效時仍能操作
發布編譯後 JavaScript 與型別定義專案 typecheck 讀到的套件內容可能改變,套件本身不再直接帶 TypeScript 原始碼pnpm check、自訂 integration 與型別擴充
sidebar 資料處理優化大型或深層側邊欄的建置與處理可能加速導覽順序、巢狀層級、active state 與多語路徑
0.41.3 的 focus trap 修正行動版選單焦點行為有可及性回歸基準鍵盤不會跳出開啟中的選單範圍

Astro 官方在大型、深層 sidebar 的情境下報告過最高約 1,400 倍的資料處理速度改善;這是特定基準測試的上限,不是每個網站的保證值。升級仍應以自己的 build 時間與輸出回歸為準。

先用升級工具,再看完整 diff#

官方文章建議既有 Starlight 專案使用 @astrojs/upgrade。ZeroOne 使用 pnpm,因此可以在專案根目錄執行:

Terminal window
pnpm dlx @astrojs/upgrade

也可以使用官方文件中的等價指令:

Terminal window
npx @astrojs/upgrade

升級工具可能同時更新 Starlight、Astro 與 integrations。執行後先看 diff,不要把所有 package 更新視為同一個無風險變更:

Terminal window
git diff -- package.json pnpm-lock.yaml astro.config.mjs
pnpm check
pnpm build

如果專案還在 Astro 5 或 Astro 6,先閱讀 Astro 7 升級清單 的 major migration 風險,再決定是否把 Astro major 與 Starlight 0.42 放在同一次變更。分開升級能讓 compiler、integration 和文件主題的問題比較容易定位。

行動版選單:測試 Popover,不要只測滑鼠點擊#

Starlight 0.42 的行動版選單改用 Popover API。這表示基礎開關行為交給瀏覽器的原生互動模型處理,官方也特別指出,即使 JavaScript 失效或被停用,選單仍應能運作。若想先理解 popoverautomanual 的差異,可參考 HTML Popover API 的實作與除錯

升級後至少做以下測試:

  1. 寬度切到行動版,開啟與關閉主選單、巢狀選單和搜尋入口。
  2. 用鍵盤 Tab 進入選單、以 Escape 關閉,再確認焦點回到合理的觸發按鈕。
  3. 暫時停用 JavaScript,確認基本導覽仍能展開、關閉與前往連結。
  4. 開啟瀏覽器的 accessibility tree 或 keyboard navigation,檢查自訂 wrapper 沒有遮住 Popover 的互動元素。
  5. 抽查直接開啟深層文章、返回上一頁和重新整理後,選單狀態沒有卡住。

如果專案自行覆寫 Starlight 的 menu CSS、掛載 click listener,或透過 DOM selector 加入動畫,這些才是最可能需要修正的地方。不要為了保留舊 selector 而把新選單再包一層全域 click handler,先確認是否和原生 Popover 的開關及焦點行為衝突。

編譯後 JavaScript:把 typecheck 當成升級檢查#

0.42 開始,Starlight 編譯套件來源,並發布 JavaScript 與型別定義,而不是把 TypeScript 原始碼直接交給使用者的工具鏈。這可能降低大型專案 typecheck 的負擔,但不代表專案的型別問題會自動消失。

若文件站有自訂 theme component、MDX component 或 integration,升級後應檢查:

  • import 是否仍指向公開的套件入口,而不是套件內部的 TypeScript 路徑;
  • astro checkpnpm check 是否仍能解析自訂 component props;
  • 自訂型別 augmentation、tsconfig path alias 和 ESLint/Biome 的 resolver 是否仍指向正確檔案;
  • build 產出的 client script 是否保留互動元件,沒有因 tree-shaking 或 import 變更而消失。

遇到型別錯誤時,先將套件版本與應用程式程式碼的修改拆開。先確認錯誤是公開型別入口改變、舊版 internal import,還是自己的 component contract 不再符合,再決定是否加 compatibility layer。

大型 sidebar:速度改善不能取代導覽回歸#

sidebar 的速度改善主要對大型、深層、含大量頁面的文件站有價值。小型站點可能幾乎感覺不到差異,但仍要確認升級沒有改變內容排序或 active state。

可以用以下方式做可重現比較:

Terminal window
time pnpm build
time pnpm build

第二次 build 不能代替 clean build;請在相同 Node、pnpm、lockfile 與 CI runner 條件下,比較乾淨建置、第二次建置與修改單一文件後的建置。速度數字只回答處理時間,還要另外抽查:

導覽案例要看什麼
三層以上巢狀項目父層展開狀態與子頁 active state
多語言 sidebar中文、英文路徑和當前語言導覽沒有互相串錯
直接開啟深層頁breadcrumb、上一頁/下一頁與 sidebar 定位一致
大量頁面重新命名舊連結、404、sitemap 和搜尋索引沒有殘留錯誤路徑

一份可以回滾的升級清單#

升級 Starlight 前後,建議留下同一組 baseline 與 smoke test:

  1. 記錄目前 @astrojs/starlight、Astro、Node、pnpm 與 lockfile 狀態。
  2. 用升級工具產生 package diff,只保留本次預期的版本變更。
  3. pnpm checkpnpm build,保存錯誤輸出和建置時間。
  4. 測試行動版 Popover、鍵盤焦點、Escape、停用 JavaScript 和自訂 menu CSS/script。
  5. 抽查 sidebar 的巢狀層級、多語路徑、active state、深層文章與重新命名後的連結。
  6. 確認頁面 HTML、canonical、sitemap、搜尋索引、local cover 和 RSS 輸出沒有非預期變化。
  7. 把 package diff 與測試結果放在同一個 commit,若失敗可只回滾 Starlight 變更。

如果站點沒有覆寫主選單,也沒有大型 sidebar,實際程式碼變更可能很少;但 pnpm checkpnpm build 和行動版人工測試仍不能省略。這次升級的價值在於採用新的互動與套件發布方式,同時確認自己的整合沒有依賴舊實作細節。

Starlight 0.42 的升級重點可以濃縮成三個檢查:先讀版本 diff,再驗證 Popover 和 keyboard accessibility,最後用自己的 sidebar 與 build 結果確認效能改善。看到官方的 1,400 倍基準時,應把它當成測試方向,而不是把數字直接寫進專案 SLA。

常見問題#

Q: 升級 Starlight 0.42 一定要同時升級 Astro 嗎?#

A: 不要直接假設一定要或一定不用。官方升級工具可能同步更新相關 Astro 套件,執行後要讀 package.json 與 lockfile diff;若因此跨 Astro major,應另讀對應 migration guide 並分開驗證。

Q: 停用 JavaScript 後選單可以用,就代表自訂 menu 沒問題嗎?#

A: 不代表。這只能確認基本 Popover 路徑仍可用;自訂 script、CSS、焦點管理和動畫可能在 JavaScript 開啟時覆蓋原生行為,仍要做滑鼠、鍵盤、Escape 和返回上一頁測試。

Q: Starlight 0.42 會讓每個 sidebar 都快 1,400 倍嗎?#

A: 不會。這是官方針對大型、深層 sidebar 的基準測試上限,不能當成所有專案的保證。請在固定環境比較 clean build、增量修改和實際導覽回歸。

參考資料:

Astro Blog:Starlight 0.42

Starlight:官方文件

Starlight 0.42 升級要檢查什麼?Popover、JavaScript 與 sidebar
https://laplusda.com/posts/starlight-0-42-upgrade-checklist/
作者
Zero
發佈於
2026-09-06
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。