Как использовать пути в tsconfig.json?

Я читал об сопоставлении путей в tsconfig.json, и я хотел использовать его, чтобы избежать использования следующих уродливых путей:

введите описание изображения здесь

Организация проекта немного странная, потому что у нас есть монорепозиторий, содержащий проекты и библиотеки. Проекты сгруппированы по компаниям и браузерам / серверам / универсальным.

введите описание изображения здесь

Как я могу настроить пути в tsconfig.json вместо:

import { Something } from "../../../../../lib/src/[browser/server/universal]/...";

Я могу использовать:

import { Something } from "lib/src/[browser/server/universal]/...";

Потребуется ли что-то еще в конфиге webpack? или достаточно tsconfig.json?


person Remo H. Jansen    schedule 07.04.2017    source источник
comment
Взгляните на npmjs.com/package/tspath   -  person Patrik Forsberg    schedule 14.09.2018


Ответы (13)


Это можно настроить в файле 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/*"]
        },
        ...

Имейте в виду, что путь, на который вы хотите сослаться, принимает ваш baseUrl в качестве основы маршрута, на который вы указываете, и это обязательно, как описано в документе.

Символ "@" не является обязательным.

После того, как вы настроите его таким образом, вы можете легко использовать его следующим образом:

import { Yo } from '@config/index';

единственное, что вы могли заметить, это то, что intellisense не работает в текущей последней версии, поэтому я бы посоветовал следовать соглашению об индексах для импорта / экспорта файлов.

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

person Alejandro Lora    schedule 10.04.2017
comment
Просто комментарий, который может помочь другим ... если вы работаете с node.js или какой-либо средой, которая не использует сборщик модулей, например webpack, вам дополнительно понадобится модуль npmjs.com/package/module-alias - person Remo H. Jansen; 05.01.2018
comment
@Alejandro Lora Я использовал это решение в своем проекте, оно работает как шарм, но когда я запускаю тестовую карму, она не может разрешить переменные среды. Что может быть причиной? - person Gavishiddappa Gadagi; 25.04.2018
comment
Вы можете привести пример этого? не может воспроизвести его локально @GavishiddappaGadagi - person Alejandro Lora; 03.05.2018
comment
Это работает совершенно нормально, но возникает проблема при включении объявления и импорте этого модуля npm в другой модуль. Интелисенс ломается. Есть идеи, как решить эту проблему? - person Siva; 18.05.2018
comment
@siva - я тоже. Вы получили ответ на этот вопрос? - person cubabit; 11.06.2018
comment
@cubabit не совсем так. Мы перешли к относительным путям вместо псевдонимов. Но я нашел несколько плагинов ts, которые это делают: github.com/ zerkalica / zerollup / tree / master / packages / - person Siva; 12.06.2018
comment
Я использую Sublime text 3, и он отлично работает для меня, но он нарушает автоматические предложения, как это исправить? - person SjVnyk; 21.06.2018
comment
вы, вероятно, можете спросить это у возвышенной команды, редактор vscode совместим и хорошо работает @SjVnyk - person Alejandro Lora; 21.06.2018
comment
@AlejandroLora Знаете ли вы, можно ли сопоставить путь к прямому файлу, который будет экспортировать весь api? Не могу заставить эту работу - person Aphax; 30.11.2018
comment
Я не могу заставить это работать. У меня есть файл tsconfig.json, а внутри моего src есть файл tsconfig.app.json. Я пробовал добавлять эти значения как с *, так и без косой черты. Я просто использую angular-cli. Есть ли что-то особенное, что нужно сделать, например, для webpack? Спасибо! - person emery.noel; 01.12.2018
comment
@Aphax да. можно сопоставить с одним файлом, я подготовил пример здесь: - person Alejandro Lora; 03.12.2018
comment
@ emery.noel Вам нужно добавить только один раз, добавить в глобальный tsconfig.json - person Alejandro Lora; 03.12.2018
comment
это вызывает проблемы, если вы используете Jest BTW, поскольку пути неразрешимы. есть способ использовать псевдонимы с шуткой. Но тогда, если вы тоже используете node, становится неприятно иметь определения псевдонимов в 4 разных местах. - person Andy; 02.12.2019
comment
что, если модуль, указанный в paths, имеет свои собственные модули package.json и node_modules? во время компиляции node_modules не входят в папку dist - person inside; 21.11.2020
comment
Этот ответ был бы намного лучше, если бы у него было предупреждение о том, что это не будет работать из коробки на nodejs. Без такого предупреждения пользователь nodejs неизбежно столкнется с печально известной проблемой, с которой TypeScript успешно справится. обрабатывать псевдонимы пути во время компиляции, но поскольку он не переписывает пути импорта, nodejs не сможет импортировать во время выполнения. - person bluenote10; 19.03.2021
comment
Какого черта ни у кого нет ответов на ионный. Думаю, никто им не пользуется. Но я пробовал около миллиарда подобных решений, и они не работают. Я использую ionic 6. все слишком устарело - person numerical25; 25.03.2021
comment
чтобы пути работали с nodejs, вам необходимо предварительно загрузить tsconfig-paths/register и ts-node/register/transpile-only. - person hanan hamza; 02.04.2021
comment
У меня действительно странная проблема. В моем компиляторе он отлично работает со всеми включениями, но как только я пытаюсь создать экземпляр класса, он не может найти событие модуля, хотя в коде vs он находит его и т. Д. Есть идеи? stackoverflow .com / questions / 67281799 /. - person TheMan68; 27.04.2021

Вы можете использовать комбинацию baseUrl и paths docs.

Предполагая, что корень находится в самом верхнем src каталоге (и я правильно прочитал ваше изображение), используйте

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

Для webpack вам также может потребоваться добавить разрешение модуля. Для webpack2 это может выглядеть как

// webpack.config.js
module.exports = {
    resolve: {
        ...
        modules: [
            ...
            './src/org/global'
        ]
    }
}
person mleko    schedule 08.04.2017
comment
Просто заметив @mleko, @ alejandro-lora использовал baseUrl, вы говорите rootDir ... - какая разница? - person Frank Nocke; 11.01.2021

Отметьте эти похожие решения звездочкой

  "baseUrl": ".",
  "paths": {
    "*": [
      "node_modules/*",
      "src/types/*"
    ]
  },
person AgBorkowski    schedule 22.02.2018
comment
Я вижу что ты тут делал. - person Soorena; 10.10.2020

Ответ Алехандроса сработал для меня, но поскольку я использую awesome-typescript-loader с webpack 4, мне также пришлось добавить _ 2_ в мой файл webpack.config, чтобы он разрешился правильно

person James Moran    schedule 25.06.2018

Если вы используете пути, вам нужно будет изменить абсолютные пути обратно на относительные пути, чтобы он работал после компиляции машинописного текста в простой javascript с использованием tsc.

Самым популярным решением для этого пока были tsconfig-paths.

Я пробовал, но у меня не получилось из-за моей сложной настройки. Кроме того, он разрешает пути во время выполнения, что означает накладные расходы с точки зрения размера вашего пакета и производительности разрешения.

Итак, я сам написал решение, tscpaths.

Я бы сказал, что в целом это лучше, потому что он заменяет пути во время компиляции. Это означает, что нет никаких зависимостей во время выполнения или каких-либо накладных расходов на производительность. Пользоваться им довольно просто. Вам просто нужно добавить строку в свои сценарии сборки в package.json.

Проект довольно молодой, поэтому могут возникнуть некоторые проблемы, если ваша настройка очень сложна. Он работает безупречно для моей установки, хотя моя установка довольно сложна.

person Joon    schedule 08.10.2018

Это работает для меня:

 yarn add --dev tsconfig-paths

 ts-node -r tsconfig-paths/register <your-index-file>.ts

Это загружает все пути в tsconfig.json. Пример tsconfig.json:

{
    "compilerOptions": {
        {…}
        "baseUrl": "./src",
        "paths": {
            "assets/*": [ "assets/*" ],
            "styles/*": [ "styles/*" ]
        }
    },
}

Убедитесь, что у вас есть как baseUrl, так и пути, чтобы это работало

А затем вы можете импортировать, например:

import {AlarmIcon} from 'assets/icons'
person FacePalm    schedule 16.05.2019

Его относительный путь вместо приведенного ниже кода

import { Something } from "../../../../../lib/src/[browser/server/universal]/...";

Мы можем избежать того, чтобы "../../../../../" он выглядел странно и нечитабельно.

Таким образом, конфигурационный файл Typescript имеет ответ на то же самое. Просто укажите baseUrl, конфигурация позаботится о вашем относительном пути.

способ настройки: файл tsconfig.json добавьте указанные ниже свойства.

"baseUrl": "src",
    "paths": {
      "@app/*": [ "app/*" ],
      "@env/*": [ "environments/*" ]
    }

Итак, наконец, это будет выглядеть так, как показано ниже

import { Something } from "@app/src/[browser/server/universal]/...";

Выглядит просто, круто и более читабельно.

person Vijay    schedule 19.03.2019
comment
он щелкнул после (беглого) прочтения этого - person danday74; 20.07.2021

если используется 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 } */)
    ]
}

