我必须解决同样的问题,经过几天的绞尽脑汁并使用我在网上可以找到的任何东西,这是我认为可以正常工作的唯一解决方案。它相当脆弱,因为它需要非常仔细平衡的文件夹结构才能工作。
我将使用客户端-服务器通用范式进行讨论,client和server取决于common项目。让我们从最顶层的“解决方案”文件夹开始。
除了其他设置外,还需要tsconfig.json
(以确保 TSC 构建两个依赖项目):
"references": [
{
"path": "./client"
},
{
"path": "./server"
},
]
And a package.json
with(以确保运行的代码能够加载公共模块):
"imports": {
"#common/foobar": "./out/common/src/foobar.js"
},
这俩client和server包需要一个tsconfig
with -- 确保它们输出到一个公共的out
文件夹,以帮助 TS (IDE) 找到通用模块并在构建过程中依赖它:
"compilerOptions": {
"baseUrl": ".",
"rootDir": "../",
"outDir": "../out",
"paths": {
"#common/*": [
"../common/src/*.ts"
]
},
},
"references": [
{
"path": "../common"
}
],
这两个项目都可以使用并参考common在他们的源代码中为:
import { foobar } from '#common/foobar';
The common项目需要一个tsconfig
with (也可以输出到同一文件夹,并充当适当的TSC --build
依赖项目):
"compilerOptions": {
"baseUrl": ".",
"rootDir": "../",
"outDir": "../out",
"composite": true,
"declaration": true,
"declarationMap": true,
},
"references": []
最终的结果是一个共同点out
在项目最顶层的文件夹中,其中包含三个子项目的子文件夹。如果需要,您可以从那里继续打包。
我发现如果outDir
or rootDir
文件夹具有任何其他结构,即使来自官方文档,整个方案也会崩溃。要克服的最大障碍是我们需要源代码(IDE 中的编译器和分析工具)和最终的转译代码来解决common模块。虽然我们使用相同的#common/foobar
在这两种情况下,两者都有不同的底层机制:工具链使用tsconfig.json
当运行代码使用package.json
。虽然第一个允许我们查看项目文件夹根目录之外的内容(使用../
), 第二does not。这就是为什么我说你需要接受这一点out/*
结构保持原样,并修改您的打包或运行需求以适应此文件夹结构,而不是相反:out
三个子文件夹都可以工作,而三个子文件夹每个都有其out
将不会。
最后,不要忘记在构建模式下调用 TSC:
"scripts": {
"compile": "tsc -b",
外部依赖是根据具体情况而定,每个子项目都需要自己的依赖,最顶层的依赖package.json
还需要其中的相关包node_modules
.