Angular-component에서 module.id의 의미는 무엇입니까?


221

Angular 앱에서 @Component속성 이있는 것을 보았습니다 moduleId. 무슨 뜻인가요?

그리고 module.id가 정의되지 않은 경우 에도 앱은 여전히 ​​작동합니다. 여전히 어떻게 작동합니까?

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

답변:


182

각도의 베타 버전은 (vesion 2 alpha.51 이후) 상대와 같은 구성 요소에 대한 자산, 지원 templateUrlstyleUrls을@Component장식.

module.idCommonJS를 사용할 때 작동합니다. 작동 방식에 대해 걱정할 필요가 없습니다.

기억하십시오 : @Component 데코레이터에서 moduleId : module.id를 설정하는 것이 핵심입니다. 그것을 가지고 있지 않으면 Angular 2는 루트 레벨에서 파일을 찾습니다.

@Pradeep Jain 덕분에 Justin Schwartzenberger의 게시물 출처

2016 년 9 월 16 일 업데이트 :

번들로 웹팩 을 사용하는 경우 module.id데코레이터 가 필요하지 않습니다 . module.id최종 번들에서 Webpack 플러그인 자동 처리 (추가)


당신의 환영,이 질문에 당신이 나를 도울 수 있기를 바랍니다. stackoverflow.com/q/36451917/5043867
Pardeep Jain이

29
웹팩 참조 +1, 나는 그들이 일하기로되어있을 때 일이 끊어졌을 때 왜 일이 깨질 지 몰랐다 ...
João Mendes

9
더 반 직관적 인 발명을 생각할 수 없다
khusrav

15
이것은 module.id가 무엇인지 어떻게 설명합니까?
교조 쿠 도르

1
@gyozokudor 만약 이것이 없다면 Angular 2는 루트 레벨에서 파일을 찾을 것입니다.
Nishchit Dhanani 2012

89

(2017-03-13) 업데이트 :

moduleId에 대한 모든 언급이 제거되었습니다. "구성 요소 상대 경로"요리 책이 삭제되었습니다.

권장 SystemJS 구성에 새로운 SystemJS 플러그인 (systemjs-angular-loader.js)을 추가했습니다. 이 플러그인은 templateUrl 및 styleUrls의 "component-relative"경로를 "absolute paths"로 동적으로 변환합니다.

구성 요소 관련 경로 만 작성하는 것이 좋습니다. 이것이이 문서에서 논의 된 유일한 형식의 URL입니다. 더 이상 글을 쓸 필요 @Component({ moduleId: module.id })도없고해서는 안됩니다.

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

정의:

moduleId?: string

moduleId@Component주석 내부의 매개 변수 는 다음과 같은 string값을 갖습니다.

" 구성 요소를 포함하는 모듈의 모듈 ID입니다. "

CommonJS 사용법 : module.id,

SystemJS 사용법 : __moduleName


사용 이유moduleId :

moduleId 설명서에 나와있는대로 스타일 시트 및 템플릿의 상대 경로를 확인하는 데 사용됩니다.

구성 요소를 포함하는 모듈의 모듈 ID입니다. 템플릿 및 스타일의 상대 URL을 확인할 수 있어야합니다. Dart에서는이를 자동으로 결정할 수 있으며 설정할 필요가 없습니다. CommonJS에서는 항상 module.id로 설정할 수 있습니다.

심판 (구) : https://angular.io/docs/js/latest/api/core/index/ComponentMetadata-class.html

@Component 메타 데이터의 moduleId 속성을 설정하여 컴포넌트 클래스 파일을 기준으로 템플릿 및 스타일 파일의 위치를 ​​지정할 수 있습니다.

심판 : 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
})

8
그러나 그것이 어떻게 작동하는지, 어디에서 module.id의 참조
Nishchit Dhanani

1
@NishchitDhanani는 필요하지 않지만 github.com/angular/angular/issues/6053 을 확인 map하여 구성 내부의 키에 매핑하는 것이 좋습니다 . 처럼 app.
eko

1
echonax의 문서 링크는 Angular.io 구성 요소 페이지의 링크이지만 현재 작동하지 않습니다. 시도 : angular.io/docs/js/latest/api/core/index/…
존 Pankowicz

1
module.id가없는 접근법에서 'app'루트 디렉토리의 'components'하위 디렉토리를 잊어 버린 것 같습니다. 다음과 같아야합니다. templateUrl: 'app/components/my.component.html', styleUrls: ['app/components/my.component.css']
Ilker Cat

