Angular2 - relatif à la racine des importations
J'ai un problème avec l'importation de angular2/tapuscrit. Je voudrais utiliser des importations avec certaines racines comme "app/composants/calendrier", plutôt seule façon que je suis en mesure d'utiliser quelque chose comme:
//app/views/order/order-view.ts
import {Calendar} from '../../components/calendar
où le Calendrier est défini comme:
//app/components/calendar.ts
export class Calendar {
}
et cela devient évidemment beaucoup pire le plus bas dans la hiérarchie, vous allez, le plus profond est ".. /.. /.. " mais c'est toujours très mauvais et cassants. Est-il de toute façon comment utiliser des chemins relatifs à la racine du projet?
Je travaille dans Visual Studio, et relative des importations semble être la seule chose qui fait que VS en mesure de reconnaître ces importations.y
"baseUrl"
peut-être devrait définir"./src"
etpaths relate to it
irai que ça fonctionne, il l'origine"./"
, mais mon travail n'est pas, je ne sais pas pourquoi! puis ajouter"paths": { "@app/*": ["app/*"] }
àtsconfig.json
et de l'utiliser commeimport { PageNotFoundComponent } from '@app/error-page/page-not-found.component';
Vous devez vous connecter pour publier un commentaire.
Réponse courte
Définir la compilerOption
"moduleResolution"
à"classic"
.Réponse longue
Êtes-vous à l'aide de
tsconfig.json
? Je suppose que vous êtes. J'ai été à la recherche d'un moyen de faire des déclarations telles queimport someModule = require ("../../../../someModule"
enimport someModule=require("src/path/to/someModule")
.J'ai trouvé après des heures perdues que tsc peut utiliser différents algorithmes pour la résolution de module. Je suis l'aide de l'atome et il crée la
tsconfig.json
avec le compilerOption propriétémoduleResolution
ensemble de"node"
et il utilise la merde (excuse my french) module de l'algorithme de résolution de nœud. Je viens de mettre "classique" et a commencé à travailler le moyen le plus évident.** Mise à JOUR **
Il suffit de ne pas utiliser cette solution. Embrasser nœud module de l'algorithme de résolution.
La communauté repose sur elle, donc tout va briser si vous essayez de faire autrement. L'utilisation d'alias ou de certains autres fournis des solutions.
Réponse
De Tapuscrit 2.0, vous pouvez définir tsconfig.json propriétés
baseUrl
comme suit:Ensuite, vous pouvez utiliser votre manière souhaitée de l'importation de composants, comme:
Annexe
De secours des chemins de résolution
Une considération importante est que la spécification de
baseUrl
option causes Tapuscrit compilateur pour:moduleResolution
optionSystemJS
Depuis SystemJS est très utilisée dans Angulaire de la phase de développement, assurez-vous de config aussi
systemjs.config.js
, de sorte qu'il n'en résout correctement les chemins.Source et plus de détails: https://github.com/Microsoft/TypeScript/issues/5039
baseUrl
option racine du répertoire du projet qui le rend différent de ma suggestion, qui, j'en conviens, n'était pas le meilleur possible. Je vais mettre à jour ma réponse, heureux que vous avez trouvé la solution idéale.Un autre moyen serait d'avoir des fichiers qui la réexportation et de regrouper les fichiers avec un chemin plus court.
Vous pourriez avoir un des composants.ts dossier dans la racine de votre application avec.
Et de l'importer à partir de composants
Ce cependant est mieux adapté à l'exportation des modules afin que d'autres puissent les utiliser, de la façon de structurer un projet.
L'alternative serait de renoncer à l'utilisation de déclarations d'importation et de l'utilisation interne des modules à la place.
calendrier.ts
Et vous serez en mesure de simplement l'utiliser dans un de vos fichiers dans vos projets de ce type.
Ou l'importer avec un alias.
Tl;dr: vous devriez maintenant être en mesure d'utiliser
src
comme la racine et il "fonctionne".Angulaire de 2,0, lorsque vous exécutez
ng new my-proj
, il s'est auto-crée un fichiermy-proj/src/tsconfig.app.json
. Ce fichier contient unebaseUrl
ligne:Ainsi, vous ne devriez pas avoir à changer quoi que ce soit à propos de votre configuration et vous pouvez la portée de toutes vos importations ancrée sur
src
. En supposant que votre projet de la structure ressemble à quelque chose comme:vous pouvez importer vos fichiers avec:
Modifiées afin d'ajouter: Sublime ne pas lire
src/tsconfig.json
, cependant, il ne lit que le haut-niveau tsconfig.json (voir ce problème). Si vous avez de laCannot find module 'app/...'
erreurs sur votre importation de lignes dans le Sublime, vous pouvez ajouter:de votre haut niveau tsconfig.fichier json.
Pour l'essentiel, dans
Angular 6
vous pouvez commencer à laimport
de la haut ou bas.Mes deux options
Ils sont disponibles avec une configuration par défaut généré par
angular CLI
À partir du haut
Je préfère de cette façon, si c'est plus proche de la racine de l'application
import { DateService } from "src/app/shared-services/context/date.service";
À partir du bas
import { DateService } from "../../../../../../../shared-services/context/date.service";
Contexte:
Tapuscrit config: tsconfig.json
Angulaire de la pile
ng -v
Vous n'avez pas besoin de changer quoi que ce soit à partir de la configuration par défaut d'un nouveau Angulaire projet généré à partir Angulaires-CLI. Pas sûr que sur les versions précédentes, mais à partir de la version 6, je sais que c'est vrai. Pour faire un relatif à la racine de l'importation, vous utilisez
src/app/
au début de votre importations comme:Ce une meilleure solution que @MarekDulowski de réponse, parce relatifs à la racine les importations peuvent être facilement identifiable et facilement trouvé/cherché en interrogeant
src/app/
.J'ai appris cela d'ici la solution: https://stackoverflow.com/a/51582699/1253298