CommonJS模式TypeScript项目导入type:module类型ESM包问题求助
解决方案
方案1:将自身项目切换为ESM模块格式(推荐)
这是最彻底的适配方案,不会产生额外的异步逻辑开销:
- 在你自己项目的
package.json中新增配置:"type": "module" - 修改
tsconfig.json的对应配置:
{ "compilerOptions": { "target": "ES2020", "module": "NodeNext", "moduleResolution": "NodeNext", "esModuleInterop": true, "allowSyntheticDefaultImports": true } }
- 之后直接使用标准ES导入语法即可:
import stringifyObject from 'stringify-object';
方案2:保持自身项目为CommonJS格式,使用异步动态导入
如果不想改动现有项目的模块体系,可使用Node支持的动态import()语法加载ESM包,注意该方法是异步的:
// 异步函数内使用 async function demo() { // ESM包的默认导出挂载在返回值的default属性上 const { default: stringifyObject } = await import('stringify-object'); // 正常使用包的能力 console.log(stringifyObject({ foo: 'bar' })); } // 也可使用Promise.then写法 import('stringify-object').then(({ default: stringifyObject }) => { // 业务逻辑 });
错误原因说明
你之前修改TS配置、使用import ... = require()语法均无效的核心原因是:该错误是Node.js原生模块机制的硬性限制,CommonJS模块中不允许同步require ESM格式的模块,和TypeScript的编译配置无关。修改node_modules内第三方包的配置会引发依赖连锁问题,完全不推荐。
内容的提问来源于stack exchange,提问作者dx_over_dt
相关产品推荐
相关产品推荐

