Angolare - Qual è il significato di module.id nel componente?


221

In un'app angolare, ho visto che @Componentha proprietà moduleId. Cosa significa?

E quando module.idnon è definito da nessuna parte, l'app funziona ancora. Come può ancora funzionare?

@Component({
  moduleId: module.id,
  selector: 'ng-app',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css'],
  directives: [AppComponent]
});

7
la migliore arte trovata finora, per lo stesso schwarty.com/2015/12/22/…
Pardeep Jain,

Risposte:


182

La versione beta di Angular (dalla versione 2-alpha.51) supporta le risorse relative per i componenti, come templateUrl e styleUrls nel @Componentdecoratore.

module.idfunziona quando si utilizza CommonJS. Non devi preoccuparti di come funziona.

Ricorda : l'impostazione moduleId: module.id nel decoratore @Component è la chiave qui. Se non lo possiedi, Angular 2 cercherà i tuoi file a livello di root.

Fonte dal post di Justin Schwartzenberger , grazie a @Pradeep Jain

Aggiornamento del 16 settembre 2016:

Se stai utilizzando il webpack per il raggruppamento, non è necessario module.idin Decorator. I plugin Webpack gestiscono automaticamente (aggiungilo) module.idnel bundle finale


benvenuto, per favore dai un'occhiata a questa domanda spero che tu mi possa aiutare. stackoverflow.com/q/36451917/5043867
Pardeep Jain

29
+1 per il riferimento al webpack, non avevo idea del perché le cose si rompessero quando avrebbero dovuto funzionare e lavorare quando avrebbero dovuto rompersi ...
João Mendes,

9
non riesco a pensare a una cosa più controintuitiva da inventare
khusrav,

15
In che modo questo spiega cos'è module.id?
Gyozo Kudor,

1
@gyozokudor Se non lo hai, Angular 2 cercherà i tuoi file a livello di root.
Nishchit Dhanani,

89

Aggiornamento per (13-03-2017) :

Tutta la menzione di moduleId rimossa. Libro di cucina "Percorsi relativi componenti" eliminato

Abbiamo aggiunto un nuovo plug-in SystemJS (systemjs-angular-loader.js) alla nostra configurazione SystemJS consigliata. Questo plugin converte dinamicamente i percorsi "relativi ai componenti" in templateUrl e styleUrls in "percorsi assoluti" per te.

Ti consigliamo vivamente di scrivere solo percorsi relativi ai componenti. Questa è l'unica forma di URL discussa in questi documenti. Non hai più bisogno di scrivere @Component({ moduleId: module.id }), né dovresti.

Fonte: https://angular.io/docs/ts/latest/guide/change-log.html

Definizione:

moduleId?: string

moduleIdil parametro all'interno @Componentdell'annotazione assume un stringvalore che è;

" L'ID del modulo che contiene il componente. "

Utilizzo CommonJS: module.id,

Utilizzo di SystemJS: __moduleName


Motivo per l'usomoduleId :

moduleId viene utilizzato per risolvere i percorsi relativi per i fogli di stile e i modelli, come indicato nella documentazione.

L'ID del modulo che contiene il componente. Necessario essere in grado di risolvere gli URL relativi per modelli e stili. In Dart, questo può essere determinato automaticamente e non deve essere impostato. In CommonJS, questo può sempre essere impostato su module.id.

ref (vecchio): https://angular.io/docs/js/latest/api/core/index/ComponentMetadata-class.html

possiamo specificare le posizioni del modello e dei file di stile relativi al file di classe del componente semplicemente impostando la proprietà moduleId dei metadati @Component

rif: https://angular.io/docs/ts/latest/cookbook/component-relative-paths.html


Esempio di utilizzo:

Struttura delle cartelle:

RootFolder
├── index.html
├── config.js
├── app
│   ├── components
│   │   ├── my.component.ts
│   │   ├── my.component.css
│   │   ├── my.component.html


Senza 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
})

Con 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
})

8
Ma come funziona, dov'è il riferimento di module.id
Nishchit Dhanani,

1
@NishchitDhanani non è necessario ma ti suggerisco di controllare github.com/angular/angular/issues/6053 che si associa alle tue mapchiavi all'interno della tua configurazione. Come app.
eko,

1
Il collegamento di echonax ai documenti attualmente non funziona, anche se è il collegamento nella pagina del componente Angular.io. Prova: angular.io/docs/js/latest/api/core/index/…
John Pankowicz,

1
Sembra che tu abbia dimenticato la sottodirectory "componenti" della directory radice "app" nell'approccio senza module.id, non è vero? Penso che dovrebbe essere: templateUrl: 'app/components/my.component.html', styleUrls: ['app/components/my.component.css']
Ilker Cat il

23

Se ottieni typescript error, solo declarela variabile nel tuo file.

