如何在tsconfig.json中使用路径?

Rem*_*sen 123 node-modules typescript tsconfig

我正在阅读有关路径映射的内容tsconfig.json,我想使用它来避免使用以下丑陋的路径:

在此输入图像描述

项目组织有点奇怪,因为我们有一个包含项目和库的单一存储库.项目按公司和浏览器/服务器/通用分组.

在此输入图像描述

如何配置路径tsconfig.json而不是:

import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
Run Code Online (Sandbox Code Playgroud)

我可以用:

import { Something } from "lib/src/[browser/server/universal]/...";
Run Code Online (Sandbox Code Playgroud)

webpack配置中还需要其他东西吗?还是tsconfig.json足够了?

Ale*_*ora 207

这可以在tsconfig.json文件上设置,因为它是TS功能.

你可以这样做:

"compilerOptions": {
        "baseUrl": "src", // This must be specified if "paths" is.
         ...
        "paths": {
            "@app/*": ["app/*"],
            "@config/*": ["app/_config/*"],
            "@environment/*": ["environments/*"],
            "@shared/*": ["app/_shared/*"],
            "@helpers/*": ["helpers/*"]
        },
        ...
Run Code Online (Sandbox Code Playgroud)

请记住您要引用的路径,它将您的baseUrl作为您指向的路由的基础,并且它是必需的,如文档中所述.

字符'@'不是强制性的.

以这种方式设置后,您可以轻松地使用它:

import { Yo } from '@config/index';
Run Code Online (Sandbox Code Playgroud)

您可能注意到的唯一事情是intellisense在当前的最新版本中不起作用,因此我建议遵循索引约定来导入/导出文件.

https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping

更新 看看我展示如何映射到单个文件的示例:

https://github.com/ialex90/TypeScript-Node-Starter/commit/a4e8cc1f8f8d5176e0099e05b51f97b0ef4bebea

  • 只是一个可能有助于其他人的评论......如果您正在使用node.js或某些不使用webpack等模块捆绑器的环境,您还需要https://www.npmjs.com/package/module-别名模块 (21认同)
  • 请注意,jest-test 不使用 tsconfig-paths - 您需要定义一个 `moduleNameMapper`:[tsjest#414](https://github.com/kulshekhar/ts-jest/issues/414) (3认同)
  • 为了使路径能够与 Node.js 一起使用,您需要预加载 `tsconfig-paths/register` 和 `ts-node/register/transpile-only`。 (3认同)
  • @Alejandro Lora我在我的项目中使用了这个解决方案,它的功能就像魅力一样但是当我运行测试时,业力无法解决环境变量.可能是什么原因? (2认同)
  • 我不能让它工作。我有一个 tsconfig.json 文件,然后在我的 src 里面我有一个 tsconfig.app.json 文件。我尝试将这些值添加到两者中,有和没有“*”和斜线。我只是在使用 angular-cli。有什么特别的事情需要做,比如 webpack?谢谢! (2认同)

cpr*_*ack 17

如果您正在寻找使用 引用根文件夹的最简约示例@,那么就是:

{
  "compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "@/*": ["*"]
    }
  }
}
// Example usage: import * as logUtils from '@/utils/logUtils';
Run Code Online (Sandbox Code Playgroud)

或者,如果您甚至没有src文件夹或想将其明确包含在导入中,这也可以:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["*"]
    }
  }
}
// Example usage: import * as logUtils from '@/src/utils/logUtils';
Run Code Online (Sandbox Code Playgroud)


ktr*_*yak 11

如果您正在使用tsconfig-paths并且这对您不起作用,请尝试tsconfig.json

{
  // ...
  "compilerOptions": {
    "outDir": "dist",
    "rootDir": "src",
    "baseUrl": ".",
    "paths": {
      "@some-folder/*": ["./src/app/some-folder/*", "./dist/app/some-folder/*"],
      // ...
    }
  },
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果编译器看到,它会尝试在或 中@some-folder/some-class找到它。./src..../dist...


mle*_*eko 10

您可以使用baseUrlpaths 文档的组合.

假设root位于最顶层的srcdir(我正确读取你的图像)使用

// tsconfig.json
{
  "compilerOptions": {
    ...
    "rootDir": ".",
    "paths": {
      "lib/*": [
        "src/org/global/lib/*"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

因为webpack您可能还需要添加模块分辨率.对于webpack2这可能看起来像

// webpack.config.js
module.exports = {
    resolve: {
        ...
        modules: [
            ...
            './src/org/global'
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是注意到@mleko,@alejandro-lora 使用了 `baseUrl`,你说的是 `rootDir` ... — 有什么区别? (2认同)

Fac*_*alm 9

这对我有用:

 yarn add --dev tsconfig-paths

 ts-node -r tsconfig-paths/register <your-index-file>.ts
Run Code Online (Sandbox Code Playgroud)

这会加载 tsconfig.json 中的所有路径。示例 tsconfig.json:

{
    "compilerOptions": {
        {…}
        "baseUrl": "./src",
        "paths": {
            "assets/*": [ "assets/*" ],
            "styles/*": [ "styles/*" ]
        }
    },
}
Run Code Online (Sandbox Code Playgroud)

确保你有 baseUrl 和路径才能工作

然后你可以像这样导入:

import {AlarmIcon} from 'assets/icons'
Run Code Online (Sandbox Code Playgroud)


小智 8

用星号检查这个类似的解决方案

  "baseUrl": ".",
  "paths": {
    "*": [
      "node_modules/*",
      "src/types/*"
    ]
  },
Run Code Online (Sandbox Code Playgroud)

  • 我没看到他在这里做了什么。这是做什么的? (8认同)

Joo*_*oon 8

如果您使用路径,则需要将绝对路径改回相对路径,以便在使用tsc.

到目前为止,最流行的解决方案是tsconfig-paths

我试过了,但它对我的复杂设置不起作用。此外,它在运行时解析路径,这意味着包大小和解析性能方面的开销。

所以,我自己写了一个解决方案,tscpaths

我会说它总体上更好,因为它在编译时替换了路径。这意味着没有运行时依赖性或任何性能开销。使用起来非常简单。你只需要在你的构建脚本中添加一行package.json

该项目还很年轻,因此如果您的设置非常复杂,可能会出现一些问题。它对我的设置完美无缺,尽管我的设置相当复杂。


小智 6

它的相对路径而不是下面的代码

import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
Run Code Online (Sandbox Code Playgroud)

我们可以避免 "../../../../../" 它看起来很奇怪而且不可读。

所以 Typescript 配置文件有相同的答案。只需指定 baseUrl,config 将处理您的相对路径。

配置方式: tsconfig.json 文件添加以下属性。

"baseUrl": "src",
    "paths": {
      "@app/*": [ "app/*" ],
      "@env/*": [ "environments/*" ]
    }
Run Code Online (Sandbox Code Playgroud)

所以最后它看起来像下面

import { Something } from "@app/src/[browser/server/universal]/...";
Run Code Online (Sandbox Code Playgroud)

它看起来简单,很棒,更易读..


小智 6

使用:

{
  "compilerOptions": {
    "baseUrl": "src"
  },
  "include": ["src"]
}
Run Code Online (Sandbox Code Playgroud)

我不确定我们是否必须定义路径。但是将baseUrl写入src后。我可以像这样导入src文件夹下的所有文件夹:

import { Home } from "pages";
import { formatDate } from "utils";
import { Navbar } from "components";
Run Code Online (Sandbox Code Playgroud)

更改tsconfig.json后不要忘记重新启动终端。


eeg*_*azs 5

如果正在使用 typescript + webpack 2 + at-loader,还有一个额外的步骤(@mleko 的解决方案只对我有用):

// tsconfig.json
{
  "compilerOptions": {
    ...
    "rootDir": ".",
    "paths": {
      "lib/*": [
        "src/org/global/lib/*"
      ]
    }
  }
}    

// webpack.config.js
const { TsConfigPathsPlugin } = require('awesome-typescript-loader');

resolve: {
    plugins: [
        new TsConfigPathsPlugin(/* { tsconfig, compiler } */)
    ]
}
Run Code Online (Sandbox Code Playgroud)

TypeScript 2.0 中的高级路径解析


Jam*_*ran 5

亚历杭awesome-typescript-loader德罗斯(Alejandros)的答案对我有用,但是当我在webpack 4中使用时,我还必须将其添加tsconfig-paths-webpack-plugin到我的webpack.config文件中才能正确解析。