Express.js 在 ts 模式下运行 npm run dev 的时候无法找到引入项的原因

一、问题描述

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

bash 复制代码
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 中设置了

json 复制代码
"paths": {
  "entity/*": ["./src/entity/*"],
}

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

ts 复制代码
import {EntityUser} from "entity/User"

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

ts 复制代码
import {EntityUser} from "../../entity/User"

但是为什么不行呢?

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

我的 npm run dev 使用的指令是 npx ts-node , 当使用 ts-node 直接运行 ts 项目时,默认它是不会识别上面那个在 tsconfig.json 中的 paths 设置内容的,不生效。

需要单独安装一个插件 tsconfig-paths 来让它生效。

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

bash 复制代码
npm install --save-dev tsconfig-paths

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

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

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

bash 复制代码
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 之后它会自动替换成正确的路径,结果它没有变化。

js 复制代码
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

bash 复制代码
yarn add module-alias

2. package.json 中添加

json 复制代码
 "_moduleAliases": {
   "entity": "dist/src/entity"
 }

3. 在 app.ts 中添加

ts 复制代码
import 'module-alias/register'

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

相关推荐
尤水就下21 分钟前
🔥预热:在线文档的 block 架构是如何实现的(未完待续...)
前端·javascript·架构
全栈项目管理程序猿44 分钟前
ArcGIS JS 基础教程(29):CSVLayer 表格点位图层
前端·javascript
骑着蜗牛撵大象3271 小时前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
溪语流沙1 小时前
【Web全栈进阶】前端世界观:现代工具链与框架为什么存在
前端·javascript·vue.js
kyriewen2 小时前
我逐个测了 JSON.stringify 的 7 个坑:第 1 个就在丢数据
前端·javascript·程序员
song5012 小时前
React Native for OpenHarmony 实战:三方库 react-native-ratings 的鸿蒙化适配指南
javascript·react native·react.js·分类·harmonyos
朱包林3 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
谢亮_vipxieliang3 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
WeiXin_DZbishe3 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
西西学代码4 小时前
像素和颜色之间的转换(Flutter)
前端·javascript·flutter