Jeroen 开源了 tar-vfs-index。这个 npm 工具为 tar 或 tar.gz 生成 JSON metadata,记录每个文件在解压后 tar 数据里的 start/end 偏移,格式兼容 Emscripten 的 file_packager。
这事不大,但很准。WebAssembly 应用可以用 WORKERFS 把 tar Blob 挂成虚拟文件系统,读取文件时按范围 slice。文件不必逐个解包,也不必复制进 Wasm heap。WebR 已经用它分发 R package,目标是加载更快、少做内存拷贝,同时继续托管在普通静态服务器上。
tar-vfs-index 做的是偏移索引,不是新文件系统
tar 的结构很老派:512 字节 header,后面跟文件内容,再按块填充。文件内容平铺、连续,天然适合用字节偏移定位。
tar-vfs-index 把这件事自动化。它扫描 tar 或 tar.gz,生成一份 file_packager 兼容的 metadata。metadata 里记录每个文件在解压后 tar blob 中的 start/end 偏移。
这里有个关键限制:tar.gz 仍要先通过浏览器的 DecompressionStream 解成 tar Blob。随机访问发生在解压后的 tar 数据上,不是直接对 gzip 原始压缩流随机读取。
| 问题 | 传统做法 | tar-vfs-index 路线 | 实际影响 |
|---|---|---|---|
| 文件定位 | 解包后遍历文件 | 用 JSON metadata 记录偏移 | 少做目录和文件搬运 |
| VFS 挂载 | 把文件写入虚拟文件系统 | WORKERFS 挂载 tar Blob | 读取时按范围 slice |
| 内存压力 | 文件容易进入 Wasm heap | 数据留在 JS/浏览器 Blob 层 | 更适合浏览器内存受限场景 |
| 部署方式 | 需要处理一堆文件 | metadata 可单独 JSON,也可追加进 tarball | 静态服务器也能放 |
不能把它说成“零内存”。解压后的 tar Blob 仍然占浏览器侧资源。它省掉的是逐文件解包、重复复制、塞进 Wasm heap 这类成本。
WebR 这类应用会先受益,开发者动作也很明确
最直接受益的是 WebR、Emscripten 应用、浏览器端科学计算和教学环境。
典型场景是在线 R 环境加载 R package。过去可能要下载 tar.gz,解压,逐文件写入虚拟文件系统。现在可以把解压后的 tar Blob 挂上去,再让 WORKERFS 按 metadata 找文件。
对开发者来说,动作很具体:
- 如果已有 tar/tar.gz 分发包,可以评估用 tar-vfs-index 生成 metadata。
- 如果应用依赖 Emscripten VFS,可优先验证 WORKERFS 挂载路径。
- 如果包很多、文件碎、启动慢,优先测“少复制”带来的收益,而不是先换框架。
对 WebR 这类项目,价值更实在。包仍可放在普通静态服务器上,不必引入复杂后端。用户少等一段“无意义搬运”,开发者也少维护一层胶水代码。
但边界也清楚。它依赖 tar 的平铺结构、Emscripten/WORKERFS 的 Blob slicing、浏览器侧可用的 DecompressionStream。换成需要写入的文件系统、复杂压缩格式,或不走 Emscripten VFS 的运行时,收益就会变窄。
Wasm 生态少谈一点口号,多修数据通路
Wasm 过去几年常被包装成“把原生软件搬进浏览器”。这句话没错,但太粗。真把 R 这种重文件 I/O 的系统搬进去,问题马上变成脏活:包怎么下,文件怎么挂,内存怎么省,POSIX 文件访问怎么少改。
这里的瓶颈未必是算力。很多时候,是数据布局和内存复制在收税。
tar-vfs-index 的好处,正是它没有发明一套新宇宙。它利用 tar 的平铺结构,贴合 Emscripten file_packager metadata,再交给 WORKERFS 做 Blob slicing。小工具,硬接口,少废话。
这有点像早期 Unix 管道哲学。Doug McIlroy 那句“写程序,让它们一起工作”放在这里很合适。今天的对象不是命令行文本流,而是浏览器里的 Blob、metadata、VFS 和 Wasm heap。
我更在意接下来三个变量:
| 观察点 | 为什么重要 | 该怎么判断 |
|---|---|---|
| 解压后 tar Blob 的内存占用 | tar.gz 不是直接随机访问,仍要先解压 | 大包场景是否会顶到浏览器内存限制 |
| DecompressionStream 表现 | 解压速度和兼容性会影响启动体验 | 不同浏览器是否稳定、是否足够快 |
| metadata 方案稳定性 | 可单独 JSON,也可追加进 tarball | 工具链是否容易集成、缓存是否好处理 |
原文没有给具体性能倍数,就别替它吹。工程优化最怕把“少搬一次”说成“没有成本”。
我对这类工具反而更有好感。它不靠大词赢人,而是把 Wasm 落地时最烦人的一段路修平。浏览器端计算要继续往真实应用走,靠的不是又一个框架名字,而是这种数据通路上的苦功夫。
“工欲善其事,必先利其器。”这里的器不是新平台,是一张偏移表。听着小,刚好扎在痛处。
