Como usar caminhos no tsconfig.json?

167

Eu estava lendo sobre caminho-de mapeamento em tsconfig.jsone eu queria usá-lo para evitar o uso dos seguintes caminhos feias:

insira a descrição da imagem aqui

A organização do projeto é um pouco estranha, porque temos um repositório mono que contém projetos e bibliotecas. Os projetos são agrupados por empresa e por navegador / servidor / universal.

insira a descrição da imagem aqui

Como posso configurar os caminhos tsconfig.jsonpara que, em vez de:

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

Eu posso usar:

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

Será necessário algo mais na configuração do webpack? ou é o tsconfig.jsonsuficiente?

Remo H. Jansen
fonte
1
Dê uma olhada em npmjs.com/package/tspath
Patrik Forsberg

Respostas:

268

Isso pode ser configurado no seu arquivo tsconfig.json, pois é um recurso do TS.

Você pode fazer assim:

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

Lembre-se de que o caminho ao qual você deseja se referir leva seu baseUrl como a base da rota para a qual está apontando e é obrigatório, conforme descrito no documento.

O caractere '@' não é obrigatório.

Depois de configurá-lo dessa maneira, você pode usá-lo facilmente assim:

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

a única coisa que você pode notar é que o intellisense não funciona na versão mais recente atual, portanto, sugiro seguir uma convenção de índice para importar / exportar arquivos.

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

Alejandro Lora
fonte
36
Apenas um comentário que possa ajudar outras pessoas ... se você estiver trabalhando com o node.js ou algum ambiente que não usa um bundler de módulo como o webpack, precisará do módulo npmjs.com/package/module-alias
Remo H. Jansen
2
@Alejandro Lora Eu usei essa solução no meu projeto, ela funciona como charme, mas quando executo o teste de karma não é capaz de resolver variáveis ​​de ambiente. Qual seria a razão?
você precisa saber é o seguinte
1
Isso funciona completamente bem, mas há um problema ao ativar a declaração e importar este módulo npm em outro módulo. Intelisense quebra. Alguma idéia de como corrigir esse problema?
Siva
1
@Aphax yes. é possível mapear para um único arquivo, preparei um exemplo aqui: github.com/ialex90/TypeScript-Node-Starter/commit/…
Alejandro Lora
2
note que o jest-test não usa o tsconfig-caminhos - você precisa definir um moduleNameMapper: tsjest # 414
TmTron
14

Você pode usar a combinação de baseUrle paths documentos .

Supondo que a raiz esteja no srcdiretório superior (e eu li sua imagem corretamente), use

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

Para webpackvocê também pode precisar adicionar a resolução do módulo . Para webpack2isso pode parecer

// webpack.config.js
module.exports = {
    resolve: {
        ...
        modules: [
            ...
            './src/org/global'
        ]
    }
}
mleko
fonte
12

Verifique estas soluções semelhantes com o asterisco

  "baseUrl": ".",
  "paths": {
    "*": [
      "node_modules/*",
      "src/types/*"
    ]
  },
AgBorkowski
fonte
7

A resposta de Alejandros funcionou para mim, mas como eu estou usando o awesome-typescript-loadercom o webpack 4, também tive que adicionar o tsconfig-paths-webpack-pluginarquivo webpack.config ao meu para resolver corretamente

James Moran
fonte
6

Se você estiver usando caminhos, precisará alterar os caminhos absolutos para caminhos relativos, para que funcione após compilar o texto datilografado em javascript simples tsc.

A solução mais popular para isso tem sido o tsconfig-caminhos até agora.

Eu tentei, mas não funcionou para mim na minha configuração complicada. Além disso, ele resolve caminhos em tempo de execução, o que significa sobrecarga em termos de tamanho do seu pacote e resolve o desempenho.

Então, eu mesmo escrevi uma solução, tscpaths .

Eu diria que é melhor no geral porque substitui os caminhos em tempo de compilação. Isso significa que não há dependência de tempo de execução ou sobrecarga de desempenho. É bem simples de usar. Você só precisa adicionar uma linha aos seus scripts de construção package.json.

O projeto é bem jovem, portanto, pode haver alguns problemas se sua configuração for muito complicada. Funciona perfeitamente para minha configuração, embora ela seja bastante complexa.

Joon
fonte
3

se estiver sendo usado o typescript + webpack 2 + at-loader, há uma etapa adicional (a solução da @ mleko estava trabalhando apenas parcialmente para mim):

// 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 } */)
    ]
}

Resolução avançada de caminho no TypeScript 2.0

eeglbalazs
fonte
2

Isso funciona para mim:

 yarn add --dev tsconfig-paths

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

Isso carrega todos os caminhos no tsconfig.json. Uma amostra tsconfig.json:

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

Verifique se você possui baseUrl e caminhos para que isso funcione

E então você pode importar como:

import {AlarmIcon} from 'assets/icons'
FacePalm
fonte
1

Seu tipo de caminho relativo Em vez do código abaixo

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

Podemos evitar que "../../../../../" pareça estranho e não seja legível também.

Portanto, o arquivo de configuração Typescript tem resposta para o mesmo. Basta especificar o baseUrl, o config cuidará do seu caminho relativo.

maneira de configurar: arquivo tsconfig.json adicione as propriedades abaixo.

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

Então, finalmente, parecerá abaixo

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

Parece simples, incrível e mais legível ..

Vijay
fonte
1

Faça o checkout da operação do compilador usando este

Eu adicionei baseUrl no arquivo para um projeto como abaixo:

"baseUrl": "src"

Está funcionando bem. Então adicione seu diretório base para o seu projeto.

divya_kanak
fonte
0

/começa apenas a partir da raiz, para obter o caminho relativo que devemos usar ./ou../

Vipindas Gopalan
fonte
Não é verdade. Muitas opções permitem importações de módulos não relativos .
Nino Filiu
0

Parece que houve uma atualização para o React que não permite que você defina o "paths"no mais tsconfig.jsonlongo.

Nicely React apenas emite um aviso:

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

atualiza tsconfig.jsone remove a "paths"seção inteira para você. Existe uma maneira de contornar essa corrida

npm run eject

Este será ejetado todas as create-react-scriptsconfigurações, adicionando confige scriptsdiretórios e arquivos build / configuração em seu projeto. Isso também permite muito mais controle sobre como tudo é construído, nomeado etc., atualizando os {project}/config/*arquivos.

Atualize seu tsconfig.json

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