找不到在 tsconfig `paths` 中定义的模块

Jam*_*rov 35 alias typescript tsc tsconfig ts-node

我正在尝试为我的模拟服务器设置别名。每当我尝试编译ts文件时,它都会返回找不到正确模块的错误,即使这些模块是在tsconfig,json->中定义的paths

文件夹结构:

??? server
?   ??? src
?       ???/json
??? src
?   ???/modules
??? tsconfig.json
Run Code Online (Sandbox Code Playgroud)

这是我的 tsconfig.json

{
    "compilerOptions": {
        "baseUrl": "./src",
        "experimentalDecorators": true,
        "jsx": "react",
        "lib": [
            "dom",
            "es2015",
            "es2015.promise"
        ],
        "module": "commonjs",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "noUnusedLocals": true,
        "esModuleInterop": true,
        "paths": {
            "@project/app/modules/*": [
                "modules/*"
            ],
            "@project/server/data/*": [
                "../server/src/json/*"
            ]
        },
        "sourceMap": true,
        "target": "es5"
    },
    "exclude": [
        "node_modules",
        "tools"
    ]
}
Run Code Online (Sandbox Code Playgroud)

错误: Error: Cannot find module '@project/server/data/accounts/accountsList'

Md *_*min 68

好吧,经过几个小时的痛苦,我得到了解决方案,我正在使用该ts-node包,并且遇到了同样的错误Error: Cannot find module '@modules/logger'

您需要ts-node在文件中添加配置tsconfig.json。您可以在ts-node获取更多信息

这是我的tsconfig.json文件看起来像

{
    "ts-node": {
        // Do not forget to `npm i -D tsconfig-paths`
        "require": ["tsconfig-paths/register"]
    },
    "compilerOptions": {
        "lib": ["es5", "es6", "es7"],
        "target": "es2017",
        "module": "commonjs",
        "moduleResolution": "node",
        "rootDir": "src",
        "outDir": "build",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "esModuleInterop": true,
        "noImplicitAny": true,
        "strict": true,
        "resolveJsonModule": true,
        "allowJs": true,
        "sourceMap": true,

        "baseUrl": ".",
        "paths": {
            "@modules/*": ["src/modules/*"],
            "*": ["node_modules/*"]
        },

    },
    "include": ["src/**/*"]
}

Run Code Online (Sandbox Code Playgroud)

这是我的package.json

"_moduleAliases": {
        "@modules": "build/modules",
        "@core": "build/core"
    }
Run Code Online (Sandbox Code Playgroud)

您需要将此包安装为模块别名的依赖项npm i module-alias

并且不要忘记 import 'module-alias/register'; 在应用程序的入口文件中添加作为模块别名依赖项。

  • 为此,您需要在条目文件“import 'module-alias/register';”中导入模块别名依赖项,如本文所述 https://dev.to/larswaechter/path-aliases-with- typescript-in-nodejs-4353。 (3认同)
  • 添加“tsconfig-paths”开发依赖项和“tsconfig-paths/register”允许路径“别名”在“ts_node”执行下工作。如果这就是所需要的,则不需要“模块别名”。 (2认同)

Jak*_*ler 17

我的问题是我的tsconfig.app.json扩展错误地tsconfig.json覆盖了该"baseUrl"选项。我将其从 中删除,tsconfig.app.json因此它没有"baseUrl""paths"。最后,我的tsconfig.json编译器选项如下:

"baseUrl": "src/",
"paths": {
    "@shared/*": ["shared/*"],
    "@client/*": ["client/*"],
    "@server/*": ["server/*"]
}
Run Code Online (Sandbox Code Playgroud)


小智 11

我遇到了同样的问题。我尝试了很多东西,现在我得到了一个适合我的解决方案。我的 angular 项目中有一个应用程序和一个库。我想在我的应用程序中使用库别名。

我有以下结构:

??? projects
?   ??? lib
?       ??? src
?           ??? lib
?               ??? lib-service.ts
?           ??? index.ts
?   ??? app
?       ???tsconfig.app.json
??? tsconfig.json
Run Code Online (Sandbox Code Playgroud)

