执子念

1.3k Star,谢谢大家:File Viewer 这一路把 206 种文件预览慢慢做实了

1.3k Star,谢谢大家:File Viewer 这一路把 206 种文件预览慢慢做实了

这两天重新看 GitHub 数据,File Viewer 公开仓已经来到约 1.3k star,第一反应有点像把锅里的面捞起来,发现里面突然多了一只荷包蛋:来得突然,也是真的开心。

这篇先认真说声谢谢。

感谢阮一峰老师在科技爱好者周刊里提到,也感谢这段时间每一位提 issue、发截图、给样例、帮忙验证内网部署和移动端兼容的朋友。File Viewer 能走到今天,靠的是很多真实业务里的附件问题,一点点被大家拎到了台前。

File Viewer 1.3k star 阶段数据看板

图:GitHub 数据截至 2026/7/9 17:49(北京时间);npm、Docker 和 release matrix 仍采用 2026/7/6 阶段整理口径。npm 下载数为 52 个包聚合统计,包含标准包和历史兼容包,不等同于独立用户数。

1.3k star 背后,真正让我开心的是这些反馈

File Viewer 最初要解决的问题很朴素:企业系统里的附件越来越复杂,用户希望直接在浏览器里看,不想为了一个 Word、一个 CAD 图纸、一个压缩包或者一封邮件,再额外跳到本地软件、服务端转码、云端转换。

真实反馈里,大家遇到的问题往往非常具体:

  • Word 文档目录样式错乱,复杂表格打开很慢。

  • PDF 目录跳转后内容被侧边栏挡住,缩放和搜索浮层位置不舒服。

  • Excel sheet 太多时标签被压扁,图片浮层挡住滚动条。

  • PPTX 背景没出来,worker 路径在不同构建工具里不一致。

  • DWG / DXF / DWF 图纸缩在角落,文字编码和 wasm 路径会出问题。

  • OFD 发票资源路径大小写、BaseLoc、图片资源和 BOM 都可能踩坑。

  • ZIP 里的中文文件名乱码,压缩包内文件还要继续预览。

  • 手机 WebView、Electron file://、内网静态部署、Cloudflare / Nginx / 对象存储,各种环境都要能跑。

这些问题不太适合写成一句“支持很多格式”就结束。它们很细,也很真实。很多时候,用户发来的只有一张截图、一段控制台报错,甚至一句“这个文件打不开”。但就是这些反馈,把项目一点点推向更可用的状态。

GitHub 公开仓截图

图:GitHub 公开仓当前已来到约 1.3k star,issue 里也沉淀了大量真实文件兼容性反馈。

当前 File Viewer 做到了什么

到当前版本 2.1.23,File Viewer 的基础能力已经比较完整:

  • 206 个扩展名映射。

  • 24 条 renderer 链路。

  • 52 个 npm 发布目标。

  • 16 个组件目标。

  • 27 条 smoke 渲染链。

  • 432 个组件渲染目标。

  • Apache-2.0 协议,授权范围以许可证文本为准,接入前建议结合企业内部合规要求确认。

从格式覆盖看,项目现在主要面向这些场景:

  • Office:Word、Excel、PPTX、RTF、ODT、ODS 等。

  • PDF / OFD / Typst:页面渲染、缩放、搜索、目录、打印和导出持续完善。

  • CAD / 工程图纸:DWG、DXF、DWF、DWFX、XPS 等走工程图纸链路。

  • 压缩包:ZIP、RAR、7Z、TAR、GZ、ISO、APK、CBZ 等,支持目录读取和内部文件继续预览。

  • 邮件:EML、MSG、MBOX,支持正文、头信息、附件和附件继续预览。

  • 绘图与脑图:Draw.io、Excalidraw、Mermaid、PlantUML、XMind。

  • 设计与数据:PSD、SQLite、Parquet、Avro、GeoJSON、KML、GDSII、OASIS 等。

  • 常规文件:Markdown、代码、patch、git bundle、图片、HEIC、音视频、字体、3D 模型等。

