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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:35:59