Node.js路径存在却找不到模块?解决ES模块导入报错问题
问题:Node.js 18 + TypeScript 5.3.3运行时模块找不到错误
运行时抛出以下错误:Unable to import main.handler module. Error: Cannot find module '/function/code/skill/index' imported from /function/code/main.js
本地TypeScript编译阶段无任何导入错误,但执行时无法定位指定模块。相关代码结构如下:
编译后的main.js
import { MainScenario } from "./skill/index"; export async function handler(request, context) { // ... }
编译后的skill/index.js
export * from "./Scenario";
编译后的Scenario.js
export const MainScenario = { // ... }
package.json
{ "name": "example", "version": "1.0.0", "description": "", "type": "module", "main": "main.js", "scripts": { "build": "rimraf ./build && tsc" }, "devDependencies": { "@types/node": "^20.11.19", "rimraf": "^5.0.5", "typescript": "^5.3.3" } }
tsconfig.json
{ "compilerOptions": { "target": "es2022", "lib": ["es2022"], "module": "ES2022", "rootDir": "src", "moduleResolution": "Node", "resolveJsonModule": false, "allowJs": true, "outDir": "build", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "noImplicitAny": true, "skipLibCheck": true } }
原因分析与解决方案
核心问题
Node.js的ES模块(ESM)规范要求导入路径必须包含完整的文件后缀(如.js),但当前TypeScript编译生成的代码中,导入语句省略了后缀,导致运行时无法正确解析模块位置。
解决方案
方案1:调整TypeScript配置,自动生成带后缀的导入语句
修改tsconfig.json中的module和moduleResolution配置,让TypeScript严格按照ESM规范生成代码:
{ "compilerOptions": { // 替换原有module和moduleResolution配置 "module": "NodeNext", "moduleResolution": "NodeNext", // 其余原有配置保持不变 } }
重新执行npm run build后,编译生成的导入语句会自动添加.js后缀,符合Node.js ESM的要求。
方案2:手动补全编译后代码的文件后缀(临时应急)
如果暂时无法修改TS配置,可以直接修改编译后的文件:
main.js中修改导入语句:import { MainScenario } from "./skill/index.js";skill/index.js中修改导出语句:export * from "./Scenario.js";
方案3:检查部署路径的正确性
确认部署环境中,main.js所在的/function/code目录下确实存在skill/index.js文件,避免部署过程中出现文件遗漏或路径错位的情况。
内容的提问来源于stack exchange,提问作者Viewed
相关产品推荐
相关产品推荐

