使用Express+TypeScript无扩展名导入文件报错[ERR_MODULE_NOT_FOUND]求助
Express + TypeScript 导入文件无扩展名报错问题
错误信息
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\myexpress\dist\config\test' imported from C:\btc-myexpress\dist\server.js
相关配置与代码
tsconfig.json 配置
{ "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "outDir": "dist", "module": "ES2022", "moduleResolution": "Bundler", "sourceMap": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
nodemon.json 配置
{ "watch": ["src"], "ext": ".js,.ts", "ignore": [], "exec": "tsc && node dist/server.js" }
package.json 配置
{ "name": "myexpress", "version": "1.0.0", "description": "", "type": "module", "main": "server.js", "keywords": [], "author": "test", "scripts": { "dev": "nodemon", "start": "npx tsx watch src/server.ts", "prettier": "npx prettier --write src/server.ts", "lint": "eslint . --fix" }, ... }
server.ts 代码
import express from 'express'; import { MyFunc } from './config/test'; const app = express(); const data = MyFunc(); const port = process.env.PORT || 3000; const server = app.listen(port, async () => { console.log(`server started on port: ${port}`); });
config/test.ts 代码
export const MyFunc = () => { return 'test'; };
文件夹结构
/dist /src /config /routes/ /node_modules tsconfig.json nodemon.json package.json
问题
用Express+TypeScript开发,希望导入文件时不用加扩展名,但运行后出现上述报错。现有大量文件,不想逐个修改导入路径添加.js,求解决办法。
解决方法
方法一:调整tsconfig配置,让TypeScript自动补全扩展名
修改tsconfig.json的compilerOptions,将moduleResolution改为NodeNext或Node16,同时添加关键配置,让TypeScript按照Node.js的ES模块规则编译,自动给生成的JS文件补全导入扩展名:
{ "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "outDir": "dist", "module": "ES2022", "moduleResolution": "NodeNext", // 替换原Bundler配置 "sourceMap": true, "esModuleInterop": true, "resolveJsonModule": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
修改后重新编译运行,生成的dist目录下JS文件的导入语句会自动带上.js扩展名,Node.js即可找到对应模块。
方法二:直接用tsx运行(跳过编译步骤)
你的package.json中已经配置了start脚本:npx tsx watch src/server.ts,tsx支持直接运行TypeScript文件,且允许无扩展名导入。直接执行npm run start启动开发服务即可,无需先编译成JS再运行,绕开Node.js的扩展名要求。
方法三:配置package.json的exports字段(适合特定路径)
在根目录的package.json中添加exports字段,指定项目内路径的映射,例如:
{ "exports": { "./config/*": "./dist/config/*.js" } }
不过该方法需要逐个配置路径,适合少量特定场景,效率不如前两种方法。
问题根源
Node.js的ES模块规范要求导入必须带完整扩展名(.js、.mjs等),但当前TypeScript配置使用moduleResolution: Bundler,编译时不会自动给导入语句补全扩展名,导致dist目录下的JS文件导入路径缺少扩展名,Node.js无法找到对应模块。
内容的提问来源于stack exchange,提问作者lambdamaster
相关产品推荐
相关产品推荐

