Angular2 - Каковы значения module.id в компоненте?

В Angular2 я видел, что @Component имеет свойство moduleId.

Что это значит?

И когда module.id не определяется нигде, приложение все еще работает.

Как он может работать?

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

Ответ 1

Бета-версия Angular2 (так как alpha.51) поддерживает относительные активы для компонентов, например templateUrl и styleUrls в декодере @Component.

module.id работает при использовании CommonJS. Вам не нужно беспокоиться о том, как это работает.

Запомнить: установка moduleId: module.id в @Component decorator ключ здесь. Если у вас этого нет, тогда Angular 2 будет выглядеть для ваших файлов на корневом уровне.

Источник Сообщение Джастина Шварценбергера, благодаря @Pradeep Jain

Обновление от 16 сентября 2016 года:

Если вы используете webpack для комплектации, вам не нужно module.id в декораторе. Webpack плагины автоматически обрабатывают (добавьте его) module.id в конечном пакете

Ответ 2

Обновление для (2017-03-13):

Все упоминания moduleId удалены. "Кулинарная книга" Относительные пути компонентов "

Мы добавили новый плагин SystemJS (systemjs- angular -loader.js) в нашу рекомендуемую конфигурацию SystemJS. Этот плагин динамически преобразует пути" компонент-относительные "в шаблонах url и styleUrls к" абсолютным путям" для вас.

Мы настоятельно рекомендуем вам писать только пути, относящиеся к компонентам. Это единственная форма URL, обсуждаемая в этих документах. Вам больше не нужно писать @Component({ moduleId: module.id }), и вы не должны.

Источник: https://angular.io/docs/ts/latest/guide/change-log.html

Определение:

moduleId?: string

moduleId параметр внутри аннотации @Component принимает значение string, которое:

"Идентификатор модуля модуля, который содержит компонент."

Использование CommonJS: module.id,

Использование SystemJS: __moduleName


Причина использования moduleId:

moduleId используется для разрешения относительных путей для ваших таблиц стилей и шаблонов, как сказано в документации.

Идентификатор модуля модуля, который содержит компонент. Необходимо иметь возможность разрешать относительные URL-адреса для шаблонов и стилей. В Dart это можно определить автоматически и не нужно устанавливать. В CommonJS это всегда можно установить в module.id.

ref (старый): https://angular.io/docs/js/latest/api/core/index/ComponentMetadata-class.html

мы можем указать расположение файлов шаблона и стиля по отношению к файлу класса компонентов, просто установив свойство moduleId метаданных @Component

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


Использование примера:

Структура папки:

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


Без 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
})

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

Ответ 3

Если вы получите typescript error, просто declare переменную в вашем файле.

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

UPDATE - December 08, 2016

Ключевое слово module доступно на node. Поэтому, если вы установите @types/node, в вашем проекте у вас будет module ключевое слово автоматически доступное в ваших файлах typescript без необходимости declare.

npm install -D @types/node

В зависимости от вашей конфигурации вы можете включить это в свой tsconfig.json файл, чтобы получить оснастку:

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

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

Удача

Ответ 4

По умолчанию angular2 введите абсолютный путь пути, я имею в виду из корня приложения в основном из

SRC folder 

Но иногда нам приходится указывать относительный путь, чтобы избежать столкновения имен, поэтому нам нужно использовать свойство аннотации компонента с именем "module.id". Используя этот компонент, вы просматриваете текущий путь к папке, а не от корневого уровня, и это также упростить повторное использование наших компонентов в других приложениях.

Например, по умолчанию:

@component({
....
// from root level path without module ID
TemplateURL : './abc/def/ghi/jkl.html' 
....
})

С помощью id модуля

@component({
.....
//relative path
TemplateUrl : 'jkl.html',
ModuleId : module.id

// Same in case of CSS path
..... 
})

Существует несколько недостатков использования абсолютных путей. С течением времени они усложняют настройку структуры папок по мере роста приложения. Они затрудняют повторное использование наших компонентов в других приложениях.

И что нам делать? Вместо этого мы можем использовать подход относительного пути компонентов.

Ответ 5

В дополнение к большим объяснениям от echonax и Nishchit Dhanani я хочу добавить, что я действительно ненавижу популяцию компонентов с помощью module.id. Особенно, если у вас есть поддержка (Ahead-of-Time) AoT-компиляция, и для реалистичного проекта это то, к чему вы должны стремиться, в ваших метаданных компонента нет места для module.id.

Из Docs:

JiT-скомпилированные приложения, которые используют SystemJS загрузчик и относительные URL-адреса компонентов, должны установить для свойства @Component.moduleId значение module.id. Объект модуля undefined выполняется при скомпилированном приложении AoT. Приложение не работает с ошибкой нулевой ссылки, если вы не назначили глобальное значение модуля в index.html следующим образом:

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

Я думаю, что эта строка в производственной версии файла index.html абсолютно неприемлема!

Следовательно, цель состоит в том, чтобы иметь JiT-компиляцию (Just-in-Time) для разработки и поддержку AoT для производства со следующим определением метаданных компонентов: (без строки 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
})

В то же время я хотел бы поместить стили, такие как my.component.css и файлы шаблонов, например my.component.html relative в пути к файлам my.component.ts.

Чтобы достичь всего этого, я использую решение для размещения веб-сервера (lite-server или sync-sync) на этапе разработки из нескольких источников каталогов!

bs-config.json:

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

Пожалуйста, возьмите этот ответ для меня подробнее.

Примерный проект быстрого запуска angular 2, который опирается на этот подход, размещен здесь.

Ответ 6

В соответствии с Angular doc, вы не должны использовать @Component ({moduleId: module.id})

Пожалуйста, напишите: https://angular.io/docs/ts/latest/guide/change-log.html

Вот соответствующий текст с этой страницы:

Все упоминания о moduleId удалены. "Кулинарная книга компонентов относительных путей" удалена (2017-03-13)

Мы добавили новый плагин SystemJS (systemjs-angular-loader.js) в нашу рекомендуемую конфигурацию SystemJS. Этот плагин динамически преобразует пути "компонент-относительные" в шаблонах url и styleUrls к "абсолютным путям" для вас.

Мы настоятельно рекомендуем вам писать только пути, относящиеся к компонентам. Это единственная форма URL, обсуждаемая в этих документах. Вам больше не нужно писать @Component({ moduleId: module.id }), и вы не должны.

Ответ 7

Похоже, если вы используете "module": "es6" в tsconfig.json, вам не нужно использовать это:)

Ответ 8

Добавление moduleId: module.id устраняет некоторые проблемы, которые могут возникнуть при создании приложений для родного angular и angular веб-приложений. Лучше всего использовать его.

Он также позволяет компоненту искать в текущем каталоге файлы, а не в верхней папке

Ответ 9

Это значение moduleId используется процессами отражения Angular и компонентом metadata_resolver для оценки полного пути к компоненту перед компоновкой компонента.