從 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 資料夾) | — |
| 每頁一張 1920×1080 橫向 PDF | Safari 不支援,要在 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):
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 分鐘的固定程序
npm run build && npm run preview— 確認正式建置沒問題。- 匯出 PDF(在 Chromium 系瀏覽器),複製到隨身碟。
- 把
dist/也複製到隨身碟。 - 開 present mode,按
p,確認兩個視窗在正確的螢幕。 - 確認 inspector 已關閉(
i)。 - 從頭到尾快速翻一次,特別注意有
Step的頁面在正向與反向導航下都正常。 - 關閉系統通知、螢幕保護、自動睡眠。
一個容易被忽略的渲染前提
open-slide 的 runtime 可能同時把同一頁掛載在多個表面:當前畫布、縮圖列、總覽格、theme 預覽與匯出。因此頁面的渲染必須是決定性的:不要依賴瀏覽器視口尺寸、不要在渲染中讀取隨機值或當前時間、瀏覽器專屬的副作用要加防護。違反這一點的頁面在 dev server 上看起來正常,但在匯出時會壞掉——而匯出通常是你的離線備援,也就是最不該壞的東西。