WebAssembly compiled module cache
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.3k
- Merge trung bình
- 4 ngày 2 giờ
- Pull request đã merge (30 ngày)
- 283
Mô tả
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.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Issue không nêu tên tệp triển khai hoặc các bài kiểm thử; hãy bắt đầu bằng cách xem xét các điểm vào WebAssembly.compile và WebAssembly.compileStreaming, cùng lịch sử tuần tự hóa trong #18265. Được coi là hoàn thành khi có thể hỗ trợ một bộ nhớ đệm module đã biên dịch có thể tải module.wasm từ một thư mục bộ nhớ đệm của hệ điều hành, đồng thời xử lý các mối lo ngại về khóa bộ nhớ đệm và dạng API được đề xuất.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- javascript, node.js, wasm
- Lĩnh vực
- backend, performance
- Loại issue
- Tính năng
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 30/100