MODULE_NOT_FOUND尝试在Node JS / TypeScript项目中的模块之间按目录共享代码

ws51t4hk  于 2023-01-04  发布在  Node.js
关注(0)|答案(2)|浏览(224)

我已经建立了一个示例项目来演示这个问题:
https://github.com/garethrbrown/node-share-code
在这个例子中有两个项目,example-api(一个迷你express项目)和example-shared(一个类库),都使用Node JS/TypeScript。我希望example-api能够使用example-shared中的类以避免代码重复。在遵循this示例之后,我在example-api中引用了package.json中的example-shared项目。

"dependencies": {
    "example-shared": "file:..\\example-shared",
    "express": "^4.17.1"
}

完成此操作并运行npm install后,VSCode中的intellisense会从示例共享项目中看到ApiClass并协助导入。

然后,我可以通过NPM运行构建命令tsc --build,运行成功。
我还可以看到在example-api node_modules目录中创建了sym链接。

但是,当我尝试使用example-api下的npm start脚本运行example-api项目时,我得到了如下错误:

Error: Cannot find module 'example-shared/apiClass'
  Require stack:

  ...

  code: 'MODULE_NOT_FOUND',
  requireStack: [
    ...
  ]

我试过从不同的位置运行命令,比如描述的here,但到目前为止没有运气。
我使用的是Node(14+)和NPM(7+)的当前稳定版本。
我不想通过NPM或git仓库共享,因为我觉得这会减慢开发速度。
我哪里做错了?

weylhg0b

weylhg0b1#

看起来这是一个讨论过的问题,看这篇文章Typescript: How to resolve absolute modules paths for node.js?
我没有进一步调查,但在example-shared文件夹中,您可以从您的example-shared/tsconfig.json中删除"outDir",然后运行npm run build。不幸的是,这将发出typescript文件旁边的javascript文件,而不是将它们放置在单独的目录中。
最后,在example-api中运行npm inpm run buildnpm start
现在,Express将运行,因为Node正在使用javascript文件而不是typescript文件。

y53ybaqx

y53ybaqx2#

根据@mtbno的回答,没有"outDir"的标准行为是所有的js和map文件将只在每个TypeScript文件旁边创建,这是超级恶心的。
不需要使用额外的npm包或webpack或其他任何东西,您可以通过在tsconfig中添加"outDir",然后对package.json进行一些调整来解决这个问题。
为了便于讨论,假设根TypeScript文件名为app.ts,outDir文件夹为lib
package.json中的相关部分可以如下所示:

"scripts": {
    "build": "tsc --build",
    "clean": "tsc --build --clean",
    "start": "npm run build && node ./lib/app"
  },

以及

"main": "./lib/app",

下面是一个tsconfig.json示例

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es6",
    "lib": ["es6"],
    "sourceMap": true,
    "outDir": "./lib",
  },
  "exclude": [
    "node_modules"
  ]
}

更新完这两个文件后,运行npm run start应该会用编译好的JavaScript构建出lib文件夹,服务器应该会成功启动。注意,如果你之前做过构建,并且TypeScript文件旁边有“旧的”.js和.map文件,你可能需要手动删除它们,因为npm run clean不会为你做这件事。

相关问题