我在我的项目中切换到 bunder 分辨率,项目构建过程运行良好,当运行此应用程序时,显示错误:
node:internal/errors:496
│ ErrorCaptureStackTrace(err);
│ ^
│
│ Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/node/app/dist/websocket/config/setup' imported from /home/node/app/dist/app.js
│ at new NodeError (node:internal/errors:405:5)
│ at finalizeResolution (node:internal/modules/esm/resolve:327:11)
│ at moduleResolve (node:internal/modules/esm/resolve:980:10)
│ at defaultResolve (node:internal/modules/esm/resolve:1206:11)
│ at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:404:12)
│ at ModuleLoader.resolve (node:internal/modules/esm/loader:373:25)
│ at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:250:38)
│ at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:39)
│ at link (node:internal/modules/esm/module_job:75:36) {
│ url: 'file:///home/node/app/dist/websocket/config/setup',
│ code: 'ERR_MODULE_NOT_FOUND'
│ }
│
│ Node.js v18.20.6
这是打字稿配置:
{
"compilerOptions": {
"target": "ES2020",
"module": "esnext",
"moduleResolution": "bundler",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
},
"include": ["src/**/*"],
"files": ["src/app.ts"]
}
bundler 解析不需要添加文件扩展名。为什么会显示这个错误?这是package.json
:
{
"name": "texhub-broadcast",
"version": "1.0.19",
"description": "",
"main": "./dist/app.js",
"module": "./dist/app.js",
"types": "./dist/app.d.ts",
"type":"module",
"exports": {
"./dist/websocket/conn/socket_io_client_provider": "./dist/websocket/conn/socket_io_client_provider.js",
".": {
"import": "./dist/app.js"
}
},
"files": [
"dist/*"
],
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"lint": "eslint --fix",
"dev": "vite-node src/app.ts",
"build": "npx tsc",
"dist": "npx tsc"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^16.4.7",
"express": "^4.21.2",
"flatted": "^3.3.2",
"globals": "^15.14.0",
"lib0": "^0.2.99",
"lodash": "^4.17.21",
"log4js": "^6.9.1",
"meilisearch": "^0.35.1",
"prom-client": "^14.2.0",
"socket.io": "^4.8.1",
"socket.io-client": "^4.8.1",
"ws": "^8.18.0",
"y-leveldb": "^0.1.2",
"y-protocols": "^1.0.6",
"y-websocket": "^1.5.0",
"yjs": "^13.6.23"
},
"devDependencies": {
"@types/express": "^5.0.0",
"@types/lodash": "^4.17.15",
"@types/node": "^22.12.0",
"@types/ws": "^8.5.14",
"@typescript-eslint/eslint-plugin": "^8.22.0",
"@typescript-eslint/parser": "^8.22.0",
"eslint": "^9.19.0",
"typescript": "^5.7.3",
"vite": "^6.0.11",
"vite-node": "^3.0.4",
"vitest": "^3.0.4"
}
}
这是导入样式:
import { setupWSConnection } from "./websocket/config/setup";
这是 dist 文件结构:
├── dist
│ ├── websocket
| |__ config
| |_ setup.js
│ └── app.js
├── package-lock.json
├── package.json
├── src
│ ├── websoccket
| |_ config
| |_ setup.ts
│ └── app.ts
└── tsconfig.json
也许尝试一下
您在 tsconfig.json 中使用
"moduleResolution": "bundler"
,这意味着 TypeScript 在导入模块时不需要文件扩展名。但是,在 ES 模块(
"type": "module"
在 package.json 中)中运行已编译的 JavaScript 文件时,Node.js 确实需要正确的文件扩展名。您的进口声明:
编译为:
但是在 dist/ 文件夹中,文件名为 setup.js,并且 Node.js 期望:
由于缺少扩展,Node.js 抛出错误:
解决方案:
修改 tsconfig.json 文件
这会强制 TypeScript 像 Node.js 一样运行,并在输出中要求显式使用 .js 扩展名。