Dans une application angulaire, j'ai vu que @Component
avait la propriété moduleId
. Qu'est-ce que ça veut dire?
Et lorsque module.id
n'est défini nulle part, l'application fonctionne toujours. Comment cela peut-il encore fonctionner?
@Component({
moduleId: module.id,
selector: 'ng-app',
templateUrl: 'app.component.html',
styleUrls: ['app.component.css'],
directives: [AppComponent]
});
La version bêta de Angular (depuis la version 2-alpha.51) prend en charge les actifs relatifs des composants tels que templateUrl et styleUrls dans le décorateur @Component
.
module.id
fonctionne avec CommonJS. Vous n'avez pas besoin de vous soucier de la façon dont cela fonctionne.
Rappelez-vous: paramètre moduleId: module.id dans le décorateur @Component est la clé ici. Si vous ne l'avez pas, alors Angular 2 cherchera pour vos fichiers au niveau racine.
Source from Le message de Justin Schwartzenberger , merci à @Pradeep Jain
Mise à jour du 16 septembre 2016:
Si vous utilisez webpack pour le regroupement, vous n'avez pas besoin de
module.id
dans le décorateur. Gestion automatique des plugins Webpack (ajoutez-le)module.id
dans le dernier paquet
Mise à jour pour le (2017-03-13):
Toute mention de moduleId supprimée. Livre de recettes "Composants relatifs" supprimé
Nous avons ajouté un nouveau plug-in SystemJS (systemjs-angular-loader.js) à notre configuration SystemJS recommandée. Ce plugin convertit dynamiquement les chemins "relatifs aux composants" dans templateUrl et styleUrls en "chemins absolus" pour vous.
Nous vous encourageons fortement à n'écrire que les chemins relatifs aux composants. C’est la seule forme d’URL abordée dans ces documents. Vous n'avez plus besoin d'écrire
@Component({ moduleId: module.id })
et vous ne devriez pas le faire non plus.
Source: https://angular.io/docs/ts/latest/guide/change-log.html
Définition:
moduleId?: string
Le paramètre moduleId
à l'intérieur de l'annotation @Component
prend une valeur string
qui est;
"L'ID de module du module contenant le composant."
Utilisation CommonJS: module.id
,
Utilisation de SystemJS: __moduleName
moduleId
:moduleId
est utilisé pour résoudre les chemins relatifs pour vos feuilles de style et vos modèles comme indiqué dans la documentation.
L'ID de module du module contenant le composant. Nécessaire pour pouvoir résoudre les URL relatives des modèles et des styles. Dans Dart, cela peut être déterminé automatiquement et il n'est pas nécessaire de le définir. Dans CommonJS, cela peut toujours être défini sur module.id.
ref (old): https://angular.io/docs/js/latest/api/core/index/ComponentMetadata-class.html
nous pouvons spécifier les emplacements des fichiers de modèle et de style par rapport au fichier de classe du composant en définissant simplement la propriété moduleId des métadonnées @Component
ref: https://angular.io/docs/ts/latest/cookbook/component-relative-paths.html
Structure du dossier:
RootFolder
├── index.html
├── config.js
├── app
│ ├── components
│ │ ├── my.component.ts
│ │ ├── my.component.css
│ │ ├── my.component.html
Sans module.id:
@Component({
selector: 'my-component',
templateUrl: 'app/components/my.component.html', <- Starts from base path
styleUrls: ['app/components/my.component.css'] <- Starts from base path
})
Avec module.id:
tsconfig.json:
{
"compilerOptions": {
"module": "commonjs", <- need to change this if you want to use module.id property
...
@Component({
moduleId: module.id,
selector: 'my-component',
templateUrl: 'my.component.html', <- relative to the components current path
styleUrls: ['my.component.css'] <- relative to the components current path
})
Si vous obtenez TypeScript error
, ne modifiez que la variable declare
de votre fichier.
// app.component.ts
declare var module: {
id: string;
}
//
@Component({
moduleId: module.id, // now it works without annoying TypeScript
...
})
UPDATE - December 08, 2016
Le mot clé module
est disponible sur node
. Donc, si vous installez @types/node
, dans votre projet, le mot clé module
sera automatiquement disponible dans vos fichiers TypeScript sans qu'il soit nécessaire de le remplacer par declare
.
npm install -D @types/node
tsconfig.json
pour obtenir le outil}://tsconfig.json
{
...
"compilerOptions": {
"types" : ["node"]
}
...
}
// some-component.ts
// now, no need to declare module
@Component({
moduleId: module.id, // now it works without annoying TypeScript
...
})
Bonne chance
En plus des excellentes explications de echonax
et Nishchit Dhanani
, je souhaite ajouter que je déteste le nombre de composants avec module.id
. En particulier, si vous avez un support pour (Ahead-of-Time) AoT-compilation et si vous visez un projet réaliste, c’est ce que vous devriez viser, il n’ya pas de place pour quelque chose comme module.id
dans vos métadonnées de composant.
De la Docs :
Les applications compilées par JiT qui utilisent le chargeur
SystemJS
et les URL relatives aux composants doivent définir la propriété@Component.moduleId
surmodule.id
. L'objet module n'est pas défini lorsqu'une application compilée AoT s'exécute. L'application échoue avec une erreur de référence NULL sauf si vous affectez une valeur de module globale dans le fichier index.html comme ceci:
<script>window.module = 'aot';</script>
Je pense qu'avoir cette ligne dans la version de production du fichier index.html
n'est absolument pas acceptable!
Par conséquent, l’objectif est d’avoir une compilation JiT (Just-in-Time) pour le développement et un support AoT pour la production avec la définition de métadonnées de composant suivante: (sans la ligne moduleId: module.id
)
@Component({
selector: 'my-component',
templateUrl: 'my.component.html', <- relative to the components current path
styleUrls: ['my.component.css'] <- relative to the components current path
})
En même temps, j'aimerais placer des styles, tels que my.component.css
et des fichiers de modèle, tels que my.component.html
relatif dans les chemins de fichiers du composant my.component.ts
.
Pour y parvenir, la solution que j'utilise est d'héberger un serveur Web (serveur léger ou synchronisation de navigateur) pendant la phase de développement à partir de plusieurs sources de répertoires!
bs-config.json
:
{
"port": 8000,
"server": ["app", "."]
}
S'il vous plaît prendre une prise à cette réponse pour moi les détails.
L’exemple du projet Quick Start 2, qui repose sur cette approche, est hébergé ici .
Conformément à la documentation angulaire, vous ne devez pas utiliser @Component ({moduleId: module.id})
S'il vous plaît réf: https://angular.io/docs/ts/latest/guide/change-log.html
Voici le texte pertinent de cette page:
Toute mention de moduleId supprimée. Livre de recettes "Composant les chemins relatifs" supprimé (2017-03-13)
Nous avons ajouté un nouveau plug-in SystemJS (systemjs-angular-loader.js
) à notre configuration SystemJS recommandée. Ce plugin convertit dynamiquement les chemins "relatifs aux composants" dans templateUrl et styleUrls en "chemins absolus" pour vous.
Nous vous encourageons fortement à n'écrire que les chemins relatifs aux composants. C’est la seule forme d’URL abordée dans ces documents. Vous n'avez plus besoin d'écrire @Component({ moduleId: module.id })
, et vous ne devriez pas le faire non plus.
On dirait que si vous utilisez "module": "es6" dans tsconfig.json, vous ne devez pas utiliser ceci :)
Cette valeur moduleId est utilisée par les processus de réflexion angulaire et le composant metadata_resolver pour évaluer le chemin d'accès complet du composant avant sa construction.