23

당신이 얻는다면 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키워드를 입력하지 않아도 자동으로 타이프 스크립트 파일에서 사용할 수 있습니다 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
   ...
})

행운을 빕니다


1
tnq 너무! 드디어 오랜 시간을 보낸 후 ng build --prod --aot일하면서 내 일을했습니다 npm install -D @types/node:)
Anand Rockzz

내가 한 또 다른 것은 moduleId: 'module.id'(module.id 주위의 작은 따옴표에 주목)
Anand Rockzz

@AnandRockzz이 게시물이 도움이되었다 니 다행입니다. module.id문자열 로 추가해야한다고 생각하지 않습니다 . 제대로 작동하면 문제가있는 것 같습니다. 더 연구해야 할 수도 있습니다.
Akash

3

에서 큰 설명에 추가 echonax하고 Nishchit Dhanani내가 정말와 구성 요소의 인구를 싫어, 추가 할 module.id. 특히 (Ahead-of-Time) AoT 컴파일 을 지원하고 현실적인 프로젝트를 목표로해야하는 경우 module.id구성 요소 메타 데이터 와 같은 곳이 없습니다 .

로부터 문서 :

SystemJS로더 및 컴포넌트 기준 URL 을 사용하는 JiT 컴파일 애플리케이션 은 @Component.moduleId특성을로 설정해야합니다 module.id. AoT 컴파일 앱이 실행될 때 모듈 객체가 정의되지 않습니다. index.html에 다음과 같이 전역 모듈 값을 할당하지 않으면 앱이 null 참조 오류와 함께 실패합니다.

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

index.html파일 의 프로덕션 버전 에서이 줄을 갖는 것은 절대 허용되지 않습니다!

따라서, 목표는있을 것입니다 (적시) 다음과 같은 구성 요소 메타 데이터 정의와 생산을위한 개발 및 AOT 지원을위한 JIT 컴파일 : (없는 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.cssmy.component.html 관련된 스타일 및 템플릿 파일 을 배치하고 싶습니다 my.component.ts.

이 모든 것을 달성하기 위해 사용중인 솔루션은 여러 디렉토리 소스에서 개발 단계 동안 웹 서버 (lite-server 또는 browser-sync)를 호스팅하는 것입니다!

bs-config.json:

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

자세한 내용 은이 답변 을 참조하십시오.

이 접근법에 의존하는 예시적인 앵귤러 2 퀵 스타트 프로젝트가 여기 에 호스팅 됩니다 .


3

Angular 문서에 따라 @Component ({moduleId : module.id})를 사용하면 안됩니다

참조하십시오 : https://angular.io/docs/ts/latest/guide/change-log.html

해당 페이지의 관련 텍스트는 다음과 같습니다.

moduleId에 대한 모든 언급이 제거되었습니다. "구성 요소 상대 경로"요리 책 삭제 (2017-03-13)

systemjs-angular-loader.js권장 SystemJS 구성에 새로운 SystemJS 플러그인 ( )을 추가했습니다 . 이 플러그인은 templateUrl 및 styleUrls의 "component-relative"경로를 "absolute paths"로 동적으로 변환합니다.

구성 요소 관련 경로 만 작성하는 것이 좋습니다. 이것이이 문서에서 논의 된 유일한 형식의 URL입니다. 더 이상 글을 쓸 필요 @Component({ moduleId: module.id })도없고해서는 안됩니다.


1
또한 업데이트에 대한 감사의 표시로 내 답변에 이것을 추가 할 것입니다.
eko

1

tsconfig.json에서 "module": "es6"을 사용하는 경우 다음과 같이 사용하지 않아도됩니다.


이렇게 하면 ES6으로 변환 되지 않습니까 ?
Akash

0

이 moduleId 값은 Angular reflection 프로세스와 metadata_resolver 구성 요소에서 구성 요소를 구성하기 전에 정규화 된 구성 요소 경로를 평가하는 데 사용됩니다.


-2

추가하면 moduleId: module.id기본 각도 앱 및 각도 웹 앱을 빌드 할 때 발생할 수있는 몇 가지 문제가 수정되었습니다. 사용하는 것이 가장 좋습니다.

또한 구성 요소가 최상위 폴더 대신 현재 디렉토리에서 파일을 찾을 수 있도록합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.