385 votes

Comment utiliser les chemins dans tsconfig.json ?

Je lisais un article sur cartographie des chemins en tsconfig.json et je voulais l'utiliser pour éviter d'utiliser les vilains chemins suivants :

enter image description here

L'organisation des projets est un peu bizarre car nous avons un monodépôt qui contient les projets et les bibliothèques. Les projets sont regroupés par entreprise et par navigateur / serveur / universel.

enter image description here

Comment puis-je configurer les chemins dans tsconfig.json donc au lieu de :

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

Je peux utiliser :

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

Est-ce que quelque chose d'autre sera nécessaire dans la configuration de webpack ? ou est-ce que l'option tsconfig.json assez ?

1 votes

557voto

Alejandro Lora Points 1773

Ceci peut être configuré dans votre fichier tsconfig.json, car il s'agit d'une fonctionnalité TS.

Vous pouvez faire comme ça :

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

Gardez à l'esprit que le chemin auquel vous voulez vous référer, prend votre baseUrl comme base de la route que vous pointez et c'est obligatoire comme décrit dans la doc.

Le caractère "@" n'est pas obligatoire.

Après l'avoir configuré de cette façon, vous pouvez facilement l'utiliser comme ceci :

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

la seule chose que vous pourriez remarquer est que l'intellisense ne fonctionne pas dans la dernière version actuelle, je vous suggère donc de suivre une convention d'index pour l'importation/exportation de fichiers.

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

103 votes

Juste un commentaire qui pourrait aider d'autres personnes... si vous travaillez avec node.js ou un environnement qui n'utilise pas un module bundler comme webpack, vous aurez besoin en plus de l'option npmjs.com/package/module-alias module

3 votes

@Alejandro Lora J'ai utilisé cette solution dans mon projet, elle fonctionne comme un charme mais lorsque j'exécute le test ng, Karma n'est pas capable de résoudre les variables d'environnement. quelle pourrait être la raison ?

0 votes

Pouvez-vous fournir un exemple de ceci ? Je ne peux pas le reproduire localement @GavishiddappaGadagi

44voto

mleko Points 5893

Vous pouvez utiliser une combinaison de baseUrl y paths docs .

En supposant que Root est sur le plus haut niveau src dir(et j'ai bien lu votre image) utiliser

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

Pour webpack vous devrez peut-être aussi ajouter résolution du module . Pour webpack2 cela pourrait ressembler à

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

2 votes

Je remarque juste que @mleko, @alejandro-lora a utilisé baseUrl vous parlez rootDir ... - quelle est la différence ?

25voto

AgBorkowski Points 724

Consultez ces solutions similaires avec asterisk

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

8 votes

Je ne vois pas ce qu'il a fait ici. Qu'est-ce que ça fait ?

0 votes

@PaulRazvanBerg pour toutes les importations (*) essayez de les trouver sur node_modules y src/types

9voto

James Moran Points 397

La réponse d'Alejandros a fonctionné pour moi, mais comme j'utilise l'application awesome-typescript-loader avec webpack 4, j'ai également dû ajouter l'option tsconfig-paths-webpack-plugin à mon fichier webpack.config pour qu'il se résolve correctement.

5voto

eeglbalazs Points 370

Si l'on utilise typescript + webpack 2 + at-loader, il y a une étape supplémentaire (la solution de @mleko ne fonctionnait que partiellement pour moi) :

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

Résolution avancée des chemins dans TypeScript 2.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X