// app.component.ts
declare var module: {
   id: string;
}
//
@Component({
   moduleId: module.id,    // now it works without annoying Typescript
   ...
})

UPDATE - December 08, 2016

La moduleparola chiave è disponibile su node. Quindi, se installi @types/node, nel tuo progetto, avrai moduleautomaticamente la parola chiave disponibile nei tuoi file dattiloscritti senza che declaresia necessario.

npm install -D @types/node

A seconda della configurazione, potrebbe essere necessario includerlo nel tsconfig.jsonfile per ottenere gli strumenti :

//tsconfig.json
{
   ...
   "compilerOptions": {
       "types" : ["node"]
   }
   ...
}

// some-component.ts
// now, no need to declare module
@Component({
   moduleId: module.id,    // now it works without annoying Typescript
   ...
})

In bocca al lupo


1
grazie mille! finalmente ho ottenuto il mio ng build --prod --aotlavoro facendo npm install -D @types/nodedopo aver trascorso molto tempo a giocherellare :)
Anand Rockzz,

un'altra cosa che ho fatto è stata moduleId: 'module.id'(notare le virgolette singole attorno a module.id)
Anand Rockzz,

@AnandRockzz Sono contento che tu abbia trovato utile questo post. Non penso che tu debba aggiungere module.iduna stringa. Se ha funzionato, qualcosa sembra essere errato. Potrebbe essere necessario effettuare ulteriori ricerche.
Akash,

3

Oltre alle grandi spiegazioni di echonaxe Nishchit Dhananivoglio aggiungere, con cui odio davvero la popolazione di componenti module.id. Soprattutto, se hai il supporto per la compilazione AoT (Ahead-of-Time) e per un progetto realistico questo è ciò a cui dovresti mirare, non c'è posto per qualcosa di simile module.idnei metadati dei componenti.

Dai documenti :

Le applicazioni compilate da JiT che utilizzano il SystemJScaricatore e gli URL relativi al componente devono impostare la @Component.moduleIdproprietà su module.id. L'oggetto modulo non è definito quando viene eseguita un'app compilata con AoT. L'app non riesce con un errore di riferimento null a meno che non si assegni un valore di modulo globale in index.html in questo modo:

<script>window.module = 'aot';</script>

Penso che avere questa linea nella versione di produzione del index.htmlfile non sia assolutamente accettabile!

Pertanto, l'obiettivo è di avere una compilazione JiT (Just-in-Time) per lo sviluppo e il supporto AoT per la produzione con la seguente definizione di metadati del componente: (senza moduleId: module.idriga)

@Component({      
  selector: 'my-component',
  templateUrl: 'my.component.html', <- relative to the components current path
  styleUrls:  ['my.component.css'] <- relative to the components current path
})

Allo stesso tempo, vorrei posizionare stili, my.component.cssfile simili e modello, come my.component.html relativi ai my.component.tspercorsi dei file dei componenti .

Per ottenere tutto ciò, la soluzione che sto usando è quella di ospitare server web (lite-server o browser-sync) durante la fase di sviluppo da più fonti di directory!

bs-config.json:

{
  "port": 8000,
  "server": ["app", "."]
}

Per favore dai un'occhiata a questa risposta per me dettagli.

L'esemplare angolare 2 del progetto di avvio rapido, che si basa su questo approccio è ospitato qui .


3

Come da documento angolare, non dovresti usare @Component ({moduleId: module.id})

Rif. Https://angular.io/docs/ts/latest/guide/change-log.html

Ecco il testo pertinente da quella pagina:

Tutta la menzione di moduleId rimossa. Ricettario "Percorsi relativi dei componenti" eliminato (13-03-2017)

Abbiamo aggiunto un nuovo plug-in SystemJS ( systemjs-angular-loader.js) alla nostra configurazione SystemJS consigliata. Questo plugin converte dinamicamente i percorsi "relativi ai componenti" in templateUrl e styleUrls in "percorsi assoluti" per te.

Ti consigliamo vivamente di scrivere solo percorsi relativi ai componenti. Questa è l'unica forma di URL discussa in questi documenti. Non hai più bisogno di scrivere @Component({ moduleId: module.id }), né dovresti.


1
Aggiungerò anche questo alla mia risposta come dichiarazione di non responsabilità, grazie per l'aggiornamento.
eko,

1

Sembra che se stai usando "module": "es6" in tsconfig.json, non devi usare questo :)


non verrà traspilato in ES6 se lo facciamo?
Akash,

0

Questo valore moduleId viene utilizzato dai processi di riflessione angolare e dal componente metadata_resolver per valutare il percorso del componente completo prima della costruzione del componente.


-2

L'aggiunta moduleId: module.idrisolve diversi problemi che possono verificarsi durante la creazione di app angolari native e app Web angolari. È consigliabile utilizzarlo.

Inoltre, consente al componente di cercare i file nella directory corrente anziché dalla cartella principale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.