它的核心价值在于分层:不同格式拆成独立 renderer,再通过 preset 和 full 包给不同团队选择。想轻量就按需装,想快速验收就用 full,想工程化就用 Vite 插件和离线资产复制。

File Viewer 官网首页

图:官网已经围绕纯前端、模块化 renderer、离线部署、生态组件和多格式矩阵重新梳理。

这段时间主要在补什么

最近这几轮更新,看上去 commit 很多,但方向很集中:让项目更适合真实业务接入。

第一,是架构继续模块化。

core 保持纯 TypeScript,负责格式识别、资源加载、renderer 协议、生命周期、搜索、缩放、打印、导出和 controller API。PDF、Word、Spreadsheet、PPTX、CAD、Typst、Archive、Email、Mindmap、Data、EDA 等能力进入独立 renderer。Vue、React、Svelte、jQuery、Web Component 这些生态组件保持各自原生体验,不互相套娃。

第二,是加载性能继续收紧。

PDF、Office、CAD、Typst、压缩包、PSD、Mermaid、XMind、3D、Geo 这些重型能力,只有命中文件类型时才异步加载。IIFE / full 包也在减少首包压力,Worker、WASM、字体和 vendor 资源尽量随包自托管。

第三,是离线部署继续完善。

企业内网场景里,“跑得起来”经常比“看起来优雅”更重要。最近持续修了 PDF worker、DOCX worker、libarchive wasm、CAD wasm、Typst 字体、Draw.io fallback、full 包默认 asset base URL、非 Vite 静态资源路径和移动端 WebView 兼容。

第四,是真实格式继续打磨。

OFD 电子发票资源路径、GBK / GB18030 ZIP 中文文件名、PPTX 背景和 worker、DOCX 目录与复杂样式、Excel 图片浮层、CAD fit 和图层、PDF 目录/页缩略图切换、压缩包内嵌预览、暗色模式与 Shadow DOM 样式隔离,都在这一阶段继续往前推进。

主 Demo:Word 文档预览

图:Demo 左上角保留 GitHub star 徽标,主区域展示真实中文 Word 文档预览和统一工具栏。

一些看起来小、但用户会天天碰到的问题

很多修复不适合做成大标题,但它们很影响使用体验。

比如 PDF。

目录侧边栏打开后,跳转页面不能把正文挤到看不见;搜索浮层不能跑到页面左上角;缩放不能只改外层 CSS 造成文字层错位;导航、页缩略图、目录树、打印、导出要尽量统一。

比如 Word 和 Excel。

Word 要兼顾复杂中文正式文档、目录、图片、表格、worker 解析和移动端性能;Excel sheet 多时要提供可滚动标签,而不是把所有 sheet 挤成一排小薄片。打印能力也要根据格式真实显隐,不能让用户点了以后只打印一个截断视口。

比如 CAD。

DWG / DXF / DWF 远比展示一张图片复杂。图层、实体、缩放、适配、文本编码、wasm 路径、worker 打包、Vite / Webpack / 非构建工具部署,都可能影响最终体验。现在项目通过自研 CAD 能力持续把这些问题收敛到浏览器端。

CAD / DWG 图纸预览

图:DWG 图纸支持图层、结构信息、缩放与适配,适合工程资料库、图纸归档和业务系统里的快速初筛。

比如压缩包。

压缩包预览不能停在列目录。真实业务里,用户会希望点开 ZIP 里的 PDF、DOCX、图片、代码或 JSON 继续预览。移动端还要处理 worker 加载、缓存、内存安全和列表布局。最近的 GBK / GB18030 中文文件名修复,就是来自真实客户文件。

压缩包目录与内部文件预览

图:压缩包预览会先读取目录,用户点击内部文件后再按需解压,并继续交给同一套预览链路。

为什么坚持纯前端

服务端转码当然有它的价值,尤其在追求极致 Office 还原、统一生成图片或 PDF 的场景里。但很多企业系统还有另一类需求:文件不方便出内网,不希望维护转码服务,也不想因为预览功能额外引入复杂后端链路。

