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 落地时最烦人的一段路修平。浏览器端计算要继续往真实应用走,靠的不是又一个框架名字,而是这种数据通路上的苦功夫。

“工欲善其事,必先利其器。”这里的器不是新平台,是一张偏移表。听着小,刚好扎在痛处。