Node 22 + TS 5.4构建后启动报错:无法找到模块
解决思路
1. 核心原因:ES模块要求完整文件扩展名
Node 22的ES模块(type: module)对相对路径导入有严格要求,必须指定完整的文件扩展名(如.js),不能像CommonJS那样省略。你的报错本质是编译后的JS文件里的导入语句没有带.js后缀,导致Node无法解析。
2. 针对性解决步骤
步骤1:检查编译后的文件与导入语句
- 确认
app/core/ApiServer.js文件是否存在(构建后TS会编译为JS,后缀为.js) - 打开
app/commands/server.js,查看导入语句是否为:
如果是这种情况,必须修改为带扩展名的路径:import { ApiWorker } from '../core/ApiServer'; // 错误:缺少.js后缀import { ApiWorker } from '../core/ApiServer.js';
步骤2:配置TypeScript自动生成带扩展名的导入
修改tsconfig.json,调整模块解析规则,让TS编译时自动为导入路径添加.js后缀:
{ "target": "es2022", "esModuleInterop": true, "module": "ESNext", "moduleResolution": "NodeNext", // 替换原Node为NodeNext/Node16,适配ES模块扩展名规则 "outDir": "app", "resolveJsonModule": true, "forceConsistentCasingInFileNames": true, "allowImportingTsExtensions": false, "noEmit": false }
moduleResolution: NodeNext会让TS按照Node ES模块的规则解析路径,编译时自动将.ts导入转换为.jsallowImportingTsExtensions: false避免TS文件里出现带.ts的导入(编译后会导致Node解析错误)
步骤3:修正TS源文件中的导入路径(可选)
如果TS编译后仍未自动添加扩展名,可以直接在TS源文件中写带.js的导入:
// commands/server.ts import { ApiWorker } from '../core/ApiServer.js';
TS会自动识别这是编译后的JS文件路径,不会报错(需确保tsconfig中moduleResolution为NodeNext/Node16)
步骤4:验证Node运行环境的路径解析
- 运行
node --experimental-specifier-resolution=node app/commands/server.js测试(临时启用宽松解析,仅用于排查) - 如果临时命令能运行,说明确实是扩展名问题,回到步骤2完善TS配置
步骤5:排除其他可能问题
- 检查文件名大小写:Node在大小写敏感的系统(如Linux/macOS)中会区分文件名,确保
ApiServer.ts编译后是ApiServer.js,导入路径大小写一致 - 确认
outDir配置正确:构建后所有JS文件确实生成在app目录下,没有嵌套错误
内容的提问来源于stack exchange,提问作者user1341300
相关产品推荐
相关产品推荐

