Je considère un module par composant la meilleure façon de concevoir vos applications Angular.
S'il dépend d'autres composants, vous pouvez n'inclure que l'élément modules de composants lié à chaque composant qui est un dépendance directe et n'ont pas besoin de se préoccuper des dépendances indirectes.
Cela peut sembler plus laborieux au début, mais vous serez récompensé par une réduction des problèmes d'entretien.
Si ComponentA
dépend de ComponentB
qui dépend de ComponentC
créer un :
ModuleC
en rapport avec ComponentC
ModuleB
en rapport avec ComponentB
qui importe ModuleC
ModuleA
en rapport avec ComponentA
qui importe ModuleB
(il n'est pas nécessaire d'importer directement ModuleC
)
Si ComponentB
dépend désormais de ComponentD
(comme l'inclusion de <my-component-d>
dans le modèle) et cesse de dépendre de ComponentC
vous changez simplement ModuleB
et tous les composants qui dépendent de ComponentB
fonctionnera parfaitement si vous utilisez cette approche.
Pensez maintenant à des centaines de composants. Le nombre de composants dépendra ComponentB
?
Je considère que ce problème est similaire à l'ancienne façon (ou pas trop ancienne) d'inclure des fichiers js dans les balises script :
<script src="build/a.js"></script>
<script src="build/b.js"></script>
<script src="build/c.js"></script>
Et si vous changez b
de ne plus dépendre de c
et démarre en fonction de d
toutes les pages qui importent b
doivent maintenant importer d
et ainsi de suite, ce qui conduit à un cauchemar en matière de maintenance. Vous pouvez également oublier de supprimer (le désormais inutile) c.js
et l'importe inutilement dans certaines pages, augmentant ainsi le temps de démarrage ( ou pire vous le supprimez de tous les fichiers qui importent des b.js
mais certaines importations de pages e.js
qui dépend de c.js
et vous interrompez certaines fonctionnalités de cette page).
Je considère au contraire qu'il est préférable d'importer :
<script src="build/bundle.js"></script>
ou
<script src="build/vendor.js"></script>
<script src="build/main.js"></script>
et les dépendances sont gérées par un module bundler, comme webpack
.
Il existe une approche qui consiste à créer un module avec de nombreux composants et à l'importer, mais vous finissez par importer plusieurs composants. que vous n'utilisez pas et si vous utilisez le chargement paresseux, vos modules peuvent devenir énormes à moins que vous n'importiez ce module dans AppModule, ce qui rendrait votre augmentation du temps de démarrage .
Vous pouvez toujours utiliser l'approche d'un composant par module avec des modules de fonctionnalités . Il suffit d'importer le module de composants dans le module de fonctionnalité (au lieu du composant lui-même) :
feature.module.ts :
imports: [
ComponentAModule,
ComponentBModule,
ComponentCModule,
]
(Vous pouvez également les exporter).
Je considère également que cette approche est la meilleure pour la création de bibliothèques. forcer les consommateurs de la bibliothèque pour importer tous les composants même s'ils n'utilisent qu'un ou deux éléments de la bibliothèque.
Je rencontre ce problème avec ionic3
: la version minifiée ionic-angular
La bibliothèque a 437KB
dont 292KB
sont les composants (il est à espérer que cela changera avec ionic4
). Je n'en utilise que quelques-uns ionic
il n'était pas nécessaire de les importer tous, mais je n'ai pas le choix (à moins que je ne fork le repo ou que je ne l'utilise plus).
J'ai une application avec 176 composants et c'était la meilleure approche à mon avis. Auparavant, j'incluais plusieurs composants dans un module de fonctionnalité et cela m'a causé quelques maux de tête par la suite. De plus, il était plus difficile de changer un composant d'un module de fonctionnalité à un autre ( Qu'en est-il de ses dépendances ? Elles ont toutes été mélangées ).
Je n'ai pas trouvé d'approche satisfaisante avec les services ( @Injectable()
).
En fin de compte, c'est à vous de décider. Ceci est mon opinion basée sur mon expérience.
2 votes
Merci pour vos réflexions. Cette approche a permis de réduire considérablement le temps d'exécution de nos tests. Nous sommes passés de 2 minutes 30 secondes pour 700 tests à 5 secondes. Beaucoup moins de travail pour les développeurs ;-) Hmmm... je ne sais pas trop pourquoi ma question a été rétrogradée. Peut-être est-ce un signe que d'autres pensent que c'est une mauvaise idée.
3 votes
Je pense en fait que c'est la meilleure façon de procéder, un seul module inclut les composants parent et enfant, rappelez-vous quand angular était en version bêta, nous ne pouvions pas faire cela... et nous avions un seul module pour les applications énormes, c'était
0 votes
@AngularInDepth.com : Si vous développez une bibliothèque, avoir un module par composant est souvent la meilleure solution. Pourriez-vous expliquer un peu plus en détail pourquoi ?
6 votes
@Bob, un consommateur de votre bibliothèque peut choisir de n'utiliser qu'un seul composant de votre bibliothèque et il serait donc pratique d'importer ce module de composant plutôt que le module lib entier avec de multiples composants.
0 votes
A partir de la Guide de style Angular : "Créer un NgModule pour toutes les caractéristiques distinctes d'une application"
1 votes
@MaxWizardK J'ai eu l'idée en utilisant une bibliothèque ;-) J'ai fini par le faire dans mon application et j'en ai vu les avantages. La seule chose qui me préoccupait était l'impact sur les performances d'un grand nombre de modules. J'ai entendu dire que le concept de modules disparaît lorsque l'application est compilée. Êtes-vous en mesure de le confirmer, étant donné votre connaissance d'AngularInDepth(TM) ;-)
2 votes
@MarkWhitfeld, oui, ils sont tous compilés et fusionnés. vous pouvez regarder mon intervention à la ngconf ou lire mon article sur les modules. posez vos questions si vous en avez :)