WebAssembly compiled module cache
还没有人认领这个 Issue。
- 主要语言
- JavaScript
- 星标
- 122k
- 派生
- 37.3k
- 平均合并
- 4 天 2 小时
- 30 天内合并 PR
- 283
描述
Is your feature request related to a problem? Please describe.
Large WASM modules take a while to compile, impacting startup times. Browsers solve this problem by caching compiled module data.
WebAssembly is a promising media for software distribution. It makes sense to compile for WebAssembly once, instead of shipping multiple binaries for each supported CPU architecture / OS pair, doesn't it? There's a growing number of tools targeting this particular segment, e.g. https://wasmer.io.
Node.js has unique advantages as a WASM runner:
-
WASI as a standardised interface for interfacing with the OS (e.g. accessing files, etc.) is insufficient for most practical needs. With Node, one can leverage a plethora of high quality battle-tested cross platform libraries.
-
V8 is top notch! It beats competing WASM engines in terms of compile times, resource consumption and the footprint of compiled WASM files (a single data point: V8 produces 160MiB for a 50MiB WASM file, a competitor generates 1+GiB).
-
NPM is super robust. Competitors have their own package managers but not particularly reliable ones.
The only component missing in Node.js is a compiled module cache.
It takes 47s to compile the previously mentioned 50MiB WASM file. With a cache POC, the startup time is reduced to under 1s.
Describe the solution you'd like
require('wasm/cache').loadFile('module.wasm')
as a cache-enabled moral equivalent of
WebAssembly.compile(require('fs').readFileSync('module.wasm'))
Cache files to be stored in OS-mandated cache directory, e.g. ~/.cache/node/wasm-cache on Linux.
Describe alternatives you've considered
It used to be possible to serialise a WebAssembly module to a file explicitly. #18265
It stopped working since Node.js 13 due to changes in V8 and there's no way to make it work again.
Instead of introducing a new API, it is possible to enhance WebAssembly.compile/WebAssembly.compileStreaming. Unfortunately, it's hard to come up with a good cache key. We could sha256 the data, but that's inefficient.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
该 issue 未指定实现文件或测试;首先检查 WebAssembly.compile 和 WebAssembly.compileStreaming 入口点,以及 #18265 中的序列化历史。完成的标准是支持一种已编译模块缓存,能够从操作系统缓存目录加载 module.wasm,同时处理缓存键相关的问题和提议的 API 形式。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- javascript, node.js, wasm
- 领域
- backend, performance
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 30/100