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

Node.js CommonJS老项目对接TS编译ES模块的最佳实现方案咨询

解决方案

以下是几种可落地的兼容方案,可根据项目实际情况选择:

方案1:调整TS导出方式为命名导出(最推荐,无额外配置)

TS中默认导出的内容编译为CommonJS规范时,会自动挂载到exports.default属性下,所以才会出现需要额外加.default的情况。直接改用命名导出即可避开这个问题:

// 修改TS导出语法,去掉default
export class DemoClass {
  public static sayHello() {
    console.log("Hello from demo class...");
  }
}

遗留JS中引入方式直接改为解构即可:

var { DemoClass } = require('./lib/DemoClass');
DemoClass.sayHello();

优点:无额外配置、无兼容问题,符合TS社区常规导出习惯。

方案2:保留默认导出,require时直接取default属性

如果不想修改TS侧的导出写法,可以在引入时直接提取default属性,不需要每次调用都加后缀:

var DemoClass = require('./lib/DemoClass').default;
DemoClass.sayHello();

优点:TS侧代码无需改动,改造成本极低。

方案3:TS侧添加兼容代码,让CommonJS可以直接引入默认导出

如果必须保留TS的默认导出写法,又不想修改JS侧的引入逻辑,可以在TS模块末尾追加兼容代码:

export default class DemoClass {
  public static sayHello() {
    console.log("Hello from demo class...");
  }
}

// 追加兼容代码,编译后会直接覆盖module.exports为默认导出内容
module.exports = DemoClass;

此时JS侧可以直接按原有习惯引入:

var DemoClass = require('./lib/DemoClass');
DemoClass.sayHello();

注意:如果你的TS模块同时存在默认导出和命名导出,该方案会导致命名导出丢失,仅适合只有单个默认导出的模块。

方案4:升级Node.js版本后使用动态import(适合逐步迁移到ESM规范的场景)

如果将Node.js升级到v14.13.0以上版本,也可以在CommonJS模块中使用异步的import()语法引入TS编译后的模块:

// app.js中异步引入
async function run() {
  const { default: DemoClass } = await import('./lib/DemoClass');
  DemoClass.sayHello();
}
run();

优点:为后续全项目升级到ESM模块规范做铺垫。

内容的提问来源于stack exchange,提问作者igorludi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:24:00