Расширенное разрешение пути в TypeScript 2.0

person eeglbalazs    schedule 27.07.2017

Решение на 2021 год.

Примечание: CRA. Изначально идея использования сторонней библиотеки или извлечения приложения для псевдонима казалась мне безумной. Однако после 8 часов поиска (и опробования варианта с извлечением) выяснилось, что этот вариант наименее болезненный.

Шаг 1.

yarn add --dev react-app-rewired react-app-rewire-alias

Шаг 2. Создайте файл config-overrides.js в корне вашего проекта и заполните его:

const {alias} = require('react-app-rewire-alias')

module.exports = function override(config) {
  return alias({
    assets: './src/assets',
    '@components': './src/components',
  })(config)
}

Шаг 3. Исправьте файл package.json:

  "scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test",
    "eject": "react-scripts eject"
}

Если @declarations не работают, добавьте их в файл d.ts. Например: '@constants': './src/constants', = ›добавить в response-app-env.d.ts declare module '@constants';

Это все. Теперь вы можете продолжать использовать команды yarn или npm start / build / test как обычно.

Полная версия в документации.

Примечание. Часть «Использование с конфигурацией ts / js» в документации не сработала для меня. Импорт с псевдонимом ошибки не поддерживается, когда сборка проекта осталась. Поэтому я использовал более простой способ. К счастью, это работает.

