# 为 `.stage` 生成离线资源包 有些 HTML deck 依赖外部图片、字体、CSS 或媒体。离线 mirror 会把可下载的外部资源折入 `.stage`,让 deck 在无网络环境中尽量保持一致播放。 ## 什么时候需要 mirror 使用 mirror,当 deck: - 引用了 CDN 图片、字体或 CSS。 - 需要在断网会议室播放。 - 要上传到长期归档系统。 - 要交给不能访问公网的团队。 如果 deck 已经只使用本地资源,不需要 mirror。 ## 1. 准备 `.stage` 先生成普通 `.stage`: ```bash pnpm convert pack ./my-deck --out ./my-deck.stage ``` 或使用 `slidestage-pack` 生成。 ## 2. 运行 mirror 在 `SlideStageLite` 仓库中运行: ```bash pnpm mirror ./my-deck.stage -o ./my-deck.offline.stage ``` 输出文件会写在 `-o` 指定路径。 ## 3. 调整资源预算 默认策略会限制单个资源和总下载量。大型 deck 可以按需调整: ```bash pnpm mirror ./my-deck.stage \ -o ./my-deck.offline.stage \ --max-asset-bytes 10485760 \ --max-total-bytes 209715200 ``` 建议先压缩源资源,而不是无限提高预算。 ## 4. 是否包含脚本和 iframe 默认不建议 mirror 外部脚本和 iframe。只有在来源可信时才开启: ```bash pnpm mirror ./my-deck.stage \ -o ./my-deck.offline.stage \ --include-scripts \ --include-iframes ``` 外部脚本即使被镜像,播放时仍然运行在 deck sandbox 中。不要对不可信来源开启。 ## 5. 生成报告 可以输出 Markdown 报告用于审计: ```bash pnpm mirror ./my-deck.stage \ -o ./my-deck.offline.stage \ --report ./mirror-report.md ``` 报告应说明: - 成功镜像的 URL。 - 写入包内的路径。 - 跳过的 URL。 - 跳过原因,例如过大、不可达、被策略阻止。 ## 6. 验收离线包 把 `my-deck.offline.stage` 拖入 Lite。 检查: - 断网后图片和字体仍可显示。 - `offline` badge 或等价提示符合预期。 - speaker notes 和批注不受影响。 - 需要信任能力的 deck 仍会显示授权提示。 ## 安全策略 Mirror 默认应拒绝: - localhost。 - 私有网段。 - link-local 地址。 - 云元数据地址。 - 明显不可下载或超预算资源。 如果确实需要访问私有网络资源,应在隔离网络中运行,并明确记录原因。 ## 常见问题 ### 离线后仍有资源丢失 检查报告中的 skipped URLs。常见原因是资源过大、服务端拒绝下载、URL 由 JavaScript 动态生成。 ### JS 动态加载的资源没有被 mirror Mirror 主要重写静态 HTML/CSS 引用。JavaScript 字符串、运行时 `fetch()`、动态 `import()` 不保证被发现。 ### 输出包太大 压缩图片、裁剪视频,或降低 `--max-total-bytes` 让 mirror 显式跳过过大资源。