如何配置TypeScript以支持CommonJS到ES模块的导入(node-fetch与Express)
在ES模块项目中同时使用ES模块与CommonJS模块的解决方案
完全可以在同一项目中同时使用ES模块(如node-fetch)和CommonJS模块(如Express),以下是几种可行的解决方法:
方法1:直接用import导入Express
Express作为CommonJS模块,在ES模块环境中可直接通过import语法导入,Node.js的ES模块加载器会自动处理兼容。将原有的require语句替换为:
import express from 'express';
你的tsconfig.json已开启esModuleInterop: true,该配置会让TypeScript正确处理CommonJS模块的默认导出,因此这种方式可以正常工作。
方法2:动态导入Express(兼容特殊场景)
如果直接import出现兼容性问题,可使用Node.js的动态import()函数(返回Promise),在异步逻辑中加载:
async function initServer() { const { default: express } = await import('express'); const app = express(); // 服务器初始化逻辑 } initServer();
这种方式适合按需加载或处理复杂模块交互的场景。
方法3:将特定文件改为CommonJS后缀
若不想修改导入语法,可将使用require的文件后缀改为.cjs,Node.js会自动识别该后缀的文件为CommonJS模块,此时就能正常使用const express = require('express')。但这种方式会拆分模块类型,增加项目复杂度,仅推荐在特殊需求下使用。
关键配置验证
确保你的tsconfig.json中module设置为Node16或NodeNext(你的配置已满足),同时开启esModuleInterop: true,这两个配置是TypeScript正确处理Node.js混合模块场景的核心。另外,你的Node.js版本19.1.0已支持完整的ES模块与CommonJS交互能力,无需升级。
内容的提问来源于stack exchange,提问作者pcace
相关产品推荐
相关产品推荐

