You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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š

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:35:18