我已经建立了一个示例项目来演示这个问题:
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仓库共享,因为我觉得这会减慢开发速度。
我哪里做错了?
2条答案
按热度按时间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 i
、npm run build
和npm start
。现在,Express将运行,因为Node正在使用javascript文件而不是typescript文件。
y53ybaqx2#
根据@mtbno的回答,没有
"outDir"
的标准行为是所有的js和map文件将只在每个TypeScript文件旁边创建,这是超级恶心的。不需要使用额外的npm包或webpack或其他任何东西,您可以通过在tsconfig中添加
"outDir"
,然后对package.json进行一些调整来解决这个问题。为了便于讨论,假设根TypeScript文件名为
app.ts
,outDir文件夹为lib
。package.json中的相关部分可以如下所示:
以及
下面是一个tsconfig.json示例
更新完这两个文件后,运行
npm run start
应该会用编译好的JavaScript构建出lib文件夹,服务器应该会成功启动。注意,如果你之前做过构建,并且TypeScript文件旁边有“旧的”.js和.map文件,你可能需要手动删除它们,因为npm run clean
不会为你做这件事。