在Node.js ESM环境加载wasm-pack构建的库时出现错误
问题:Node.js ESM环境中使用wasm-pack构建的库出现".wasm"文件扩展名未知错误
我发布了一个用wasm-pack构建的fhe-wasm库,但在使用时遇到如下错误:
file:///mnt/user-data/jan/aztec2-internal/yarn-project/.pnp.loader.mjs:131 throw new Error(`Unknown file extension ".wasm" for ${filepath}`); ^ Error: Unknown file extension ".wasm" for /mnt/user-data/jan/aztec2-internal/yarn-project/.yarn/cache/fhe-wasm-npm-0.1.4-159fe086bd-0b8014b75e.zip/node_modules/fhe-wasm/fhe_wasm_bg.wasm at getFileFormat (file:///mnt/user-data/jan/aztec2-internal/yarn-project/.pnp.loader.mjs:131:13) at load$1 (file:///mnt/user-data/jan/aztec2-internal/yarn-project/.pnp.loader.mjs:185:18) at nextLoad (node:internal/modules/esm/loader:163:28) at ESMLoader.load (node:internal/modules/esm/loader:605:26) at ESMLoader.moduleProvider (node:internal/modules/esm/loader:457:22) at new ModuleJob (node:internal/modules/esm/module_job:63:26) at #createModuleJob (node:internal/modules/esm/loader:480:17) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:434:34) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:78:21)
请问有人知道该问题的原因吗?另外我注意到wasm-pack目前对Node.js的ESM支持不完善,已经修改了TypeScript绑定并提交了特性请求。
原因分析
这个错误的核心是:
- Node.js原生ESM加载器不支持直接导入
.wasm文件,ESM规范中未将.wasm列为可直接导入的模块类型,必须通过WebAssembly相关API手动加载实例化。 - wasm-pack的Node.js ESM模板存在缺陷,它生成的绑定代码会尝试用
import语句直接引入.wasm文件,这种写法在Node.js ESM环境下会触发扩展名识别错误。
解决方向
- 手动修复绑定代码:将生成的TypeScript/JS绑定中的
.wasm导入逻辑,替换为Node.js兼容的加载方式,例如:// 替换原有的import语句,改用fs读取并实例化 import fs from 'fs'; import path from 'path'; const wasmBuffer = fs.readFileSync(path.join(__dirname, 'fhe_wasm_bg.wasm')); const { instance } = await WebAssembly.instantiate(wasmBuffer); - 适配Yarn PnP环境:由于你使用了Yarn PnP,需要在项目配置中添加
.wasm扩展名的处理规则,让PnP加载器能够正确识别这类文件。 - 等待官方修复:你提交的特性请求正是针对wasm-pack的ESM支持问题,可关注该请求的进展,等待官方推出兼容Node.js ESM的模板。
内容的提问来源于stack exchange,提问作者Jan Beneš
相关产品推荐
相关产品推荐

