如何在ES模块(.mjs文件)中加载Native Node Addons?
在ES模块(.mjs)中加载Node.js原生模块的解决方案
可行方案:使用createRequire桥接CommonJS加载逻辑
这是最直接且官方支持的方法,在ES模块中创建CommonJS风格的require函数,以此加载.node原生模块:
import { createRequire } from 'module'; // 基于当前模块的URL创建require函数 const require = createRequire(import.meta.url); // 像CommonJS中一样加载原生模块 const mod = require('./addon'); console.log(mod.add(1, 2)); // 输出3
为什么之前的尝试失败?
- 方法1/4报错:ES模块的解析规则不会自动查找
.node后缀的文件,必须通过CommonJS的require来处理这类特殊后缀。 - 方法2报错:Node.js没有内置针对
.node扩展名的ES模块加载器,直接导入会触发未知扩展名错误。 - 方法3报错:
import()是异步操作,返回的是Promise对象,直接调用mod.add相当于在Promise实例上调用方法,自然会报错。
其他可选方案(不推荐,复杂度高)
如果一定要用ES模块的导入语法,可以自定义模块加载器,但需要编写额外的加载逻辑并通过--experimental-loader参数启动Node.js,这种方式仅适合特殊场景,日常使用优先推荐createRequire方案。
内容的提问来源于stack exchange,提问作者UndefinedCpp
相关产品推荐
相关产品推荐

