47

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

文件夹结构:

├── server
│   └── src
│       └──/json
├── src
│   └──/modules
├── tsconfig.json

这是我的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"
    ]
}

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

4

10 回答 10

14

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

我有以下结构:

├── projects
│   └── lib
│       └── src
│           └── lib
│               └── lib-service.ts
│           └── index.ts
│   └── app
│       └──tsconfig.app.json
├── tsconfig.json

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

"paths": {
  "my-lib": [
    "projects/lib/src/index.ts"
  ]
}

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

export * from './lib/lib-service';

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

import {LibService} from 'my-lib';

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

"extends": "../../tsconfig",

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

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

于 2019-10-16T08:05:27.293 回答
7

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

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

    "include": [
        "./src",
        "./server"
    ],
}
于 2021-03-23T13:08:56.703 回答
6

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

"baseUrl": "src/",
"paths": {
    "@shared/*": ["shared/*"],
    "@client/*": ["client/*"],
    "@server/*": ["server/*"]
}
于 2020-08-09T19:19:22.807 回答
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"]
    },
}
于 2020-03-28T05:36:01.540 回答
3

TLDR;

npm i -D module-alias

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

"_moduleAliases": {
  "foo": "dist"
}

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

于 2019-11-17T13:07:32.010 回答
2

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"
    }
  }
}

阅读 Mitchell Simoens 撰写的这篇精彩文章 -为什么 TypeScript Paths Failed Me

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

于 2021-10-10T11:57:48.657 回答
1

我把它放在webpack 解析别名和 tsconfig 路径中​​,它就是这样工作的:)

于 2020-11-26T17:14:07.497 回答
1

路径存在一些问题,例如,如果您将路径设置为根目录,让我们说:@root/src 并且在 src 中没有具有默认值的 index.ts,那么这可能会失败......

根据我的发现,这有点棘手。

于 2020-07-04T06:04:16.823 回答
0

检查angular.json文件,如果它的“build”->“options”配置将“tsConfig”选项设置为您更改的 tsconfig 文件。

"architect": {
  "build": {
    "builder": "@angular-devkit/build-angular:browser",
    "options": {
      "outputPath": "dist",
      "tsConfig": "src/tsconfig.app.json",
      "polyfills": "src/polyfills.ts",
      "stylePreprocessorOptions": {
        "includePaths": [
          "src/assets/styles"
        ]
      },
............

以上是我的 angular.json 文件,我将其配置为使用tsconfig.app.json。在这种情况下,应该在tsconfig.app.json文件中添加“路径”。

于 2020-05-28T10:35:38.187 回答
0

您可以像这样轻松定义简单的路径解析器:

loader.js

const Module = require("module");
const originalResolveFilename = Module._resolveFilename;
const tsConfig = require("./tsconfig.json");
const Path = require("path");
const fs = require('fs');
if (!tsConfig.compilerOptions || !tsConfig.compilerOptions.baseUrl)
    throw "Compiler options Base URL (compilerOptions.baseUrl) is required in tsconfig.json.";
const basePath = Path.resolve(tsConfig.compilerOptions.baseUrl, tsConfig.compilerOptions.outDir);

//Inspired by https://github.com/dividab/tsconfig-paths but that one does not work with VS Code
Module._resolveFilename = function (request) {
    if (tsConfig.compilerOptions && tsConfig.compilerOptions.paths[request] instanceof Array) { //Supports only without wildchars, but enough for our use
        const pathsTried = [];
        for (const reqPath of tsConfig.compilerOptions.paths[request]) {
            const modPath = Path.resolve(basePath, reqPath) + ".js";
            if (fs.existsSync(modPath)) return modPath;
            pathsTried.push(reqPath);
        }
        throw "Module " + request + " not found, paths tried: " + pathsTried.join(", ");
    }
    const ret = originalResolveFilename.apply(this, arguments);
    return ret;
};

而不是像这样从 VS Code 中引用它launch.json

"configurations": [
{
  "type": "node",
  "request": "launch",
  "name": "Node.js",
  "runtimeArgs": ["-r", "./loader.js"],
  "program": "${workspaceFolder}/run.ts",
  "preLaunchTask": "tsc: build - tsconfig.json",
  "outFiles": [
    "${workspaceFolder}/out/**/*.js"
  ]
}]
    

它不支持模式,paths但可以使用此存根添加它。

tsconfig.json应该是这样的:

"compilerOptions": {
    "outDir": "out", //required
    "moduleResolution": "node",
    "baseUrl": "./", //required
    "paths": {
        "InjectableStub": [ //requires 2
            "myapp/myfolder/mymodule", //used in runtime
            "./myfolder/mymodule //used in compile-time
        ]
    }
}

至少对我来说tsc,以根文件夹的名称创建子文件夹,out这就是 2 个注册的原因。

于 2021-02-13T20:30:41.287 回答