外观
/vendor —— 前端预览引擎(本地 vendored,零外链)
控制台「档案库」的附件预览需要自己渲染,不能把渲染权交给浏览器自带的 PDF 插件。 原因见 docs/public/console/console.js 顶部 VENDOR 段落的注释:
2026-10-11 老板实测:点「预览」后预览框出现了但里面没有任何画面、且弹出下载。 这是 Chrome「下载 PDF 而不是自动打开」(企业策略
AlwaysOpenPdfExternally/ 用户偏好) 或 PDF 插件被禁用时的典型表现 ——iframe.src = blob:依赖客户端的 PDFium 插件, 客户端一改策略预览就废。
所以这里放两个开源库,由前端自己把字节渲成画面:
| 目录 | 库 | 版本 | 许可 | 文件 |
|---|---|---|---|---|
pdfjs/pdf.min.js + pdf.worker.min.js | pdf.js(Mozilla) | 3.11.174 | Apache-2.0(见 pdfjs/LICENSE) | PDF → <canvas>,自己管翻页 / 缩放 / 页码 |
docx/docx-preview.min.js | docx-preview | 0.4.1 | Apache-2.0(见 docx/LICENSE) | docx → HTML,保段落 / 表格 / 图片 |
docx/jszip.min.js | JSZip | 3.10.1 | MIT 或 GPLv3(见 docx/LICENSE-jszip.md) | docx-preview 的外部依赖(docx 就是 ZIP) |
为什么放在 /vendor/ 而不是 /console/?
deploy/nginx.conf 给 location ^~ /console/ 钉了 Cache-Control: no-store(管理面内容不许 被缓存,改动立即生效)。预览库合计约 1.5MB,若放在 /console/ 下就每次点预览都要重下。 放 /vendor/ 走 nginx 默认策略,可被浏览器正常缓存;同源,无 CORS / CSP 问题 (站点 CSP 只有 frame-ancestors 'self',不限制 script-src / worker-src)。
加载方式
console.js 里按需 loadScriptOnce()(点预览才下载,不预载),用 UMD 全局名:
window.pdfjsLib(需设GlobalWorkerOptions.workerSrc指向pdf.worker.min.js)window.JSZip→window.docx(JSZip 必须先于 docx-preview 加载)
升级步骤
bash
cd /tmp && npm pack pdfjs-dist@<版本> && tar -xzf pdfjs-dist-<版本>.tgz
cp package/build/pdf.min.js package/build/pdf.worker.min.js \
/Users/pan/Desktop/程序/官网品牌线/官网/docs/public/vendor/pdfjs/
cp package/LICENSE /Users/pan/Desktop/程序/官网品牌线/官网/docs/public/vendor/pdfjs/LICENSE
# docx-preview / jszip 同理(注意两者版本要匹配,docx-preview 依赖 jszip 3.x)升级后必须跑 node scripts/assert-console-att-preview.mjs(打线上真站、真 COS 字节、 断言 canvas 真的画出了非空像素)—— 只断言 iframe.src 是不够的,本次故障就是栽在这里。
同一条线上的兄弟断言是 node scripts/assert-console-docs-inline.mjs(列表页行内改 + 详情页「看 / 传」 两张卡片);两个都由 scripts/run-all-asserts.mjs 自动纳入 npm test,产物落在 证据/证据-档案库附件预览-20261011/(截图 + 断言文本成对)。

本页讨论
0 条评论还没有评论,来说第一句。