File Viewer 选择先把浏览器端能做的部分尽量做好:

  • 文件尽量在浏览器里解析和渲染。

  • Worker / WASM / 字体 / vendor 资源可自托管。

  • 支持 Docker、静态站、私有 CDN、对象存储、内网 Nginx。

  • Vue、React、Web Component、Svelte、jQuery 都有对应组件。

  • 统一 options、事件、controller、生命周期、搜索、缩放、打印、导出和水印。

这条路线的好处是接入轻,部署边界清楚,对隐私和内网更友好。代价也很明确:不同格式的浏览器端还原度会受规范开放程度、文件复杂度和第三方解析能力影响。项目会继续把这些边界写进文档,也欢迎大家用真实样本一起推进。

文档比对页面

图:文档比对页面支持左右并排、同步滚动、示例/URL/上传入口和搜索定位能力,适合合同审阅、材料对照和版本校对。

文档、Demo 和支持矩阵也在一起补

开源组件最怕“代码能跑,用户找不到入口”。这段时间除了修渲染问题,也在不断补文档和 Demo:

  • 官网首页重新梳理核心价值、生态组件、支持矩阵和部署路径。

  • 文档站补充快速开始、纯 JS、Web Component、Vue、React、Svelte、jQuery、CDN/IIFE、Vite plugin、full 包和 Docker。

  • 支持格式页会列扩展名,也说明每类格式的渲染链路和体验边界。

  • Demo 提供分组样例、上传、URL、文档比对、工具栏、fit、搜索、水印、打印、HTML 导出等真实交互。

  • README 同步更新中文和英文入口,方便国内外开发者快速判断是否适合自己的业务。

支持格式矩阵

图:支持格式页把 206 个扩展名、24 条预览链路、按需加载和体验边界放在一起说明。

文档站能力概览

图:文档站持续补充概览、快速开始、生态接入、部署、格式边界和常见问题,尽量让真实接入少走弯路。

也说说数据

这次我重新整理了一下公开数据,口径如下:

  • GitHub 公开仓:约 1.3k stars(当前公开接口 1,265),135 forks。

  • Issue:当前 open issues 5 个,历史关闭数据以仓库 Issues 页为准。

  • npm:52 个发布目标近 30 天合计 299,667 次下载。

  • Docker Hub:2,691 pulls。

  • 本地 release matrix:206 个扩展名映射,24 条 renderer 链路,27 条 smoke 渲染链,432 个组件渲染目标。

这些数字只是阶段快照。尤其 npm 下载数是 package family 聚合值,包含标准包和历史兼容包,不代表独立用户数。更值得看的,是 issue 关闭率、真实文件反馈数量、Demo 和文档是否能把接入路径讲清楚。

接下来还想继续做什么

1.3k star 是一个很开心的节点,但 File Viewer 还有很多事情要继续做:

  • 持续提升 Office、PDF、OFD、CAD、压缩包、邮件这些高频格式的稳定性。

  • 继续优化移动端、WebView、Electron、内网静态部署和非 Vite 工程的体验。

  • 把搜索、定位、视图状态、文档比对、打印、导出和水印做得更一致。

  • 把每一个真实 bug 尽量沉淀成 harness、fixture 或文档说明,减少反复踩坑。

  • 继续欢迎大家提供可公开或可脱敏的真实样本,让支持矩阵更接近生产环境。

最后再说一遍谢谢。

谢谢阮一峰老师在周刊里提到这个项目,谢谢每一位长期关注、反馈和支持 File Viewer 的朋友。一个开源项目最有价值的部分,常常来自社区不断推过来的真实场景,也来自大家一起把边界摸清楚的过程。

项目公开仓库是 flyfish-dev/file-viewer。比数字更重要的,是继续用真实 issue、可复现样本和清晰文档把边界说明白。

继续慢慢做实,继续把复杂附件预览这件事讲清楚。

posted on 2026-07-09 18:16  执子念  阅读(27)  评论(0)    收藏  举报

导航