带有参考的TypeScript项目

时间:2019-03-12 06:55:43

标签: typescript project-structure

我使用project references从“前”和“后”项目中引用“共享”项目。

tsc -v: Version 3.3.3

项目结构:

./{MY_PROJECT}.code-workspace   /* the only file in this level */
./back
./back/tsconfig.json
./shared/src/
./shared/
./shared/tsconfig.json
./shared/src/
./front
./front/tsconfig.json
./front/src

我正打算从共享项目中将模块导入./front/src/article-view-model.ts

import Article from "@shared/src/article";            // alias path
import Article from "../../shared/src/article"; // full relative path
export default class ArticleViewModel {
}

VS Code GUI中立即显示以下错误:

对于别名路径:

  

找不到模块'@ shared / src / article'。 ts(2307)

有关完整的相对路径:

  

尚未从源文件“ c:/ {SOMEWHERE_IN_MY_PC} /shared/src/article.ts”构建输出文件“ ../../shared/src/article”。 ts(6305)

Intellisense(VS代码)确实适用于别名和相对选项:

Intellisense

如果我尝试忽略错误并构建,它将失败:

  

C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:1296               抛出e;               ^

     

错误:调试失败。错误的表达。       在mergeSymbol(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25861:26)       在C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25960:47       在Map.forEach()       在mergeSymbolTable(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25958:20)       在initializeTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:48653:21)       在Object.createTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:25711:9)       在getDiagnosticsProducingTypeChecker(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:71398:93)       在Object.getGlobalDiagnostics(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:71755:72)       在Object.getGlobalDiagnostics(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:73528:86)       在buildSingleProject(C:\ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js:75803:127)

./ front / tsconfig.json内容:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "baseUrl": ".",
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/front-bundle.js",
        "paths": {"@shared/*" : ["../shared/*"]},
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ],
    "references": [
        {
            "path": "../shared"
        }
    ]
}

./ shared / tsconfig.json内容:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/shared-bundle.js",
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}

5 个答案:

答案 0 :(得分:2)

我来到这里试图解决“不是从源文件构建的”错误。原来tsc监视进程未正确退出,因此我有两个实例在争夺文件。万一其他人遇到同样的问题?

答案 1 :(得分:1)

如果在包含tsconfig.jsonfront和{{1}的目录中有错误的back,我可以重现您得到的错误}}。在这种情况下,运行shared将在当前目录中拾取错误的tsc -b,并且由于它没有配置正确的tsconfig.json或其他任何内容,因此编译失败并出现与您相同的错误

否则,如果我使用您的文件并发出paths而不是tsc -b front,则它将编译而没有错误。

VSCode不会遇到麻烦的原因是,为了提供完成功能,TypeScript编辑器(通常)使用TypeScript提供的名为tsc -b的工具。当编辑者提供tsserver的文件路径时,tsserver通过在包含源文件的目录中查找,然后在父目录中查找,以得到相关的tsserver,依此类推。 ,直到找到tsconfig.json文件。因此,当VSCode在tsconfig.json上运行并要求front/src/foo.ts提供补全时,tsserver在没有匹配文件的tsserver中查找,然后在front/src中查找front

答案 2 :(得分:0)

这完全不能直接回答您的问题,但是我觉得提供替代方法可能仍然有用。

以“更标准”的方式解决此问题的一种方法是使您的3个代码库全部为NPM软件包。

这样,您的导入将类似于@vendor/shared/foo,而不是../../../../shared/src/article

使用npm link可以很容易地进行项目的交叉依赖。

从技术上讲,您甚至不需要修改源代码结构(尽管您可能想要)。 shared依赖项仅通过node_modules进行软链接。

答案 3 :(得分:0)

如果要从根文件夹进行编译,请尝试添加具有所有tsconfig.json设置即references的本地references: { path: './shared' }文件。否则,tsc将找不到要构建的相关项目。

此外,没有根tsconfig.json将会允许VSCode GUI在寻找根tsconfig.json时正常工作(这是我上次检查它的状态,在这里您可以找到related issue)。

该错误似乎与文件丢失有关。如果您可以提供有关构建步骤的更多详细信息,我可以尝试对其进行更好地检查

答案 4 :(得分:0)

在我上一次活动之后,我几乎没有解决它,但是由于以下更改,我不确定100%是否发生了。无论如何,我还是在这里发布它,因为仍然有新的观点和投票,因此对其他人来说可能很有价值:

那是变化:

./ shared / tsconfig.json内容中:代替:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/shared-bundle.js", <-------------
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}

使用:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "outDir": "./lib/", <-------------
        "preserveConstEnums": true,
        "removeComments": true,
        "rootDir": "./src", <-------------
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}