從 dev server 到上台,中間有三個會出事的環節:presenter view 開在錯的螢幕現場沒有網路或本機環境跑不起來匯出格式不符合對方要求。三者都有固定的處理程序,值得在排練時就跑過一次,而不是進場後才第一次嘗試。

present mode 的操作

從 dev server 按 Present(或 f)進入全螢幕,整份 deck 均勻縮放以貼合螢幕。鍵盤操作:

動作
/ Space / PgDn前進(若當頁還有 Step,會先消耗 step)
/ / PgUp後退
Home / End跳到第一頁 / 最後一頁
Esc離開全螢幕
p開啟 presenter view(第二個視窗)
i切換 inspector(僅 dev,正式放映前該關掉)

presenter view 有四塊:當前頁(以實際呈現的大小顯示)、下一頁預覽、當頁 speaker notes、以及自進入 present mode 起算的計時器。實務上把它留在筆電螢幕,投影幕鏡射 deck 本身。

最常出的錯是兩個視窗開在錯誤的螢幕上。 進場檢查表裡這一項要獨立列出並實際執行一次,見 08

speaker notes 的正確用法

notes 是與頁面陣列索引對齊的字串陣列,某頁不需要就放 undefined

export const notes = [
  'Open with a smile. Mention the analyst quote from yesterday.',
  undefined,
  'Pause here for questions. The chart is a hand-off.',
];

三條實務規則:

  • 寫指令,不寫講稿。 緊張時讀不進長段落。每則控制在三行內,內容是時間錨點、第一句逐字、資料來源、可跳過的段落標記。詳見 08 的範例。
  • notes.length 必須等於頁數。 插入一頁而忘了補 undefined,之後所有備忘會錯位一格,且 dev server 不會報錯——只有 presenter view 上才會發現。把這一項寫進 review 檢查清單。
  • 論述都放這裡。 這是「投影片不是文件」得以成立的前提:畫面極簡的代價由 notes 承擔,而不是由聽眾的理解承擔(見 05 的三個垃圾桶)。

匯出的三種格式與各自的限制

工具列的 Export 選單直接匯出當前 deck:

格式產物限制
HTML靜態 HTML 快照;有引用資產的 deck 會下載成 zip(HTML + assets 資料夾)
PDF每頁一張 1920×1080 橫向 PDFSafari 不支援,要在 Chromium 系瀏覽器操作
PPTX(圖片)每頁渲染成一張圖片放進 PowerPoint slide不是原生可編輯的 PPTX,對方無法修改內容

PPTX 的限制是硬的:如果交付要求是「可編輯的簡報檔」,code-first 工作流在這一環會斷。在接案或對外提案前先確認這一點,避免做到最後才發現格式不合。

建置與離線備援

open-slide build 產出的 dist/ 是純靜態站,全部在客戶端渲染,不需要伺服器,可以丟到任何靜態主機(Vercel、Cloudflare Pages、Netlify、GitHub Pages),也可以直接從隨身碟開。

npm run build       # → dist/
npm run preview     # 本機服務 dist/,上台前的最終驗證

npm run preview 這一步不要跳過。dev server 與正式建置的差異(資產路徑、base 設定、build 開關)只有在 preview 才會暴露。

上台前的兩份離線備援dist/ 資料夾(或它產出的 HTML zip)+ 一份 PDF,兩者都放在隨身碟與本機。它們的失效模式不同——dist/ 需要一個能開檔案的瀏覽器,PDF 在任何機器上都能開但沒有 Step 逐步揭露(每個 step 的中間狀態不會分開成頁,最終呈現是完整狀態)。這一點會改變你的講法,所以用 PDF 備援講過一次再上台。

公開分享時的介面收斂

分享靜態建置給外部時,通常不希望對方看到 deck 索引、畫布上的工具列或匯出選單。open-slide.config.ts 的三個開關只在靜態建置生效(dev server 永遠顯示完整 UI):

open-slide.config.ts
import type { OpenSlideConfig } from '@open-slide/core';
 
const config: OpenSlideConfig = {
  build: {
    showSlideBrowser: false,   // 隱藏 deck 索引
    showSlideUi: false,        // 隱藏畫布上的工具列與提示
    allowHtmlDownload: false,  // 隱藏匯出選單(HTML / PDF / PPTX)
  },
};
 
export default config;

部署在子路徑(GitHub Pages 專案頁、反向代理的資料夾、內網路徑)時要設 base前後都要有斜線(例如 '/decks/q3/')。忘了設會得到一個所有資產都 404 的頁面。

上台前 30 分鐘的固定程序

  1. npm run build && npm run preview — 確認正式建置沒問題。
  2. 匯出 PDF(在 Chromium 系瀏覽器),複製到隨身碟。
  3. dist/ 也複製到隨身碟。
  4. 開 present mode,按 p,確認兩個視窗在正確的螢幕。
  5. 確認 inspector 已關閉(i)。
  6. 從頭到尾快速翻一次,特別注意有 Step 的頁面在正向與反向導航下都正常。
  7. 關閉系統通知、螢幕保護、自動睡眠。

一個容易被忽略的渲染前提

open-slide 的 runtime 可能同時把同一頁掛載在多個表面:當前畫布、縮圖列、總覽格、theme 預覽與匯出。因此頁面的渲染必須是決定性的:不要依賴瀏覽器視口尺寸、不要在渲染中讀取隨機值或當前時間、瀏覽器專屬的副作用要加防護。違反這一點的頁面在 dev server 上看起來正常,但在匯出時會壞掉——而匯出通常是你的離線備援,也就是最不該壞的東西。

延伸

  • 器材備援與現場檢查表:08
  • 出錯時的復原話術:10
  • 框架契約與畫布模型:11

來源