Kątowe - jakie są znaczenia module.id w skład?

W aplikacji kątowej widziałem, że @Component ma właściwość moduleId. Co to znaczy?

A gdy module.id nie jest zdefiniowany nigdzie, aplikacja nadal działa. Jak to może nadal działać?

@Component({
  moduleId: module.id,
  selector: 'ng-app',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css'],
  directives: [AppComponent]
});
Author: Lazar Ljubenović, 2016-05-12

8 answers

Wersja beta Angular (od wersji 2-Alfa.51) obsługuje zasoby względne Dla komponentów, takich jak templateUrl i style w dekoratorze @Component.

module.id działa przy użyciu CommonJS. Nie musisz się martwić, jak to działa.

Remember: setting moduleId: module.id w dekoratorze komponentu @jest klucz tutaj. Jeśli tego nie masz to Angular 2 będzie szukał dla plików na poziomie głównym.

Źródło od Justin Schwartzenberger ' s post , dzięki @Pradeep Jain

Aktualizacja 16 wrz 2016:

Jeśli używasz webpack do łączenia to nie potrzebujesz module.id w dekoratorze. Webpack plugins Auto handle (add it) module.id w pakiecie końcowym

 185
Author: Nishchit Dhanani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-17 08:32:28

Aktualizacja dla (2017-03-13):

Usunięto wszystkie wzmianki o moduleId. "Component relative paths" Cookbook deleted

Dodaliśmy nową wtyczkę SystemJS (systemjs-angular-loader.js) do zalecanej przez nas konfiguracji SystemJS. Ta wtyczka dynamicznie konwertuje ścieżki" component-relative "w templateUrl i styleUrls na" ścieżki absolutne".

Gorąco zachęcamy do Pisania tylko ścieżek względnych komponentów. To jest jedyna forma URL omówione w tych dokumentach. Nie musisz już pisać @Component({ moduleId: module.id }), ani nie powinieneś.

Źródło: https://angular.io/docs/ts/latest/guide/change-log.html

Definicja:

moduleId?: string

moduleId parametr wewnątrz adnotacji @Component przyjmuje wartość string, która jest;

"id modułu, który zawiera komponent."

Powszechne użycie js: module.id,

Użycie SystemJS: __moduleName


powód użycia moduleId :

moduleId służy do rozwiązywania ścieżek względnych arkuszy stylów i szablonów zgodnie z Instrukcją w dokumentacji.

Identyfikator modułu, który zawiera komponent. Potrzebne, aby móc rozwiązać względne adresy URL dla szablonów i stylów. W Dart można to określić automatycznie i nie trzeba go ustawiać. W CommonJS zawsze można to ustawić na module.id.

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

Możemy określić lokalizacje plików szablonów i stylów względem pliku klasy komponentu po prostu ustawiając właściwość moduleId metadanych @ komponentu

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


przykładowe użycie:

Struktura folderów:

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


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

Z 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
})
 90
Author: eko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 06:08:26

Jeśli otrzymasz typescript error, po prostu declare zmienną w Twoim pliku.

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

UPDATE - December 08, 2016

Słowo kluczowe module jest dostępne na node. Więc jeśli zainstalujesz @types/node, w Twoim projekcie, będziesz miał module słowo kluczowe automatycznie dostępne w plikach maszynopisu bez potrzeby declare.

npm install -D @types/node

W zależności od konfiguracji, możesz być może musisz to uwzględnić w pliku tsconfig.json, aby uzyskać narzędzia :

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

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

Powodzenia

 23
Author: Aakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-25 12:44:59

Oprócz wielkich wyjaśnień z echonax i Nishchit Dhanani chcę dodać, że naprawdę nienawidzę populacji składników z module.id. Szczególnie, jeśli masz wsparcie dla (Ahead-of-Time) AOT-compilation i dla realistycznego projektu to jest to, do czego powinieneś dążyć, nie ma miejsca na coś takiego jak module.id w metadanych komponentów.

Z Docs :

Skompilowane aplikacje JIT, które używają adresów URL SystemJS loader i component-relative musi ustawić właściwość @Component.moduleId na module.id. Obiekt modułu jest niezdefiniowany, gdy uruchomiona jest aplikacja skompilowana przez AOT. Aplikacja zawiedzie Z null błąd odniesienia, chyba przypisać globalną wartość modułu w indeksie.html jak ten:

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

Myślę, że posiadanie tej linii w wersji produkcyjnej pliku index.html jest absolutnie niedopuszczalne!

Dlatego celem jest posiadanie (Just-In-Time) kompilacji JiT dla rozwoju i wsparcia AOT dla produkcji z następującymi definicja metadanych składowych: (bez linii 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
})

W tym samym czasie chciałbym umieścić style, jak my.component.css i pliki szablonów, jak my.component.html względne do komponentu my.component.ts ścieżki plików.

Aby to wszystko osiągnąć, rozwiązaniem, którego używam, jest hostowanie serwera www (lite-server lub browser-sync) w fazie rozwoju z wielu źródeł katalogów!

bs-config.json:

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

Proszę o odpowiedź dla mnie szczegóły.

Przykładowy projekt angular 2 quick start, który opiera się na tym podejściu jest hostowany tutaj .

 3
Author: Evgeny Bobkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:11

Zgodnie z dokumentem Angular, nie powinieneś używać @ Component ({moduleId: module.id })

Proszę ref: https://angular.io/docs/ts/latest/guide/change-log.html

Oto odpowiedni tekst z tej strony:

Usunięto wszystkie wzmianki o moduleId. Książka kucharska" ścieżki względne komponentu " usunięta (2017-03-13)

Dodaliśmy nową wtyczkę SystemJS (systemjs-angular-loader.js) do naszej zalecanej konfiguracji SystemJS. Ta wtyczka dynamicznie konwertuje ścieżki "komponentowo-względne" w templateUrl i styleUrls do "ścieżek absolutnych" dla Ciebie.

Gorąco zachęcamy do Pisania tylko ścieżek względnych komponentów. Jest to jedyna forma adresu URL omawiana w tych dokumentach. Nie musisz już pisać @Component({ moduleId: module.id }), ani nie powinieneś.

 3
Author: Prasanth Bendra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 06:02:16

Wygląda tak, jeśli używasz "module": "es6" w tsconfig.json, nie musisz tego używać:)

 1
Author: Steffan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-25 14:00:15

Ta wartość moduleId jest używana przez procesy odbicia kątowego i komponent metadata_resolver do oceny w pełni kwalifikowanej ścieżki komponentu przed zbudowaniem komponentu.

 0
Author: Krishna Ganeriwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 04:10:24

Dodanie moduleId: module.id rozwiązuje kilka problemów, które mogą wystąpić podczas tworzenia aplikacji natywnych i aplikacji internetowych angular. To najlepsza praktyka, aby go używać.

Pozwala również komponentowi szukać plików w bieżącym katalogu zamiast w górnym folderze

 -2
Author: mast3rd3mon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-21 13:17:57