摘要:Express.js后台项目改用TypeScript后,运行npm run dev时出现模块找不到错误。原因是ts-node默认不识别tsconfig.json中的路径映射(paths)。解决方案是安装tsconfig-paths插件。构建后仍出现类似问题,发现构建生成的JS资料仍应用路径别名而未转换。最终经过安装module-alias,在package.json配置别名

一、问题描述

我有个 express.js 写的后台,改写成了 ts 支持的,在使用 npm run dev 运行的时候出现错误

C:\Users\Administrator\AppData\Roaming\npm\yarn.cmd run dev
yarn run v1.22.22
$ npx ts-node bin/portal.ts
Error: Cannot find module 'entity/User'
Require stack:
- E:\website\portal\src\user\invitation.ts
- E:\website\portal\app.ts
- E:\website\portal\bin\portal.ts
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15)
at Function.Module._resolveFilename.sharedData.moduleResolveFilenameHook.installedValue [as _resolveFilename] (C:\Users\Administrator\AppData\Local\npm-cache\_npx\1bf7c3c15bf47d04\node_modules\@cspotcode\source-map-support\source-map-support.js:811:30)

二、查找问题和解决

tsconfig.json 中设置了

"paths": {
"entity/*": ["./src/entity/*"],
}

所以所有在 /src/entity/ 的声明文件都能在 .ts 的文件中直接这样引用

import {EntityUser
} from "entity/User"

这种写法等同于直接引用原始路径的使用

import {EntityUser
} from "../../entity/User"

但是为什么不行呢?

问了下 cursor 它的回答是这样的:

在这里插入图片描述
我的 npm run dev 使用的指令是 npx ts-node , 当使用 ts-node 直接运行 ts 项目时,默认它是不会识别上面那个在 tsconfig.json 中的 paths 设置内容的,不生效。
需要单独安装一个插件 tsconfig-paths 来让它生效。

所以安装这个插件,我只喜欢用 yarn,而不喜欢用 npm 安装;

npm install --save-dev tsconfig-paths

再执行之前 npm run dev 就能正常使用了。

三、build 完成之后又遇到了问题

build 完成之后,运行 build 之后项目时遇到了新问题

C:\Users\Administrator\.pm2\logs\portal-error.log last 15 lines:
0|portal | at require (node:internal/modules/cjs/helpers:119:18)
0|portal | at Object.<anonymous>
  (E:\website\portal\dist\src\user\invitation.js:14:16)
  0|portal | at Module._compile (node:internal/modules/cjs/loader:1198:14)
  0|portal | at Object.Module._extensions..js (node:internal/modules/cjs/loader:1252:10)
  0|portal | at Module.load (node:internal/modules/cjs/loader:1076:32)
  0|portal | at Function.Module._load (node:internal/modules/cjs/loader:911:12)
  0|portal | at Module.require (node:internal/modules/cjs/loader:1100:19)
  0|portal | at Module.Hook._require.Module.require (C:\Users\Administrator\AppData\Roaming\npm\node_modules\pm2\node_modules\require-in-the-middle\index.js:101:39) {
  0|portal | code: 'MODULE_NOT_FOUND',
  0|portal | requireStack: [
  0|portal | 'E:\\website\\portal\\dist\\src\\user\\invitation.js',
  0|portal | 'E:\\website\\portal\\dist\\app.js',
  0|portal | 'E:\\website\\portal\\dist\\bin\\portal.js'
  0|portal | ]
  0|portal |
  }

当查看 build 之后生成的 js 文件时,发现 const User_1 = require("entity/User"); 还是使用的那种 alias 的方式引入,我以为在 build 之后它会自动替换成正确的路径,结果它没有变化。

const express_1 = __importDefault(require("express"));
const Response_1 = require("../response/Response");
const utility_1 = require("../utility");
const router = express_1.default.Router();
const DB_NAME = 'diary';
const DATA_NAME = '邀请码';
const CURRENT_TABLE = 'invitations';
const crypto_1 = __importDefault(require("crypto"));
/// 下面这行 /
const User_1 = require("entity/User");
/
router.get('/list', (req, res) =>
{
(0, utility_1.verifyAuthorization)(req)
.then(userInfo =>
{
let sqlArray = [];

题外: Cursor 算是个你可以随时问它的老辅助了,专业技能绝对高于 95% 的人,而且可以帮你完成所有机械的工作,处理表单是更方便,把所有无聊的工作都交给他就行。方便的很。
当然,它是支持任何语言的,对语言的理解是AI的基础技能。

所以我又问了 Cursor,它的答案是这样的:

在这里插入图片描述

1. 安装 module-alias

yarn add module-alias

2. package.json 中添加

"_moduleAliases": {
"entity": "dist/src/entity"
}

3. 在 app.ts 中添加

import 'module-alias/register'

处理完这些之后,再运行 dist 文件夹中 build 好的项目,果然可以了。

posted @ 2025-08-07 11:14  yfceshi  阅读(28)  评论(0)    收藏  举报