Как использовать пути в tsconfig.json?
Я читал о path-mapping в tsconfig.json
и я хотел использовать его, чтобы избежать использования следующих уродливых путей:
![enter image description here]()
Организация проекта немного странна, потому что у нас есть монорепозиторий, содержащий проекты и библиотеки. Проекты группируются компанией и браузером/сервером/универсальным.
![enter image description here]()
Как настроить пути в tsconfig.json
а не:
import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
Я могу использовать:
import { Something } from "lib/src/[browser/server/universal]/...";
Будет ли что-то еще необходимо в конфигурации webpack? или достаточно tsconfig.json
?
Ответы
Ответ 1
Это можно настроить в вашем файле 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
ОБНОВЛЕНИЕ Проверьте этот пример, который я сделал, чтобы продемонстрировать, как отображается в одном файле:
https://github.com/ialex90/TypeScript-Node-Starter/commit/a4e8cc1f8f8d5176e0099e05b51f97b0ef4bebea
Ответ 2
Вы можете использовать комбинацию baseUrl
и paths
Docs.
Предполагая, что root находится в самом верхнем каталоге src
(и я правильно прочитал ваше изображение), используйте
// tsconfig.json
{
"compilerOptions": {
...
"rootDir": ".",
"paths": {
"lib/*": [
"src/org/global/lib/*"
]
}
}
}
Для webpack
вам также может потребоваться добавить разрешение модуля. Для webpack2
это может выглядеть так:
// webpack.config.js
module.exports = {
resolve: {
...
modules: [
...
'./src/org/global'
]
}
}
Ответ 3
Проверьте это аналогичные решения звездочкой
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
Ответ 4
Ответ Alejandros работал для меня, но поскольку я использую awesome-typescript-loader
с webpack 4, мне также пришлось добавить tsconfig-paths-webpack-plugin
в свой файл webpack.config, чтобы он правильно разрешал
Ответ 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 } */)
]
}
Расширенное разрешение пути в typescript 2.0
Ответ 6
Если вы используете пути, вам нужно будет tsc
абсолютные пути к относительным путям, чтобы он работал после компиляции машинописных текстов в простой javascript с использованием tsc
.
Наиболее популярным решением для этого было tsconfig-пути до сих пор.
Я пробовал, но это не сработало для меня для моей сложной настройки. Кроме того, он разрешает пути во время выполнения, что означает накладные расходы с точки зрения размера вашего пакета и разрешения производительности.
Итак, я сам написал решение, tscpaths.
Я бы сказал, что это лучше всего, потому что он заменяет пути во время компиляции. Это означает, что нет зависимости от времени выполнения или каких-либо издержек производительности. Он довольно прост в использовании. Вам просто нужно добавить строку в свои скрипты сборки в package.json
.
Проект довольно молодой, поэтому могут возникнуть проблемы, если ваша настройка очень сложная. Он работает безупречно для моей установки, хотя моя настройка довольно сложная.
Ответ 7
/
начинается только с корня, чтобы получить относительный путь, который мы должны использовать ./
или ../
Ответ 8
Своего рода относительный путь вместо приведенного ниже кода
import { Something } from "../../../../../lib/src/[browser/server/universal]/...";
Мы можем избежать "../../../../../", это выглядит странно и не читаемым тоже.
Таким образом, в конфигурационном файле Typescript есть ответ на то же самое. Просто укажите baseUrl, config позаботится о вашем относительном пути.
Способ настройки: в файле tsconfig.json добавьте следующие свойства.
"baseUrl": "src",
"paths": {
"@app/*": [ "app/*" ],
"@env/*": [ "environments/*" ]
}
Итак, наконец, это будет выглядеть ниже
import { Something } from "@app/src/[browser/server/universal]/...";
Выглядит просто, потрясающе и более читабельно.
Ответ 9
Похоже, было обновление для React, которое не позволяет вам устанавливать "paths"
в tsconfig.json
в tsconfig.json
случае.
Приятно 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
и файлов build/config в ваш проект. Это также дает гораздо больший контроль над тем, как все построено, названо и т.д. Путем обновления файлов {project}/config/*
.
Затем обновите ваш tsconfig.json
{
"compilerOptions": {
"baseUrl": "./src",
{…}
"paths": {
"assets/*": [ "assets/*" ],
"styles/*": [ "styles/*" ]
}
},
}
Ответ 10
Это работает для меня:
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, и пути для этого
Ответ 11
Если я не ошибаюсь, ./
означает начать с текущего каталога файла, а /
означает начать с корня. Таким образом, вы можете заменить все ../
в начале на /