person MadaShindeInai    schedule 11.01.2021
comment
react-app-rewired пакет поддерживается незначительно, поэтому вам не следует продолжать с этим пакетом вы должны использовать вместо этого craco - person Hasan Tezcan; 16.06.2021

Похоже, что было обновление для React, которое не позволяет вам устанавливать "paths" в tsconfig.json больше.

Nicely React просто выводит предупреждение:

The following changes are being made to your tsconfig.json file:
  - compilerOptions.paths must not be set (aliased imports are not supported)

затем обновляет ваш tsconfig.json и удаляет весь раздел "paths". Есть способ обойти эту пробежку

npm run eject

Это приведет к удалению всех create-react-scripts настроек путем добавления каталогов config и scripts и файлов сборки / конфигурации в ваш проект. Это также дает гораздо больше контроля над тем, как все построено, названо и т. Д., Путем обновления {project}/config/* файлов.

Затем обновите свой tsconfig.json

{
    "compilerOptions": {
        "baseUrl": "./src",
        {…}
        "paths": {
            "assets/*": [ "assets/*" ],
            "styles/*": [ "styles/*" ]
        }
    },
}
person Andy Braham    schedule 07.05.2019

Проверьте работу компилятора с помощью this

Я добавил baseUrl в файл для проекта, как показано ниже:

"baseUrl": "src"

Работает нормально. Итак, добавьте свой базовый каталог для своего проекта.

person divya_kanak    schedule 28.01.2020

/ начинается только с корня, чтобы получить относительный путь, мы должны использовать ./ или ../

person Vipindas Gopalan    schedule 31.10.2018
comment
Не правда. Многие параметры позволяют импортировать не относительный модуль. - person Nino Filiu; 16.11.2018

Если вы используете tsconfig-paths и это не работает для вас, попробуйте следующий tsconfig.json :

{
  // ...
  "compilerOptions": {
    "outDir": "dist",
    "rootDir": "src",
    "baseUrl": ".",
    "paths": {
      "@some-folder/*": ["./src/app/some-folder/*", "./dist/app/some-folder/*"],
      // ...
    }
  },
  // ...
}

Если компилятор видит @some-folder/some-class, он пытается найти в ./src... или в ./dist....

person ktretyak    schedule 06.06.2021