Node.js+ESM+TypeScript环境无法导入wasm-pack生成的fhe-wasm包
解决Node.js ESM中导入wasm-pack生成FHE-Wasm库的问题
1. 锁定wasm-pack构建目标
针对Node.js ESM场景,优先使用nodejs目标构建,执行命令:
wasm-pack build --target nodejs
该目标默认生成CommonJS格式文件,后续我们再调整为ESM规范。
2. 修正package.json的ESM核心配置
手动修改package.json时,必须覆盖以下关键字段,避免Node.js模块解析歧义:
{ "type": "module", "main": "./pkg/[你的库名].js", "module": "./pkg/[你的库名].js", "exports": { ".": "./pkg/[你的库名].js" }, // 保留wasm-pack自动生成的files、types等字段,确保Wasm文件和类型定义被正确发布 }
3. 替换JS文件中的Wasm加载逻辑
wasm-pack生成的JS文件默认用CommonJS语法加载Wasm,需要手动替换为ESM兼容写法:
找到原代码中类似这样的片段:
const path = require('path').join(__dirname, '[你的库名]_bg.wasm'); const bytes = require('fs').readFileSync(path);
替换为:
import { readFileSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const bytes = readFileSync(join(__dirname, '[你的库名]_bg.wasm'));
4. 正确的ESM导入测试
在你的Node.js ESM项目中,按异步逻辑导入并初始化:
import init, { 你的库方法 } from '[你的库包名]'; async function run() { // 必须先完成Wasm模块初始化 await init(); // 调用库中的功能 const result = 你的库方法(); console.log(result); } run();
注意:Wasm模块初始化是异步操作,必须等待init()完成后才能调用其他库方法。
5. 常见报错排查点
- 确认
package.json的files字段包含.wasm文件(wasm-pack默认已添加,手动修改时不要误删) - 使用Node.js 16及以上版本(对ESM支持更稳定)
- 若直接导入本地pkg目录,需在导入路径后添加
.js扩展名(Node.js ESM要求明确扩展名)
内容的提问来源于stack exchange,提问作者Jan Beneš
相关产品推荐
相关产品推荐