在根文件夹中的tsconfig.json文件中,我定义了以下路径:

"paths": {
  "my-lib": [
    "projects/lib/src/index.ts"
  ]
}
Run Code Online (Sandbox Code Playgroud)

在那里我访问了一个index.ts文件,我在其中定义了我想要导出的内容。在我的情况下, index.ts 文件具有以下条目:

export * from './lib/lib-service';
Run Code Online (Sandbox Code Playgroud)

现在我可以在别名的帮助下访问应用程序组件中的LibService

import {LibService} from 'my-lib';
Run Code Online (Sandbox Code Playgroud)

值得一提的是,如果我将此条目添加到tsconfig.app.json文件中,则此解决方案不起作用。我认为 IDE(在我的例子中是 WebStorm)在靠近根文件夹的tsconfig.json文件中搜索别名。所以我延长tsconfig.json在我tsconfig.app.json

"extends": "../../tsconfig",
Run Code Online (Sandbox Code Playgroud)

也许您必须重新启动 IDE 才能删除导入行的红色下划线。

我希望这个解决方案对你有用。您必须进行更多的设置工作,因为您必须在 index.ts 文件中定义要导出的类。但是在使用库的情况下,这是有道理的,因为您不想让其他应用程序看到所有内容。

  • 我必须重新启动 VS Code 才能摆脱红色下划线! (4认同)
  • @TaylorA.Leach随机的事情,你通常可以通过在VS代码中重新启动TS服务器来摆脱红线。`cmd+shift+p` 输入`重新启动 TS Server` (3认同)

Ben*_*cot 8

TypeScriptpath属性可以可靠地解析基于类型的 URL,例如接口。

The intended behaviour is to allow TypeScript to resolve type information[ 1 ]

我们大多数人似乎都遇到过,指向实际依赖项的路径并不总是按照我们的预期进行编译。不管医生怎么说,这显然是设计使然:

{
  "compilerOptions": {
    "baseUrl": ".", // This must be specified if "paths" is.
    "paths": {
      "jquery": ["node_modules/jquery/dist/jquery"] // This mapping is relative to "baseUrl"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

阅读 Mitchell Simoens 撰写的这篇精彩分解文章 -为什么 TypeScript 路径让我失败

在整个应用程序中设置我的共享文件夹的@paths后发现了这一点。在编译 TS 路径期间,中断和实际构建缺少各种模块。就个人而言,TS 无法以这种方式可靠地解决依赖关系,这令人非常失望。


Mat*_*vic 6

太长了;

npm i -D module-alias

tsconfig.json并将路径_moduleAliases中的映射添加到package.json

"_moduleAliases": {
  "foo": "dist"
}
Run Code Online (Sandbox Code Playgroud)

至于其背后的原因,即使和已正确配置,但"jsx": "react"与 结合使用"module": "commonjs"会阻止您使用绝对导入。详细的讨论可以在这个问题中找到。baseUrlpaths


Avo*_*ion 5

以下tsconfig.json对我有用,允许import { foo } from '@models'相关的index.ts桶出口等:

{
    "baseUrl": "./",
    "paths": {
      "@environment": ["./src/environments/environment.ts"],
      "@models": ["./src/app/shared/models/index.ts"],
      "@services": ["./src/app/shared/services/index.ts"]
    },
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*ski 5

经过一段时间的斗争后,我发现您需要tsconfig-paths在 main 中包含所有使用的目录tsconfig.json。您的tsconfig.json文件的工作版本可能是

{
    "compilerOptions": {
        "baseUrl": ".",
...
        "paths": {
            "@project/app/modules/*": [
                "src/modules/*"
            ],
            "@project/server/data/*": [
                "server/src/json/*"
            ]
        },
    },

    "include": [
        "./src",
        "./server"
    ],
}
Run Code Online (Sandbox Code Playgroud)

  • 但这样即使没有路径,它也会包含 src 中的所有文件夹。在我的项目中,我在 src 中的文件夹与我包含的库具有相同的名称。它正在抱怨,因为它在导入时尝试读取本地文件夹,而不是包。 (2认同)