Angular: Angular2 AOT ์ปดํŒŒ์ผ - "ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(... ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ)"

์— ๋งŒ๋“  2016๋…„ 12์›” 20์ผ  ยท  183์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: angular/angular

[ x ] bug report => search github for a similar issue or PR before submitting
[ ] feature request
[ ] support request => Please do not submit support request here, instead see https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question

ํ˜„์žฌ ํ–‰๋™
๋‚ด ์ž‘์—… ๊ณต๊ฐ„์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ/ํŒŒ์ดํ”„/์ง€์‹œ์–ด๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ฐ์ง€๋˜์–ด ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•ด Cannot determine the module for class (...) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์„ ์ค‘์ง€ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์ž‘์—… ๊ณต๊ฐ„์— ํ•ด๋‹น ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ ์•ฑ(๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋‹ค๋ฅธ ์ฝค๋ณด๊ฐ€ ํ•„์š”ํ•œ ํŒŒํŠธ๋„ˆ ๊ตฌํ˜„)์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘์—… ๊ณต๊ฐ„์— ๊ด€๊ณ„์—†์ด ํฌํ•จ๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ์›นํŒฉ ๋กœ๋”์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํŠนํžˆ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” ๊ฒฝ๊ณ  ๋ฐ/๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์— ์˜ํ•ด ์นจ๋ฌต๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์›นํŒฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํŒŒ์ผ ๋ชฉ๋ก์„ ์‚ฝ์ž…ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์›นํŒฉ์ด ์ž‘์—… ๊ณต๊ฐ„์˜ ๋ชจ๋“  ํŒŒ์ผ ๋Œ€์‹  ์š”๊ตฌ ์ฒด์ธ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์นจ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์žฌํ˜„
JIT๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ plunkr์—์„œ ๋ฐ๋ชจํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  1. ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ AppComponent๋กœ ngModule์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉํ•˜๋Š” ๊ธฐ๋ณธ ๊ฐ๋„ ์•ฑ ๋งŒ๋“ค๊ธฐ
  2. ์ด ์•ฑ์„ AOT ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค(hello world์—์„œ๋Š” ๊ฝค ์‰ฌ์›Œ์•ผ ํ•จ).
  3. ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ์–ด๋Š ๊ณณ์—์„œ๋„ ์ฐธ์กฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  4. AOT ์ปดํŒŒ์ผ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. Cannot determine the module for class ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ–‰๋™์„ ๋ฐ”๊พธ๋Š” ๋™๊ธฐ/์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์šฐ๋ฆฌ ํšŒ์‚ฌ์—๋Š” ์ž์ฒด ๊ธฐ๋ณธ ์•ฑ์ด ์žˆ์œผ๋ฉฐ ํŒŒํŠธ๋„ˆ๋Š” ํ•ด๋‹น ์•ฑ์˜ ์ˆ˜์ •๋œ ๋ฒ„์ „์„ ์ž์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒํŠธ๋„ˆ๋ฅผ ๋ณ„๋„๋กœ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ€์ ธ์˜จ ๊ณตํ†ต ์ผ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•ฑ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ํŒŒํŠธ๋„ˆ์˜ ๊ฒฝ์šฐ ๊ณต์œ  npm ํŒจํ‚ค์ง€์˜ ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์— ์„ ์–ธ๋œ ๋ชจ๋“ˆ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— AOT๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.
๋ชจ๋“  ์žฅ์น˜์—์„œ ๋ฐœ์ƒํ•˜์ง€๋งŒ ํ˜„์žฌ ํ…Œ์ŠคํŠธ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์œˆ๋„์šฐ 10
VS ์ฝ”๋“œ
Cmder(bash ํ„ฐ๋ฏธ๋„)

  • ๊ฐ๋„ ๋ฒ„์ „:
    v2.1.0(2.3.1์—์„œ๋„ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ

  • ๋ธŒ๋ผ์šฐ์ €: ๋ชจ๋‘ - ๋ธŒ๋ผ์šฐ์ €๋ณ„ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ์–ธ์–ด: ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ

  • ๋…ธ๋“œ(AoT ๋ฌธ์ œ์šฉ): ๋…ธ๋“œ v6.3.0
P5 compiler NgModule ve low error messages triage #1 confusing

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@DzmitryShylovich ์‚ฌ์šฉ ์ค‘์ธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ด€ํ•œ ํ•œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋˜์ง€ ์•Š์€ .ts ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  183 ๋Œ“๊ธ€

ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ชจ๋“ˆ์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜๋„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ์š”์ฒญ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@DzmitryShylovich ์‚ฌ์šฉ ์ค‘์ธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ด€ํ•œ ํ•œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋˜์ง€ ์•Š์€ .ts ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

@swimmadude66 tsconfig์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@DzmitryShylovich ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐฐ๋Ÿด ํŒŒ์ผ์€ ๊ทธ๊ฒƒ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋ฐฐ๋Ÿด ํŒŒ์ผ๋กœ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ๋ฐฐ๋Ÿด ํŒŒ์ผ๋„ ๋ฌด์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ฐฐ๋Ÿด์—์„œ ํ•„์š”ํ•œ ํด๋ž˜์Šค์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. Tree-shaking์€ ์ œ์ณ๋‘๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฃผ์–ด์ง„ ํŒŒ์ผ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ฃผ์–ด์ง„ ํŒŒ์ผ์— ๋ช…์‹œ์ ์œผ๋กœ ๋งํฌ๋˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค ...

JIT ์ปดํŒŒ์ผ์ด ์ž‘๋™ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฝค ์ข‹์€ ์ฆ๊ฑฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋ฅผ ๋ผ์น˜ ์ง€ ์•Š๊ณ  ์ œ์™ธ ๋  ์ˆ˜์žˆ๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋Œ€์‹  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•˜๋ฃจ ์ข…์ผ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋‚˜์—๊ฒŒ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋‹ค์†Œ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์‹ค์ œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ ์–ด๋„ ์˜ค๋ฅ˜๋ฅผ ์–ต์ œํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์š”๊ตฌํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋™๋ฃŒ๊ฐ€ ์ผ๊ด„ ์ œ์™ธ ์‚ฌ์šฉ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฐ๋Ÿด ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ฒช์—ˆ๋˜ @ngtools/webpack์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์›๋ž˜ ์—ฐ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์ฐธ์กฐ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. https://github.com/angular/angular-cli/issues/3636

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚ด๊ฐ€ ์ปดํŒŒ์ผํ•˜๋„๋ก ์š”์ฒญํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ์ธ์‹ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ.

๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— ํ”„๋กœ์ ํŠธ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ˜„์žฌ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ "JIT์—์„œ ์ž‘๋™ํ•œ๋‹ค"๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ AOT์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด ์ƒ๊ฐ์— ๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์ผ์€ ๊ธฐ๋ณธ ์•ฑ์—์„œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•œ ๋‹ค์Œ ์ผ์ข…์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๋ชจ๋“  ์ธก๋ฉด์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

@Toxicable ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํƒ€์ผ์˜ npm ๋ชจ๋“ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ƒ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@project/angular(๊ณต์œ  ์ฝ”๋“œ npm ๋ชจ๋“ˆ)์—๋Š” ๊ธฐ๋ณธ ์•ฑ์„ ๋งŒ๋“ค๊ณ  ๋ฐฑ์—”๋“œ ํ”Œ๋žซํผ๊ณผ ํ†ต์‹ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ, ํŒŒ์ดํ”„, ์ง€์‹œ๋ฌธ ๋ฐ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํŒŒํŠธ๋„ˆ๋Š” ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ํ™ˆ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ์•ฑ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋Š” ๋™์ผํ•  ๊ฒƒ์ด๋ฉฐ ๋‹น์‚ฌ ํ”Œ๋žซํผ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์„œ๋น„์Šค๋„ ๋™์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์šฐ๋ฆฌ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ ํŒŒํŠธ๋„ˆ๊ฐ€ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  npm ๋ชจ๋“ˆ์—์„œ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„๊ณผ ๊ณต์œ  ๋ถ€๋ถ„์˜ ์กฐํ•ฉ์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒˆ HomeModule ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import {
    OverviewComponent,
    ProfileComponent
} from './components/home';

import {
    AuthComponent
} from '@project/angular';

๊ทธ๋Ÿฌ๋ฉด @project/angular์—์„œ OverviewComponent๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Cannot determine the module for class OverviewComponent ๋ผ๊ณ  AOT์—์„œ ํญ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ @project/angular/components/home/overview/component.ts ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ์ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ node_modules ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ๊ณ  ๋ถˆํ‰ํ•˜๊ณ  ์ฃฝ์Šต๋‹ˆ๋‹ค.

JIT๋Š” !== AOT๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ๊ธฐ๋ณธ ์•ฑ์€ AOT์™€ ์ž‘๋™ํ•˜๋ฉฐ ๊ฐœ๋… ์ฆ๋ช… ํŒŒํŠธ๋„ˆ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์ž‘์Šต๋‹ˆ๋‹ค. JIT์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด AOT์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ์„ ๋งŒํ•œ ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ˜„์žฌ ๋™์ž‘์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด some-feature.component.ts ๋ฐ some-feature.component.spec.ts ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ some-feature $ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ฝ˜ํ…์ธ  ํ”„๋กœ์ ์…˜์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด๊ธฐ์—์„œ some-feature ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด some-feature.component.spec.ts ํŒŒ์ผ ๋‚ด๋ถ€ ์— ํ…Œ์ŠคํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@Component({
  selector: 'test-app',
  template: `<some-feature><p>projected content</p></some-feature>`
})
export class TestAppComponent {}

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์—์„œ ์ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค .

  ...
  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [TestAppComponent, SomeFeatureComponent]
    })
  })
  ...

angular-cli๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ng build --prod --aot ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์œ ํšจํ•˜๊ณ  ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.
Cannot determine the module for class TestAppComponent .

AOT๊ฐ€ .spec ํŒŒ์ผ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ngc๋Š” tsc๊ฐ€ ์ปดํŒŒ์ผํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฐพ์€ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Angular๋Š” ๊ด€๋ จ ๋ชจ๋“ˆ ์—†์ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ AOT๊ฐ€ ํญ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. AOT๊ฐ€ TestComponent* ๋“ฑ๊ณผ ๊ฐ™์€ ์™€์ผ๋“œ์นด๋“œ ํ‘œํ˜„์‹์„ ์ถฉ์กฑํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(testWrapper ์‚ฌ๋ก€๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ). ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ง„์งœ ๋ฌธ์ œ๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐฐ๋Ÿด ํŒŒ์ผ์—์„œ ANYTHING์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ฐฐ๋Ÿด์—์„œ ๋‹ค์‹œ ๋ฐฉ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์˜ ์‚ฌ์Šฌ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ์ˆ˜์ค€ PROJECT/components ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์™”๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฒฝ๊ณ ๋กœ ๋” ๋‚˜์„ ๊ฒƒ์ด์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ๋ฅผ ์กฐ๊ธˆ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋จ:

$ ./node_modules/.bin/ng-xi18n
Error: Cannot determine the module for class DividerPanel in C:/msweb/studiotouch/src/comps/dividerpanel/DividerPanel.ts!
Cannot determine the module for class EntryPanel in C:/msweb/studiotouch/src/comps/entry/EntryPanel.ts!
Cannot determine the module for class ForgotPass in C:/msweb/studiotouch/src/comps/entry/ForgotPass.ts!
Cannot determine the module for class Footer in C:/msweb/studiotouch/src/comps/footer/Footer.ts!
Cannot determine the module for class Infobox in C:/msweb/studiotouch/src/comps/infobox/Infobox.ts!
Cannot determine the module for class InputNumeric in C:/msweb/studiotouch/src/comps/inputnumeric/InputNumeric.ts!
Cannot determine the module for class InputString in C:/msweb/studiotouch/src/comps/inputstring/InputString.ts!
Cannot determine the module for class Loading in C:/msweb/studiotouch/src/comps/loading/Loading.ts!
Cannot determine the module for class MapAddress in C:/msweb/studiotouch/src/comps/mapaddress/MapAddress.ts!
Cannot determine the module for class Minitab in C:/msweb/studiotouch/src/comps/minitabs/MiniTab.ts!
Cannot determine the module for class Minitabs in C:/msweb/studiotouch/src/comps/minitabs/MiniTabs.ts!
Cannot determine the module for class ModalDialog in C:/msweb/studiotouch/src/comps/modaldialog/ModalDialog.ts!
Cannot determine the module for class Ng2Highcharts in C:/msweb/studiotouch/src/comps/ng2-highcharts/src/directives/ng2-highcharts.ts!

Cannot determine the module for class Ng2Highstocks in C:/msweb/studiotouch/src/comps/ng2-highcharts/src/directives/ng2-highstocks.ts!

Cannot determine the module for class Ng2Highmaps in C:/msweb/studiotouch/src/comps/ng2-highcharts/src/directives/ng2-highmaps.ts!
Cannot determine the module for class simplelistEditable in C:/msweb/studiotouch/src/comps/simplelist/simplelistEditable.ts!
Cannot determine the module for class simplelist in C:/msweb/studiotouch/src/comps/simplelist/simplelist.ts!
Cannot determine the module for class FilterPipe in C:/msweb/studiotouch/src/pipes/FilterPipe.ts!
Cannot determine the module for class FilterPipeEqual in C:/msweb/studiotouch/src/pipes/FilterPipeNot.ts!
Cannot determine the module for class OrderBy in C:/msweb/studiotouch/src/pipes/OrderBy.ts!
Cannot determine the module for class ReplacePipe in C:/msweb/studiotouch/src/pipes/ReplacePipe.ts!
Cannot determine the module for class SortBy in C:/msweb/studiotouch/src/pipes/SortBy.ts!
    at analyzeAndValidateNgModules (C:\msweb\studiotouch\node_modules\@angular\compiler\bundles\compiler.umd.js:24878:17)
    at Extractor.extract (C:\msweb\studiotouch\node_modules\@angular\compiler\bundles\compiler.umd.js:27727:20)
    at Extractor.extractBundle (C:\msweb\studiotouch\node_modules\@angular\compiler-cli\src\extractor.js:40:33)
    at Extractor.extract (C:\msweb\studiotouch\node_modules\@angular\compiler-cli\src\extractor.js:30:34)
    at extract (C:\msweb\studiotouch\node_modules\@angular\compiler-cli\src\extract_i18n.js:7:67)
    at Object.main (C:\msweb\studiotouch\node_modules\@angular\tsc-wrapped\src\main.js:47:16)
    at Object.<anonymous> (C:\msweb\studiotouch\node_modules\@angular\compiler-cli\src\extract_i18n.js:14:9)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
Extraction failed

root@DESKTOP-VEUHFOL /cygdrive/c/msweb/studiotouch

Angular 2 ์ฃผ๋ฐฉ ์‹ฑํฌ๋Œ€: http://ng2.javascriptninja.io
๋ฐ ์†Œ์Šค@ https://github.com/born2net/Angular-kitchen-sink
๋ฌธ์•ˆ ์ธ์‚ฌ,

์…˜

i18์€ ์ „์ฒด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์‚ฌ์šฉ๋œ ์„ ์–ธ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ง€์‹œ๋ฌธ์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ๋”๋‹ˆ ํ† ๋ผ ๊ตฌ๋ฉ์ด ๋” ๊นŠ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

$ ./node_modules/.bin/ng-xi18n
Error: Error at C:/msweb/ng-skeleton/node_modules/typescript/lib/lib.d.ts:18770:11: Duplicate identifier 'ActiveXObject'.
Error at C:/msweb/ng-skeleton/node_modules/typescript/lib/lib.d.ts:18773:13: Duplicate identifier 'ActiveXObject'.
Error at C:/msweb/ng-skeleton/e2e/app.po.ts:1:38: Cannot find module 'protractor'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/facade/lang.d.ts:12:17: Cannot find name 'Map'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/facade/lang.d.ts:13:17: Cannot find name 'Set'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/application_init.d.ts:16:18: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/rxjs/Observable.d.ts:68:60: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/rxjs/Observable.d.ts:68:70: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/linker/compiler.d.ts:53:49: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/linker/compiler.d.ts:61:65: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/application_ref.d.ts:116:67: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/application_ref.d.ts:132:101: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/application_ref.d.ts:158:67: Cannot find name 'Promise'.
Error at C:/msweb/ng-skeleton/node_modules/@angular/core/src/application_ref.d.ts:160:101: Cannot find name 'Promise'.

๋ชจ๋“  ๊ฒƒ์ด angular-cli ๋ฐ angular-compiler์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” i18์ผ ๋ฟ์ด๋ผ๊ณ  ๋ง๋ถ™์ด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ(๋ฉ‹์ง€๊ณ  ๊น”๋”ํ•œ ์„ค์ •): https://github.com/born2net/ng-skeleton

๋ฌธ์•ˆ ์ธ์‚ฌ,

์…˜

์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋™์ผํ•œ ์˜ค๋ฅ˜ .. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ์œ ์šฉํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

// two comments aot read:

//  {path: 'about', component: AboutComponent 
// import { AboutComponent } from './about';

@kirjai ngc ๋Š” ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ž… ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@DzmitryShylovich ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ AOT๊ฐ€ ์ด ๊ฒฝ์šฐ์— ์ด ํŒŒ์ผ์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” AOT ์ปดํŒŒ์ผ ์ค‘์— .spec ํŒŒ์ผ์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ„๋ช…ํžˆ ํŒ€์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์•ˆ์œผ๋กœ, ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘์„ฑ๋œ ์—”ํ‹ฐํ‹ฐ์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— .spec ํŒŒ์ผ์„ ๋„ฃ๋Š” ๊ฒƒ์„ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์—์„œ ์ œ์•ˆํ•ด์„œ๋Š” ์•ˆ ๋ ๊นŒ์š”?

๋˜ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ AOT์˜ ์กฐํ•ฉ์œผ๋กœ ์ธํ•ด ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(๋ฐ ์ผ๋ถ€ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€)๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๊ธ€ ์„ ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ๋ฐœ๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •/ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๊ณต์‹ ํ…Œ์ŠคํŠธ ๊ฐ€์ด๋“œ ๋ฅผ ๋”ฐ๋ฅด๊ณ  AOT๋กœ ์•ฑ์„ ๋นŒ๋“œํ•˜๋ฉด ์ด ์ •ํ™•ํ•œ ๋ฌธ์ œ์— ๊ฑธ๋ ค ๋„˜์–ด์งˆ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ€์ด๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

(๋ˆ„๊ตฐ๊ฐ€ RouterLinkStubDirective ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ฐพ๋Š” ๊ฒฝ์šฐ)
_"๋”๋ฏธ" ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._

/**
 * Needed so that `aot` build is working. But it isn't used throughout our tests and/or app.
 */
@NgModule({
    imports: [
        AppModule
    ],
    declarations: [
        RouterLinkStubDirective,
        RouterOutletStubComponent
    ]
})
export class FakeRouterModule {
}

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค:
export abstract class AsyncTransform extends AsyncPipe implements PipeTransform { ... }

"์˜ค๋ฅ˜: AsyncTransform ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"

๋ชจ๋“ˆ์— ์ถ”๊ฐ€ํ•ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ˜„.
"๋น„์ถ”์ƒ ์ƒ์„ฑ์ž ์œ ํ˜•์— ์ถ”์ƒ ์ƒ์„ฑ์ž ์œ ํ˜•์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

์ด๊ฒƒ์€ ์ผ๋ถ€ ํด๋ž˜์Šค์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: AppGlobalModalComponent ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

export class CustomGlobalModalComponent extends AppGlobalModalComponent {}

@gestj @Phmager ๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๋”๋ฏธ ๋ชจ๋“ˆ์ด ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ฝค ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ์ˆ˜์ •์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํŒจ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ npm lib๋กœ ์ด๋™ํ•˜๊ณ  tsConfig์—์„œ node_modules๋ฅผ ๋ฌด์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐฐ๋Ÿด ํŒŒ์ผ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. node_modules ๋‚ด๋ถ€์—์„œ ํ•„์š”ํ•œ ๊ฐ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ๋Ÿด์„ ๊ฐ€๋ฆฌํ‚ค์ž ๋งˆ์ž ๋™์ผํ•œ ๋ฐฐ๋Ÿด์— ์žˆ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์— ๋Œ€ํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ๋ฉ‹์ง„ ๋ฐฐ๋Ÿด ํŒŒ์ผ์„ ์ฃฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ ์–ด๋„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์ด ์˜ค๋ฅ˜๊ฐ€ ๊ฒฝ๊ณ ๋กœ ๊ฐ•๋“ฑ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ Angular ํŒ€์—์„œ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Angular๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ 1๋…„ ๋™์•ˆ ์ด๋Ÿฌํ•œ ๋ชจ๋“  Angular2+ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋จธ๋ฆฌ๋ฅผ ์“ฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ํ›„ ๋ฐœ๊ฒฌํ•œ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1- Angular๋Š” ๋ฐฉ๋Œ€ํ•˜๊ณ  ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? AOT ๋ฐ LazyLoading์„ ์‚ฌ์šฉํ•˜๊ณ  ๋ฌผ๊ฑด์„ gzip์œผ๋กœ ์••์ถ•ํ•˜์‹ญ์‹œ์˜ค.
2- ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ lazyLoad ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”, ๊ฒฝ๋กœ๋ฅผ ์ง€์—ฐ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ฑ์ด ๋ฐฉ๋Œ€ํ•˜์ง€๋งŒ ํŽ˜์ด์ง€๊ฐ€ ํ•˜๋‚˜๋ฟ์ธ ๊ฒฝ์šฐ 8mg ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ธฐ์‹ญ์‹œ์˜ค.
3- AOT๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ ?? AOT๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ณ  ์ค€์ˆ˜ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋งŽ์€ javascript/es6 ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•„๋งˆ๋„ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
4- AOT๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ž, ์ด์ œ ์ตœ์ข… ๋ฒˆ๋“ค์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์ด์ œ @angular/compiler์— AOTed๊ฐ€ ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋”ํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํฝ๋‹ˆ๋‹ค.

5-Angular2+ ํ˜œํƒ์˜ ์ผ๋ถ€๋กœ ์ด์ œ gzip์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ž๋˜ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ Angular๊ฐ€ ๋ฐฉ๋Œ€ํ•˜๋ฏ€๋กœ ๋” ์ž˜ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Angular2 ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์œผ๋กœ gziping์„ ํŒ๋งคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

@xe4me ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋น„๋‚œ๋ณด๋‹ค๋Š” ๋‹น๋ฉดํ•œ ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ์ด ์Šค๋ ˆ๋“œ์—์„œ ๊ณ„์† ๋…ผ์˜ํ•˜์‹ญ์‹œ์˜ค.

https://github.com/AngularClass/angular2-webpack-starter ์˜ build:dev ๋Š” ํ•จ์ˆ˜ ์ •์˜์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ฌธ์ž์—ด์„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๊ณ  build:aot ๋Š” ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ ๋นˆ๋ฒˆํ•œ AOT ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น์‹ ๋„ ์ž‘๋™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ํŒŒ์ดํ”„๊ฐ€ ํฌํ•จ๋œ MapPipes.ts๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„ ์ค‘ ํ•˜๋‚˜๋Š” ๋‚ด ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด @NgModule ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ "์„ ์–ธ:" ๋ถ€๋ถ„์— ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด ์ดˆ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์„ ๋“ฑ๋กํ–ˆ๊ณ (์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ) ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ๋„ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ชจ๋“ˆ์„ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

extends NgClass ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์†์„ ์ œ๊ฑฐํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@DzmitryShylovich @kirjai ์ด๊ฒƒ์€ spec ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ผ ๋•Œ TestComponents ์—๋งŒ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ํŒŒ์ผ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‚ด๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, ์ด๊ฒƒ์€ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ AOT์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” JIT์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค ์™ธ์— ์ด๊ฒƒ์— ๋Œ€ํ•ด ํ•  ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์•ฝ 6๊ฐœ์˜ ๋ฌธ์ œ).

@cwmrowe ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์‚ฌ์–‘ ํŒŒ์ผ์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์€ ์†”์งํžˆ ๊นจ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋™์ผํ•œ ํ•ต์‹ฌ Angular 2 ์•ฑ์—์„œ 2๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์˜ ์ด๋ฆ„์„ ๋”ด 2๊ฐœ์˜ ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. some-domain.com ๋ฐ some-other-domain.com ์ž…๋‹ˆ๋‹ค. ์•ฑ์€ 2๊ฐœ์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋™์ผํ•˜๋ฉฐ ์•ฝ๊ฐ„์˜ ์Šคํƒ€์ผ๊ณผ ์ผ๋ถ€ ์‚ฌ์†Œํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ํด๋ผ์ด์–ธํŠธ A์šฉ์œผ๋กœ ์•ฑ์„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๊ณ  ๋‚˜์ค‘์— ํด๋ผ์ด์–ธํŠธ B์šฉ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ฝ”๋“œ ํ•œ ์ค„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒํผ ์‰ฝ์Šต๋‹ˆ๋‹ค.

import {CustomModules} from './some-domain.com';
// import {CustomModules} from './some-other-domain.com';

๋‚˜๋„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹ถ์€ ๋„๋ฉ”์ธ์˜ ์ฃผ์„์„ ์ œ๊ฑฐํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ƒ์† ๋ฐ ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ค ํ•ด๊ฒฐ์ฑ…๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์žฅํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JIT์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ AOT์—์„œ๋Š” ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ๋ชจ๋“ˆ์—์„œ ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” oop ๋””์ž์ธ ํŒจํ„ด์„ ํ”ผํ•˜๊ณ  ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

@jabaa ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ @Component ์ฃผ์„ ์ œ๊ฑฐ

@DzmitryShylovich @Component ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ ๋Œ€์‹  ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋ชจ๋“  ์ฃผ์ž… ๊ฐ€๋Šฅ ์š”์†Œ๋ฅผ ์ฃผ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์™€ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ชจ๋“  ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ๋”๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋ชจ๋“  ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋”๋ฏธ ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€ ๋”๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@jabaa ์–ด๋–ค ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ? ์ƒ์„ฑ์ž๋Š” @Component ์— ๊ด€๊ณ„์—†์ด ์ƒ์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bigjetplane ์–ด๋””์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ @Component ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ DI๋Š” Angular ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ข…์†์„ฑ์ด ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Angular 4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@jabaa jit ๋˜๋Š” aot ๋˜๋Š” ๋‘˜ ๋‹ค๋กœ ๊ณ ์žฅ ๋‚ฌ์Šต๋‹ˆ๊นŒ?

@bigjetplane ์—ฌ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ํ”Œ๋Ÿฐ์ปค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด jit์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Can't resolve all parameters for App: (?).

๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž์™€ ์ฃผ์ž…์ด ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ผ๋ถ€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์˜ˆ์ œ๋Š” ot์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. att์™€ jit์˜ ์ฐจ์ด๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” jit์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋Š” ot์™€ ํ•จ๊ป˜ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์˜ค๋ฅ˜์™€ ๊ฒฝ๊ณ ๊ฐ€ ์—†๋Š” jit์œผ๋กœ ํ•œ ์ฃผ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ฃผ ์ดํ›„์—๋Š” ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ์›ํ•˜๊ณ  ์•„๋ฌด๋ฐ์„œ๋‚˜ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ot ์˜ค๋ฅ˜๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” jit์šฉ ์Šค์œ„์น˜๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. jit ๋นŒ๋“œ๋Š” 10-20์ดˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. aot ๋นŒ๋“œ์—๋Š” 25๋ถ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@tbosch ์ด๊ฒƒ์„ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ง€๋‚œ๋ฒˆ ๋ฐฉ๋ฌธ ์ดํ›„๋กœ ๊ฝค ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์ผํ™”๋ฅผ ๋“ค๋ ค์ค€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ์ €ํฌ์—๊ฒŒ ์ตœ์‹  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” 2๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ–ˆ์ง€๋งŒ package.json์— ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€๋œ ๋‚ด๋ถ€ ๊ฐ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ๊ตฌ์„ฑ ์š”์†Œ ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” AOT ์ œํ’ˆ ๋นŒ๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ์•„๋ž˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

ERROR in Cannot determine the module for class FullPageErrorComponent in C:/users/amra6003/projects/git/refadmintoolui/n ode_modules/refcommonui/src/app/component-library/error/error.component.ts! Cannot determine the module for class SelectCountryComponent in C:/users/amra6003/projects/git/refadmintoolui/node_modul es/refcommonui/src/app/component-library/select-country/select-country.component.ts! Cannot determine the module for class DateRangeSelectorComponent in C:/users/amra6003/projects/git/refadmintoolui/node_m odules/refcommonui/src/app/component-library/date-range-selector/date-range-selector.component.ts!

๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋„ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์Šคํ… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Angular ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋นŒ๋“œ์—์„œ ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ์™ธํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ gestj(์Šคํ… ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„ ์–ธ๋œ ๊ฐ€์งœ ๋ชจ๋“ˆ ์ •์˜)์—์„œ ์ œ์•ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์Šคํ… ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ whatever.component.spec.ts spec.ts ์ ‘๋ฏธ์‚ฌ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ tsc๋Š” ์ด ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋ฏ€๋กœ(tsconfig์—์„œ ์ œ์™ธ๋œ ๊ฒฝ์šฐ) ngc์—์„œ๋„ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ ngtools/webpack์˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ‹ฐ์ผ“์€ https://github.com/angular/angular-cli/issues/6228 ์—์„œ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค.


์šฐ๋ฆฌ ํšŒ์‚ฌ๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์žฌ๋ฏธ. ์ตœ๊ทผ ์‹œ์Šคํ…œ์„ v2.4.10์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋Š” ์‹œ๋„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ModuleNotFoundError: Module not found: Error: Can't resolve '../../../../../../../../$_gendir/src/components/spinner/component.ngfactory'

ํ˜„์žฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋กœ๊น…ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์›๋ž˜ ํ‹ฐ์ผ“์„ ์—ด์—ˆ๋˜ ์˜ค๋ฅ˜์™€ ์„ฌ๋œฉํ•  ์ •๋„๋กœ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ๋” ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ ํ•„์š”ํ•œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๊ณ (์ธ๋ฑ์Šค์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ index.ts ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ) ๋ชจ๋“  ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ node_modules๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด node_modules ํด๋”์˜ ๋ชจ๋“  ๊ฐ๋„ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง€๋„๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ชจ๋“ˆ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค!

@swimadude66 , ์˜ˆ, ์šฐ๋ฆฌ๋Š” https://github.com/WealthBar/a2d3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ ์š”์†Œ(์ง€์‹œ๋ฌธ๋งŒ)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ AoT ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ ์‹œ AoT ๋นŒ๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@chrisnicola ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— AoT๋กœ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ž์ฒด ๋ชจ๋“ˆ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์€ ts ํŒŒ์ผ์ด๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ํŒŒ์ผ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ๊ฒƒ์ด @ngtools/webpack ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ webpack์— ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

์ด ํ‹ฐ์ผ“์˜ ์›๋ž˜ ์˜ค๋ฅ˜๋„ index.ts ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ v2.1.1๊นŒ์ง€ "์ˆ˜์ •"๋˜์—ˆ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋” ์ด์ƒ v2.4.10์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„, ๋„ค, ๋ฌธ์ œ๋ฅผ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ NPM์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ์ ํŠธ์— ๋กœ์ปฌ TS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋ชจ๋“ˆ์ด์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ AoT ๋นŒ๋“œ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์ œ์™ธํ•˜๋Š” AoT ๋นŒ๋“œ ํŠน์ • tsconfig.json ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๋ณด๋‚ผ ๋•Œ ๋ฌธ์ œ(๋ฐ ์†”๋ฃจ์…˜)๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด i18n ๋Œ€์ƒ์„ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ฐฉ๊ธˆ ๋ชจ๋“ˆ์„ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฐ˜๋“œ์‹œ ๋‚ด๋ณด๋‚ด๊ธฐ๋„ ํ•˜์„ธ์š”):

@NgModule({ declarations: [MyUnusedComponent] })
export class IgnoreModule {}

์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” i18n์„ ํ•ดํ‚นํ•œ ๋ฏธ์‚ฌ์šฉ ๊ตฌ์„ฑ ์š”์†Œ์˜€์Šต๋‹ˆ๋‹ค.
i18n ๋„๊ตฌ์—์„œ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@Component({
    template: `
        <div i18n="some context@<strong i="13">@some</strong> key">some text to be translated</div>
    `
})
export class LocalisationComponent {}

๋‹ค์‹œ IgnoreModule ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@NgModule({ declarations: [LocalisationComponent] })
export class IgnoreModule {}

@UtopianStorm ์€ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. "UnusedModule"์„ ๊ฐ–๋Š” ๊ฒƒ์€ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ค์šธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฐํฌ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์†Œ์Šค ํŒŒ์ผ์˜ ์ „์ฒด ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Phmager ์ถ”์ƒ ๊ตฌ์„ฑ ์š”์†Œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋จธ๋ฆฌ์นด๋ฝ์„ ๋ฝ‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@swimmadude66 ํ™•์‹คํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ ์—์„œ ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ์˜ค๋ฅ˜๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๊ธฐ์ˆ ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ™•์žฅ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ๋ฒˆ๋“ค์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ๊ทธ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ์š”? Angular์˜ ์ƒํƒœ์—์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ด๋ฏธ ์‚ฌ์–‘ ํŒŒ์ผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  node_modules ํด๋”์˜ ๋‚ด์žฅ์— ์ง์ ‘ ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊น”๋”ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ ์–ด๋„ ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ํ‹ฐ์ผ“์„ ์—ด์—ˆ๋˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒํŠธ๋„ˆ ํŒ€์ด ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ๊ตฌ์„ฑ ์š”์†Œ ๋ชฉ๋ก์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์—„๊ฒฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ 2๊ฐœ์˜ ์ „์ฒด ์•ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ํƒ€ํ˜‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Angular๋Š” ์ด๋ฏธ ๊ฝค ํฌ๋ฉฐ, ์ž์‹ ์˜ ๋…๋‹จ์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ „์ฒด ๋ชจ๋“ˆ์„ ๋ฐฐ์†กํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@swimmadude66 ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค . ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ง์ ‘ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต์œ ํ•  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ์„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ด์ œํ•ด์•ผ ํ–ˆ๋˜ ๋ชจ๋“  ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€๋‚˜์น˜๊ฒŒ ์—„๊ฒฉํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ - ์ž ์žฌ์ ์œผ๋กœ dusins.

๊ณต์œ  ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ƒ๋‹นํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ชจ๋“ˆ์ด ์•ฑ์—์„œ ๊ฐ€์žฅ ํฐ ๋ชจ๋“ˆ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ƒํ™ฉ์ด 100% ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ง€์ง€๋ฐ›์„ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์†”์งํžˆ ์ด ํ‹ฐ์ผ“์ด ์•„๋ฌด๋ฐ๋„ ๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ง€์ผœ๋ณธ 5๊ฐœ์›” ํ›„, ์šฐ๋ฆฌ๋Š” ๊ณต์œ  ์ฝ”๋“œ ์ €์žฅ์†Œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋‹ค๋ฅธ ์˜ต์…˜์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@swimmadude66 ๋‹˜ ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์€ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์นœ์• ํ•˜๋Š” Angular ํŒ€, ์ด์— ๋Œ€ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@DzmitryShylovich ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” mock.ts ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ œ์™ธํ•ฉ๋‹ˆ๊นŒ? tsconfig.app.json , tsconfig.json ๋ฐ tsconfig.ng-cli.json ์— ๋„ฃ์–ด ๋ณด์•˜์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜‘๊ฐ™์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉด - ์šฐ๋ฆฌ๋Š” ๋กค์—…์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ถ๊ทน์ ์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์–ต์ œํ•ด์ฃผ์„ธ์š”! ๊ทธ๊ฒƒ์€ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ด๋ฉฐ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ ๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค๋Š”๋ฐ, ๋„ˆ๋ฌด ๋‹ต๋‹ตํ•˜๋‹ค.

@mlakmal ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐํƒ€ ์‚ฌ์šฉ์ž

export class CustomGlobalModalComponent extends AppGlobalModalComponent {}

$ AppGlobalModalComponent @Component ์ฃผ์„์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ $ NgModule AppGlobalModalComponent (์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์˜ ์ง€์‹œ๋ฌธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  AOT ์ปดํŒŒ์ผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค. ์ด ๋ชจ์˜ ์ง€์‹œ๋ฌธ์„ ์ผ๋ฐ˜ ๋ชจ๋“ˆ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ "freq1: low" ํƒœ๊ทธ๊ฐ€ AoT๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๊ณ ํ†ต์Šค๋Ÿฌ์›Œ ์‚ฌ๋žŒ๋“ค์ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋ฌธ์ œ๊ฐ€ ํ•ต์‹ฌ Angular ๊ธฐ์—ฌ์ž๋กœ๋ถ€ํ„ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „ํ˜€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์กฐ๊ธˆ ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ตฌ์ฒด์ ์œผ๋กœ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„ ์ง€์ • ํŒจํ„ด(์˜ˆ: .spec.ts , .abstract.ts , .stfu-aot.ts )์ด ์žˆ๋Š” ๊ฒฝ์šฐ AoT์— ๋Œ€ํ•ด ๋ณ„๋„์˜ tsconfig.json ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ngc -p tsconfig-aot.json . ์ด ํŒŒ์ผ์—์„œ "exclude": ["./app/**/*.stfu-aot.ts"] ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ฐ€์‹  ์ผ์ด์ง€๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์œ„์˜ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ƒ์†๋˜๋Š” abstract ํด๋ž˜์Šค์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ผ :(

๋ฐฉ๊ธˆ ์ด๊ฒƒ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. aot๋ฅผ ๋นŒ๋“œํ•˜๋ฉด ๋‹ค๋ฅธ ์•ฑ์—์„œ ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์ค‘ ์ผ๋ถ€๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค์— @Component ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค.

// just remove this 
@Component({
    providers: []
});
@Injectable()
export class serviceClass {}

์„œ๋น„์Šค์— ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ @Component๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ด ์†”๋ฃจ์…˜์„ ํ‘œ์‹œํ•˜๋„๋ก Angular ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด @Component๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ƒ์„ฑ์ž์—์„œ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
constructor(@Inject(ExampleService) private exampleService: ExampleService)

์–ด๋–ค ์„œ๋น„์Šค์—๋„ @Component() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. @Injectable()

FWIW์—๋Š” XYZComponent ์•ฑ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์žฅํ•˜์ง€๋งŒ ์‚ฌ์–‘์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” MockXYZComponent ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐ™์€ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ AppModule ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ).

์ด๊ฒƒ์€ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

@alastair-todd ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @Component() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ƒ์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "ํ›„์†์ž"์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์†ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด - ์‘๋‹ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํŠน๋ณ„ํ•œ TestModule์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ํ˜„์žฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

@tytskyi ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ƒ์†์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋ณ€๊ฒฝ๋˜์—ˆ๋‚˜์š”?

์œ ์Šค ์ผ€์ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์กฐ๋กฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์„ ํƒ๊ธฐ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด @Component ์ง€์‹œ๋ฌธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                AppModule
            ]
        }).overrideModule(AppModule, {
            remove: {
                declarations: [SelectionToolComponent]
            },
            add: {
                declarations: [MockSelectionToolComponent]
            }
        }).compileComponents();

๊ทธ๋Ÿฌ๋‚˜ OP AOT ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ AOT ์ปดํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์—ด์„ฑ์ ์ด๊ฑฐ๋‚˜ ์‚ฌ์–‘์„ ๋ฌด์‹œํ•˜๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ๋ชจ๋“  ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋”๋ฏธ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ์•„๋ฌด ๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ AoT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ 2016๋…„ 12์›”์— ์—ด๋ ธ๊ณ  ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์ด์ƒํ•˜๊ณ  ๋ถ€๋„๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ „์ฒด ์•ฑ์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋“œ๋œ 4๊ฐœ์˜ ๋ชจ๋“ˆ๊ณผ 60๊ฐœ ์ด์ƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚˜์—๊ฒŒ ์ด์ƒํ•œ ์ข…๋ฅ˜์˜ ์ง€์—ฐ ๋กœ๋“œ ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜์˜ ์„ ์–ธ์— ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ(์˜ค๋ฅ˜๊ฐ€ ์‹œ์‚ฌํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ผ)์— ๋Œ€ํ•ด์„œ๋งŒ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ์ผ๋ถ€ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€์ธ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ

Angular์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tsconfig์— ์ „๋‹ฌํ•œ ํŒŒ์ผ ์„ธํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑฐ๊ธฐ์—์„œ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋ฉด ์ด ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑด ์ •๋ง ์งœ์ฆ๋‚˜๋„ค์š” :(

@alastair-todd ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์•Œ๋ฆผ์—์„œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ -
๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ƒ์†์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@robwormald ์˜ ๋‹ต๋ณ€ ๋ณด๊ธฐ

Angular์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tsconfig์— ์ „๋‹ฌํ•œ ํŒŒ์ผ ์„ธํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑฐ๊ธฐ์—์„œ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋ฉด ์ด ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ selection-tool.component.mock.ts ์™€ ๊ฐ™์ด ๋ชจ์˜ ํŒŒ์ผ ์ด๋ฆ„์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ์„ ํ†ตํ•ด ์ œ์™ธ

"exclude": [
    //... other excludes
    "**/*.component.mock.ts"
]

์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

+8๊ฐœ์›”์ด ์ง€๋‚ฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ ERROR in Cannot determine the module for class PasoFooterComponent

Angular ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์Šค์Šค๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด. ์ด๊ฒƒ์€ ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์„ฑ๊ฐ€์‹ฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋›ฐ์–ด
๋˜ ์–ด์ œ.

๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์„ ์œ„ํ•ด?

2017๋…„ 8์›” 9์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 2:40 Leonardo Vidal [email protected]
์ผ๋‹ค:

+8๊ฐœ์›”์ด ์ง€๋‚ฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
PasoFooterComponent ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ ๊ฒฐ์ •

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/angular/angular/issues/13590#issuecomment-321082545 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AEM6r7FOTLcicWJN3Oijw2pwKTLGL6cFks5sWM61gaJpZM4LSAwS
.

@samirotiv ๋ณต์ œํ’ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
@robwormald ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด

Angular์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tsconfig์— ์ „๋‹ฌํ•œ ํŒŒ์ผ ์„ธํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑฐ๊ธฐ์—์„œ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋ฉด ์ด ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ts๊ฐ€ ๋‚ด ์•ฑ์„ ์–ด๋–ป๊ฒŒ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

"tsc": "rimraf out-tsc/app && tsc -p ./src/tsconfig.app.json",

๊ทธ๋ฆฌ๊ณ  "files" tsconfig ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— typescript๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋œ ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค(๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—†์Œ)์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด +1์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ ์ง€์—ฐ?

์ด๊ฒƒ์€ ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค.
์ด ์ œํ•œ์€ ๋” ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ๋ฒ„์ „์˜ Angular๋ฅผ ์ง€์›ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด HttpClient (Angular >= 4.3 ์‚ฌ์šฉ์ž) ๋ฐ Http (Angular < 4.3 ์‚ฌ์šฉ์ž)์— ๋Œ€ํ•œ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€

ํ˜„์žฌ ngc ๋Š” ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค! ๋˜๋Š” ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ชจ๋“  ์Šคํ…/๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ .mock.ts ํ™•์žฅ์ž๋กœ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด tsconfig.app.json "exclude" ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

...
  "exclude": [
    "test.ts",
    "**/*.spec.ts",
    "**/*.mock.ts"
  ]
...

AOT๋Š” ์ด์ œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ  AoT ์ปดํŒŒ์ผ ์ค‘์— ํ•ด๋‹น ๋ฌธ์ œ๋กœ ์ธํ•ด ํ™”๋‚œ ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ๋กœ npm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์  ์žฅ... ์œ ์ผํ•œ ์†”๋ฃจ์…˜ atm์€ ํ˜ธ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ์ข…์˜ UnusedComponentsModule์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ NO_ERRORS_SCHEMA ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋งน์„ธํ•˜๊ณ  ์ด๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋‘ ๋ชจ๋“ˆ์—์„œ ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(# ๊ด€๋ จ 10646).

๋‚ด ํ˜„์žฌ ๋ชจ๋“ˆ:

import {NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
import {CommonModule} from '@angular/common';
import {ReceiverPageComponent} from 'cb-web-platform';

@NgModule({
  imports: [
    CommonModule,
  ],
  declarations: [
    ReceiverPageComponent
  ],
  schemas: [
    NO_ERRORS_SCHEMA // IMPORTANT: need that for AoT compilation
  ]
})
export class UnusedComponentsModule {
}

์ด๊ฒƒ์€ ์ •๋ง๋กœ ๊ฒฝ๊ณ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ngmodule์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์™€ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ฝ”๋“œ๋ผ๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ NPM ๊ฐ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์ผ๋ถ€ ๋ฐ๋“œ ์ฝ”๋“œ)์˜ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ์ •๋ง ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. :)

์˜ค๋ฅ˜ ๋Œ€์‹  ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” ngModule์— ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ lang์„ ์ถ”์ถœํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋ณ„ ํด๋”๊ฐ€ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํด๋”๊ฐ€ ์žˆ๋Š”๋ฐ xi18n์œผ๋กœ ์žฌ์ •์˜๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค Cannot determine the module for class... ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ ํŒŒ์ผ์— ์ •์˜๋œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์žฌ์ •์˜๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋กœ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฃผ์„ ์›์ธ. ์ ์–ด๋„ ํŒŒ์ƒ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ฃผ์„์„ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์•ผ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Xesenix ๋Š” ์ตœ์†Œํ•œ ์˜ต์…˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ • ๋ชจ๋“ˆ = false / true์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฐ”๋‚˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” 2017๋…„ 11์›” 1์ผ์— ๋Œ์•„์˜ฌ ๊ฒƒ์ด๋‹ค.

๋‚˜๋Š” ๋‚˜์˜ ๋ฐ˜ํ™˜ ํ›„์— ๋‹น์‹ ์˜ ๋ฉ”์‹œ์ง€์— ๋Œ€๋‹ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธด๊ธ‰ํ•œ ๊ฒฝ์šฐ ์ด๋ฉ”์ผ ์‚ฌ๋ณธ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.
๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋Š” [email protected] ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด
[email protected]. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์ง์›์ด ๊ท€ํ•˜์˜ ์ด๋ฉ”์ผ์„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋™์˜ํ•˜๊ธฐ.

์ฐธ๊ณ : ์ด๊ฒƒ์€ "Re:
[๊ฐ๋„/๊ฐ๋„] Angular2 AOT ์ปดํŒŒ์ผ - "๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
for class (... ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ)" (#13590)" ์ „์†ก๋จ
2017๋…„ 10์›” 23์ผ 08:13:17

์ด๊ฒƒ์€ ๊ท€ํ•˜๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ์œ ์ผํ•œ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค.
๊ทธ ์‚ฌ๋žŒ์€ ๋ถ€์žฌ์ค‘์ด๋‹ค.

๊ฑฐ์˜ 1๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? AOT๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ๋จธ๋ฆฌ๋ฅผ ์žก์•„๋‹น๊ฒผ์ง€๋งŒ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฒฝ๋Œ ๋ฒฝ์— ๋ถ€๋”ชํ˜”์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์— ๋Œ€ํ•ด @rahul-sivalenka-wtc์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
์„ค๋ช…ํ•˜์‹  ๋Œ€๋กœ tsconfig.app.json "**/*.mock.ts" ๋ฅผ ์ œ์™ธํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. โค๏ธ

๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š

๋‚˜๋Š” ๋˜ํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” dodule์„ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ์ž˜๋ชป ์ž…๋ ฅ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์†”๋ฃจ์…˜? (๊ตฌ์„ฑ์š”์†Œ angular 5์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Œ)

https://stackoverflow.com/questions/47119135/cannot-determine-the-module-for-component-angular-5

severity3: broken ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋นŒ๋“œ ๋Œ€์ƒ๊ณผ ๋‹คํ˜•์„ฑ ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ(๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์œ„์— ๋‚˜์™€ ์žˆ์Œ) ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ณต์žกํ•œ ๋นŒ๋“œ ์„ค์ • ์—†์ด ๋นŒ๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ง ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? IgnoreModule์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ด์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ์˜ ํ•ด๊ฒฐ์ฑ…์€ transform ํ•จ์ˆ˜๋ฅผ @ngtools/webpack ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. @ngtools/webpack๋Š” ์ „์ฒ˜๋ฆฌ ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๊ณ  ifdef ๋Š” ๋‹ค์–‘ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์„ค์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ, ๋งค์šฐ ๋ชป์ƒ๊ฒผ์ง€๋งŒ ๊ธฐ๋Šฅ์ ์ž…๋‹ˆ๋‹ค.

๋จผ์ € app.module.ts์—์„œ ๋ชจ๋“  ๊ฐ๋„ ์ข…์†์„ฑ์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค์‹ญ์‹œ์˜ค.

` ---------------- ์ฒซ ๋ฒˆ์งธ ์ข…์†์„ฑ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ -----------------------
'@angular/platform-browser'์—์„œ { BrowserModule } ๊ฐ€์ ธ์˜ค๊ธฐ;
"@angular/common"์—์„œ { CommonModule } ๊ฐ€์ ธ์˜ค๊ธฐ;
'@angular/core'์—์„œ { NgModule } ๊ฐ€์ ธ์˜ค๊ธฐ;
import { RouterModule, Routes } from '@angular/router';
'@angular/http'์—์„œ { HttpModule } ๊ฐ€์ ธ์˜ค๊ธฐ;
'@angular/forms'์—์„œ { ReactiveFormsModule } ๊ฐ€์ ธ์˜ค๊ธฐ;
'@angular/platform-browser/animations'์—์„œ { BrowserAnimationsModule } ๊ฐ€์ ธ์˜ค๊ธฐ;

---------- ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋น„์Šค ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ ------------------------

'./Services/apply-form-post.service'์—์„œ { ApplyFormPostService } ๊ฐ€์ ธ์˜ค๊ธฐ;
'./Services/nav-bar-color.service'์—์„œ { NavBarColorService } ๊ฐ€์ ธ์˜ค๊ธฐ;

----------------------- ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ ----------------------- -

'./app.component'์—์„œ { AppComponent } ๊ฐ€์ ธ์˜ค๊ธฐ;
'./components/header/header.component'์—์„œ { HeaderComponent } ๊ฐ€์ ธ์˜ค๊ธฐ;
'./components/career/career.component'์—์„œ { CareerComponent } ๊ฐ€์ ธ์˜ค๊ธฐ;
import { HomeComponent } from './Components/home/home.component';`

์–ด๋–ป๊ฒŒ ๋“  ์ด๊ฒƒ์€ ์ƒ์‚ฐ ๋ชจ๋“œ์—์„œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” AOT ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@KarthikSamyak ์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“ˆ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ๋ชจ๋“  ๋ชจ๋“ˆ์—์„œ ์ œ์™ธ๋œ ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฌด์‹œํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ์ด์–ด์•ผ ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด 1๋…„์ด ๋„˜๊ฒŒ ๊ฑธ๋ ธ๊ณ  ์ตœ๊ทผ ๋กœ๋“œ๋งต์—์„œ pri_col1์—์„œ pri_col2๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‘๋‹ต์ด ์ „ํ˜€ ์—†๋Š” Angular ํŒ€์— ์ ์  ๋” ์ขŒ์ ˆ๊ฐ์„ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” ๊ฒฐ๊ตญ ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์™„์ „ํžˆ ํฌ๊ธฐํ•˜๊ณ  ๋Œ€์‹  ์ˆ˜๋™์œผ๋กœ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Angular ํŒ€, ์ด ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ์ฝ์œผ์‹ ๋‹ค๋ฉด "ignoreUnusedComponents"์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

์ข‹์•„, ๋‚˜๋Š” https://github.com/angular/angular/blob/master/packages/compiler/src/aot/compiler.ts#L605 @tbosch ์ด๋ด, ์—ฌ๊ธฐ๋ฅผ ๋„์™€์ฃผ๊ณ  ๊ทธ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ๋Œ€๋กœ ๊ฒฝ๊ณ ๊ฐ€ ๋  ๊ฒƒ์ธ๊ฐ€? ํ•ด๋‹น AoT ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•œ ๊ฒฝ๊ณ ๋Š” ๋ณผ ์ˆ˜ ์—†์œผ๋ฉฐ ์˜ค๋ฅ˜๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ฌธ์ œ๋Š” ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‚ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋Š” https://github.com/angular/angular/issues/13590#issuecomment -331820496์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ฑ์„ ์ •๋ง ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ํ•„์š”ํ•  ๋•Œ ์ด์ƒํ•œ ๊ฒƒ์„ ๊ต์ฒด/ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ/์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋‚ด๋ถ€์˜ 1x ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ต์ฒดํ•˜๋ ค๋ฉด ์ƒˆ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ์—ฌ์ „ํžˆ ์›ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

import { HeaderComponent, SidebarComponent } from '@mylibs/layout';
import { FooterComponent } from './footer.component';

@NgModule({ declarations: [ HeaderComponent, SidebarComponent, FooterComponent ] })
export class MyLayoutModule { }

@NgModule({ imports: [ MyLayoutModule ] })
export class AppModule { }

์˜ค๋ฅ˜: `HeaderComponent๊ฐ€ lib/module.ts ๋ฐ app/module.ts ์˜ 2๊ฐœ ๋ชจ๋“ˆ์—์„œ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  ๊ฒฝ๊ณ ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์ ์–ด๋„ ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :(

๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค - ์ด ๋ฌธ์ œ์˜ ์ƒ์ผ์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค :)

1๋…„ ํ›„, ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ง๋„ ์•ˆ๋˜๋Š”.

๋ง ๊ทธ๋Œ€๋กœ์ด ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ๋ฉ”์ธ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ธฐ๊ปํ•ด์•ผ ๊ฒฝ๊ณ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์„ธ์š”. ๊ฒฝ๊ณ ๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค!
Angular 5ot ๋นŒ๋“œ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ๊ฒฝํ—˜์€ ํ›Œ๋ฅญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ํ† ๋ก  ํ›„ https://gitter.im/angular/angular?at=5a551f565a9ebe4f756843b2 ์šฐ๋ฆฌ๋Š” ๋ชจ๋“ˆ์ด ์ปดํŒŒ์ผ ์ปจํ…์ŠคํŠธ์ผ ๋ฟ์ด๊ณ  ๋ฌผ๊ฑด์„ ๋ชจ์œผ๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ๋‹น ํ•˜๋‚˜์˜ Component๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. .

์ด๊ฒƒ์€ ์—ญ์‚ฌ์ฑ…์˜ ํฌ๊ธฐ๋ฅผ ์ทจํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@Xesenix ... ์ปจํ…์ŠคํŠธ์™€ ์กฐ์ง์€ ์ „์ฒด์˜ ๋‘ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์— ๊ฐ‡ํžŒ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค์น˜ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const replace = require('replace-in-file');
const filesToFix = [
    {
        files: 'node_modules/@angular/compiler/esm2015/compiler.js',
        from: ['throw syntaxError(messages.join(\'\\n\'));'],
                // Actually this does nothing , just leave it blank should do
        to: [`console.warn(\'Angular compiler warning\');\n\t\tconsole.warn(messages.join(\'\\n\'));`]
    }
]

filesToFix.forEach((i) => {
    try {

        const changes = replace.sync(i);
        if (changes.length > 0) {
            console.log('Modified files:', changes.join(', '));
        }
    }
    catch (error) {
        console.error('Error occurred:', error);
    }
});

๊ฐ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” tsconfig์˜ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ _tsconfig.app.json_ ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ํŒŒ์ผ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ
"exclude": [ "test.ts", "**/*.spec.ts", "**/*.mock.component.ts", ]

@andela-andrewmakenzi ์ด๊ฒƒ์€ ์ด ๊ฑฐ๋Œ€ํ•œ ์ฑ„ํŒ…์—์„œ ๋” ๋‚˜์•„๊ฐ€ ์ด์ „์— ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ „์ฒด ๋‚ด์šฉ์„ ์ฝ์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ๋ถ€๋„๋Ÿฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ๋Ÿด ํŒŒ์ผ(index.ts)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ๋Ÿด ํŒŒ์ผ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ๋ฐฐ๋Ÿด ํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“ˆ์— ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ์š”์ ์ธ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํŒจํ‚ค์ง•ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๋•Œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์กฐ์ง(์ €์™€ ๊ฐ™์€)์ด ๊ณตํ†ต ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์ฃผ์–ด์ง„ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด ์Šฌํ”„๊ฒŒ๋„ TSC์˜ ์ œ์™ธ๊ฐ€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@andela-andrewmakenzi: ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด ์ง€๊ธˆ์€ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ฌธ์ œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ( .spec)์ด๊ณ  AOT ๋นŒ๋“œ์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ์…˜์— ๊ทธ๊ฒƒ์„ ๊ฐ–๊ณ  ์‹ถ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.) ์•„๋งˆ๋„ ์ด๊ฒƒ์€ Angular์˜ ์ดํ›„ ๋ฒ„์ „์—์„œ ์–ด๋–ป๊ฒŒ ๋“  ํ•ด๊ฒฐ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

ํ•˜์ง€๋งŒ ์ œ ๊ฒฝ์šฐ์—๋Š” NgModule์—์„œ๋„ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ์ƒˆ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ด๋ฆ„ ๊ทœ์น™์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  tsconfig.json์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹น๋ถ„๊ฐ„ ๊ทธ๋‹ค์ง€ ์œ ์พŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฑด ์ •๋ง ์›ƒ๊ธฐ๋‹ค. ๋ช‡ ๊ฐœ์˜ ํŒŒ์ดํ”„/์ง€์‹œ๋ฌธ์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ณต์œ  NPM ๋ชจ๋“ˆ์ด ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉด ์ด ๋ฉ์ฒญํ•œ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ฒฝ๊ณ ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ปดํŒŒ์ผ์„ ์ค‘๋‹จํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ž์ฒด NgModule ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ NgModule ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ๋ฌด์„ญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ( @angular/material ๊ฐ€ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ •๋ง๋กœ ๊ฐ€์ƒ์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ค‘๊ฐ„์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์งˆ ์ด์œ ๋„ ์—†์Šต๋‹ˆ๋‹ค. NgModule ๋„ ์•„๋‹ˆ๊ณ  ํŒจํ‚ค์ง€๋„ ์•„๋‹ˆ๊ณ  ์•ฑ ํŠธ๋ฆฌ ์™ธ๋ถ€๋„ ์•„๋‹Œ ... ์ฃฝ์€ ์ฝ”๋“œ๋กœ ๋ณด์ด๋Š” ๊ฒƒ.

๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด @angular/cli(1.7.0+)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด IgnoreModule๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ž์ฒด NgModule์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฒ„๊ทธ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ ๋„์šฐ๋ฏธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@sarunint ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ด ํ‹ฐ์ผ“์„ ์—ด์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํฌ๊ธฐ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ข…์† ์ง€์‹œ๋ฌธ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๋ณต์žกํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํฌํ•จ๋œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ํŠธ๋ฆฌ ์‰์ดํ‚น์—์„œ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋งค์šฐ ์„ฑ๊ฐ€์‹  ์ง„์งœ ์ด์œ ๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ์ด ํ˜œํƒ๋ณด๋‹ค ๋” ์œ„ํ—˜ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์•ฑ์— ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dborisenkowork ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ์•Š์•˜๋Š”์ง€(๋˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€) ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ @rahul-sivalenka-wtc๊ฐ€ ์ œ๊ณตํ•œ ์†”๋ฃจ์…˜์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๊ฐ๋„ 4์—์„œ ๊ฐ๋„ 5๋กœ ์ด๋™ํ•˜๊ณ  ๋ชจ๋“ˆ์—์„œ ์‹ค์ œ๋กœ ์„ ์–ธ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ์ผ๋ถ€์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@novologic-clay ๋ฌด์Šจ ์˜ค๋ฅ˜? ์Šค๋ ˆ๋“œ๊ฐ€ ๊น๋‹ˆ๋‹ค. ์›๋ž˜ ์˜ค๋ฅ˜๋ฅผ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?
Angular2 AOT ์ปดํŒŒ์ผ - "ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(... ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ)" ?

@andela-andrewmakenzi ์˜ˆ ๋ฐ ์•„๋‹ˆ์˜ค. ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•  ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜์ด์ง€๋งŒ, ๋ถˆํ‰ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. 4.3.6์—์„œ 5.2.4๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์ด๋ฉฐ angular ๋ฒ„์ „์„ ์—…๋ฐ์ดํŠธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ  ์—ฐ๊ธฐ ํ…Œ์ŠคํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ง์ „์— 4.3.6์—์„œ AOT ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. .

@novologic-clay ์ฝ˜์†” ์˜ค๋ฅ˜๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

... ์ตœ์ข… ๋ชฉํ‘œ๋Š” tsconfig.json ์˜ต์…˜ "noUnusedLocals": true ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@andela-andrewmakenzi

ERROR in : Cannot determine the module for class InlineAddComponent in /Users/claygarland/CatalsytConnect/frontend/Talon/src/app/core/component/input/inline-add/inline-add.component.ts! Add InlineAddComponent to the NgModule to fix it.

์ด๊ฒƒ์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ณ  ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ชจ๋“ˆ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

**COMPONENT:**
import {Component, Inject, Input} from '@angular/core';
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';
import {ActivatedRoute} from '@angular/router';
import {BaseForm} from '../../form/form/BaseForm';
import {FormDataService, FormDataServiceProvider} from '../../form/form/FormDataService';
import {BaseApi} from '../../../api/BaseApi';

@Component({
    selector: 'inline-add',
    templateUrl: './inline-add.component.html',
    styleUrls: ['./inline-add.component.scss'],
    providers: [
        FormDataServiceProvider
    ]
})
export class InlineAddComponent extends BaseForm {

    @Input() title = 'Entity';
    @Input() formName;

    protected service: BaseApi;

    constructor(
        protected route: ActivatedRoute,
        protected formDataService: FormDataService,
        public dialogRef: MatDialogRef<InlineAddComponent>,
        @Inject(MAT_DIALOG_DATA) public data: {
            form: string,
            title: string,
            service: BaseApi,
        },
    ) {
        super();
        this.title = data.title;
        this.formName = data.form;
        this.service = data.service;
    }

    submit() {
        super.onSubmit(res => {
            this.dialogRef.close(res.data[0]);
        });

    }

    onCancel() {
        this.dialogRef.close(false);
    }

}

**MODULE:**
import { NgModule } from '@angular/core';
import {SharedModule} from '../../../shared/shared.module';
import {InlineAddComponent} from './inline-add/inline-add.component';


@NgModule({
    imports: [
        SharedModule,
    ],
    declarations: [
        InlineAddComponent,
    ],
    exports: [
        InlineAddComponent,
    ],
    entryComponents: [
        InlineAddComponent,
    ]
})
export class FormInputsModule { }

๋˜ํ•œ ng serve์—์„œ ์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์งœ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ชจ๋“ˆ์— ์žˆ์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ TestBed์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
์ด ์˜ค๋ฅ˜๋Š” ์–ด๋ฆฌ์„์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1๋…„๋ถ€ํ„ฐ ๊ทธ๋Œ€๋กœ ํ•ด๊ฒฐํ•ด ์ฃผ์„ธ์š”.

"๋‚ด๋ณด๋‚ด๊ธฐ"๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ts๊ฐ€ ๋นŒ๋“œ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@tony-kaplan tsconfig์— noUnusedLocals๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ง™์†Œ์‚ฌ.... ํ•ต์‹ฌ ํŒ€์˜ ๋ˆ„๊ตฌ๋„ ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฑด๊ฐ€์š”?
์ง€๊ธˆ์€ exclude ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž„์‹œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒํ™ฉ์— ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ... ์ •๋ง ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค...

@gabrielalan ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ ์ด ์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ ์ด๋ฅผ ๊ฒฝ๊ณ  ๋˜๋Š” ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ๋ถ€์กฑํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค ์†Œ๋…„! ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋„ˆ๋ฌด...

@atom-morgan ์–ด๋–ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@netlander ์ด๊ฑฐ

์ •๋ง, "ํด๋ž˜์Šค DaterangepickerDirective์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๋‚˜๋„ ๋„์™€์ค„ ์‚ฌ๋žŒ? ์ด ๋ฉ”๊ฐ€์กฐ๋“œ ํฌ์ŠคํŠธ ์ดํ›„!

์ด ์ง€์นจ์— tsconfig.app.json ์ƒˆ ์ œ์™ธ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์ด ๋ฌธ์ œ ์—†์ด --aot param์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€ https://github.com/angular/angular/issues/23475
๋‚˜๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ์ง€์‹œ๋ฌธ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ๊ฒ€์‚ฌ๊ธฐ ์ง€์‹œ๋ฌธ์„ npm ํŒจํ‚ค์ง€์— ๋ฌถ์„ ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž๊ฐ€ NgModule์— ํ•„์š”ํ•œ ๊ฒ€์‚ฌ๊ธฐ๋งŒ ์„ค์น˜ํ•˜๊ณ  ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ตœ์ข… ๋ฒˆ๋“ค์— ๋ฒˆ๋“ค๋กœ ํฌํ•จ๋˜์–ด ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ๋‚ญ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@anjmao ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ด๊ฒƒ์„ ์—ด์—ˆ๋˜ ์ด์œ ์™€ ์—„์ฒญ๋‚˜๊ฒŒ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐ๋Ÿด(index.ts) ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์—์„œ 1๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ/๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์ธ๋ฑ์Šค ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋ฐฐ๋Ÿด ํŒŒ์ผ์ด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ฒฝ๊ณ ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ์œ„ํ•ด 1๋…„ ๋” ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ/์ง€์‹œ๋ฌธ/ํŒŒ์ดํ”„์˜ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์‚ฌ์šฉ ์ค‘์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ชจ๋“  ํด๋ž˜์Šค ์„ ์–ธ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋”๋ฏธ ๋ชจ๋“ˆ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‹ค์ œ ์•ฑ์—์„œ ์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ๋””์Šคํฌ์— ์กด์žฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ „:

import { NgModule } from '@angular/core';

@NgModule({
    imports: [],
    declarations: [
        MyComponent,
        MyPipe,
        MyDirective,
        ...
    ],
})
export class DummyModule {
}

์ด ๋ฌธ์ œ๋ฅผ ์•„์ง ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

"๊ฒฝ๊ณ ๋กœ ๋งŒ๋“ค๊ธฐ" ์†”๋ฃจ์…˜์ด ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ํ•ต์‹ฌ ํŒ€์˜ ๊ตฌ์„ฑ์›์ด ์ด์— ๋Œ€ํ•ด ๋…ผํ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ ๊ฒฝ์šฐ์—๋Š” NG 5, CLI ๋ฐ AOT์—์„œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ NG 6์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์ฃผ์ž…๋œ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์œ ์‚ฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  NG CLI 6.0 ๋ฐ 6.0.1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฐธ์กฐ ์ค‘ ํ•˜๋‚˜์—์„œ ํŒŒ์ผ ์ฐธ์กฐ์˜ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” index.ts๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค
export * from './dateTimePicker.component'
๋™์•ˆ:
'./datetimePicker.component'์—์„œ * ๋‚ด๋ณด๋‚ด๊ธฐ;

๋ถ„๋ช…ํžˆ NG CLI 6์€ Windows์—์„œ๋„ ๋Œ€์†Œ๋ฌธ์ž์— ๋Œ€ํ•ด ๋” ์ œํ•œ์ ์ธ ๋ฐ˜๋ฉด NG CLI 1.x๋Š” ์•ฝ๊ฐ„ ํŽธ์•ˆํ•ฉ๋‹ˆ๋‹ค.
๋ถ„๋ช…ํžˆ ๊ทธ๋Ÿฌํ•œ ์ œํ•œ์€ ํ›Œ๋ฅญํ•˜๊ณ  ์ •ํ™•ํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” Linux์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€:

Typescript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด tsconfig.json ์˜ paths ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ•ด์ƒ๋„ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „:

{
    ...
    "paths": {
        "~src/*": ["src/*", "src-gen/*"]
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { NgModule } from "@angular/core";
import { ExampleComponent } from "~src/example.component";

@NgModule({
    declarations: [
        ExampleComponent
    ],
})
export class ExampleModule {}

src ํด๋” ์•ˆ์— ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ "์žฌ์ •์˜"ํ•  ์ˆ˜ ์žˆ๋Š” src-gen ๋‚ด๋ถ€์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ src-gen ์•ˆ์— ์žˆ๋Š” (ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”) ๊ตฌ์„ฑ ์š”์†Œ์— ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€:

ํ™˜๊ฒฝ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ. ๋‚˜๋Š” ์ƒ์‚ฐ์„ ์œ„ํ•ด ๊ทธ๊ฒƒ๋“ค์„ ๋ฒ—๊ฒจ๋‚ธ๋‹ค.

const environmentComponents = production ? [] : [
  DevOnlyComponent,
];

@NgModule({
  declarations: [
    ...environmentComponents,
  ],
})
export class ExampleModule {
}

ํ™˜๊ฒฝ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด๊ฒƒ์ด ์ €๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ช

@tiagodws (์›๋ž˜ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ™•์žฅ ํฌํ•จ)์—์„œ ์„ค๋ช…ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๋นŒ๋“œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”์ปค๋‹ˆ์ฆ˜(๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ Angular CLI ํ”„๋กœ์ ํŠธ๋กœ ๊ตํ™˜๋จ)์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ต์‹ฌ ํŒ€์˜ ์—…๋ฐ์ดํŠธ/์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ์—ฐ ์ง€ 1๋…„์ด ๋„˜๋„๋ก ๋‚ด ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฐฐ๋Ÿด ํŒŒ์ผ ์‚ฌ์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ณณ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ~components/button/component ์™€ ๊ฐ™์€ TS ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ฐฐ๋Ÿด ํŒŒ์ผ์—์„œ ์ฐธ์กฐ๋˜๋ฉด throw๋ฉ๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์—ฌ์ „ํžˆ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  ๋” ๊ธด ๊ฒฝ๋กœ๋กœ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์™œ, ์˜ค ์™œ ์ด๊ฒƒ์€ ๋‹จ์ง€ ๊ฒฝ๊ณ ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋˜ํ•œ ๋ชจ๋“ˆ์— ํŠน๋ณ„ํžˆ ํฌํ•จ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ์™ธ๋˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น์— ์˜ํ•ด(๋˜๋Š” ์ ์–ด๋„ ๊ด€๋ จํ•˜์—ฌ) ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ œ์™ธ ์˜ต์…˜์€ ๋ชจ์˜ ํŒŒ์ดํ”„์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Pipe({ name: 'translate' })
export class MockTranslatePipe implements PipeTransform {
    transform(value: string): string {
        //Do stuff here, if you want
        return value;
    }
}

๋‚ด tsconfig.app.json์ด ์ด ํŒŒ์ผ์„ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค.

"exclude": [
        "test.ts",
        "**/*.mock.ts",
        "**/*.spec.ts"
    ]

๊ทธ๋Ÿฌ๋‚˜ ng-xi18n --i18nFormat=xlf2 --outFile=./assets/i18n/messages.xlf๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค.

src/test/translate.service.mock.ts์—์„œ MockTranslatePipe ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! NgModule์— MockTranslatePipe๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

๋‚ด ๋ฌธ์ œ๋Š” lol์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ์–ด 2 ๊ฐœ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋‚˜์ค‘์—๋Š” ๋ฌด๊ด€์‹ฌ์œผ๋กœ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ํ•˜๋ฉด ์ข‹์€ ์—ฐ์Šต์ด ์™„๋ฒฝํ•œ ๋‚จ์ž๋ฅผ ๋งŒ๋“ ๋‹ค! ํžˆํŠธ...
์„œ๋ช…: ๋‚˜์นด๋ชจํ†  ์‚ฌํ† ์‹œ: v

@yuezhizizhang ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ tsconfig.app.json exclude ๊ฒฝ๋กœ์— mock์šฉ glob์„ ์ถ”๊ฐ€ํ•œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์ดˆ๊ธฐ ํ‹ฐ์ผ“ ์ดํ›„ ๊ฑฐ์˜ 2๋…„ ๋™์•ˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ถ„๋…ธํ•˜๊ธฐ ์ง์ „์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ BREAKING ๋นŒ๋“œ์ธ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๋Š” ํŒŒ์ดํ”„, ์„œ๋น„์Šค ๋“ฑ์— ๋Œ€ํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ด์ƒ์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์„ ํƒํ•˜๋ฉด ๋นŒ๋“œ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์–‘ ํŒŒ์ผ์€ ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ/ํŒŒ์ดํ”„/๋“ฑ์„ ์ฐธ์กฐํ•˜์—ฌ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ํ…Œ์ŠคํŠธ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

Angular ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋ชจ์˜์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋”๋ฏธ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ •๋ง ์œ ์ผํ•œ ์˜ต์…˜์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ข‹์ง€ ์•Š์€ ํ•ดํ‚น์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋นŒ๋“œ(์ถ”์ƒ ํด๋ž˜์Šค)๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ์€ ํŒŒ์ผ์„ tsconfig.app.json ์˜ ์ œ์™ธ ์„น์…˜์— ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

.../map-elements/map-element-base.component.ts์—์„œ MapElementBaseComponent ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! NgModule์— MapElementBaseComponent๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

์ˆ˜์ž…ํ’ˆ์„ ๋‹ค์‹œ ํ™•์ธ ํ•œ ํ›„์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ัั€, 14 ะฝะพัะฑ. 2018๋…„ ะณ., 15:13 Daniel Groh [email protected] :

๋ฌธ์ œ๊ฐ€ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์‹ถ์€ ํŒŒ์ผ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
(์ถ”์ƒ ํด๋ž˜์Šค) tsconfig.app.json ๋ฐ I์˜ ์ œ์™ธ ์„น์…˜์—
์—ฌ์ „ํžˆ ์–ป์„:

์—์„œ MapElementBaseComponent ํด๋ž˜์Šค์˜ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
.../map-elements/map-element-base.component.ts! MapElementBaseComponent ์ถ”๊ฐ€
NgModule๋กœ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/angular/angular/issues/13590#issuecomment-438641324 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AQb6kpWdkakUF8JVvea8Hy42tAnTKTuzks5uvAjvgaJpZM4LSAwS
.

TypeScript๊ฐ€ ์—„๊ฒฉํ•  ๋•Œ AOT ์ปดํŒŒ์ผ์—์„œ Angular ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด ์˜ค๋ฅ˜๋ฅผ ๋žœ์นญํ•˜๋ฉด... ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ์š”์†Œ/๋ชจ๋“ˆ์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ...

image

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ๊ณผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋”๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด strict-aot์—์„œ ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ์ด ํด๋”๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ์™„์ „ํžˆ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์ฒด์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

const landingComponents = {
    'landing-root': LandingComponent,
    'get-notified': GetNotifiedComponent,
    'typed-component': TypedComponent,
    'sticky-bar': StickyBarComponent,
};

๊ทธ๋Ÿฐ ๋‹ค์Œ declarations: Object.values(landingComponents) , entryComponents: Object.values(landingComponents) ๋ชจ๋“ˆ์— ๊ณต๊ธ‰ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งž์ถฐ๋ณด์„ธ์š” ... AOT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฐฐ์—ด์— ๋‚˜์—ด๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด "ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋”์ฐํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ Angular๋ฅผ ์‚ฌ๋ž‘ํ•˜๋Š” ๋งŒํผ AOT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งˆ๋ฒ• ์ฃผ๋ฌธ์˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ˆ˜ํ”„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋˜์—ˆ์ง€๋งŒ ์†”๋ฃจ์…˜์€ ์ด์— ๋Œ€ํ•œ ๋ชจ๋“ˆ๋‹น 1๊ฐœ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ PR์—์„œ Angular์— ๋Œ€ํ•ด ์•Œ์•„์ฐจ๋ ธ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ตœ๊ทผ์— ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ์ด ์ฃผ์ œ์— ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/ ๊ฐ/๊ฐ/๋‹น๊ธฐ๊ธฐ/27481

์˜ค๋Š˜๋กœ 2์ฃผ๋…„์„ ๋งž์ดํ•œ ์ด๋ฒˆ ํ˜ธ ๐ŸŽ‰

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋‹จ์ง€ ๊ฒฝ๊ณ ๊ฐ€ ๋  ์ˆ˜ ์—†๋Š” ์ด์œ ์— ๋Œ€ํ•œ ํ•ต์‹ฌ ํŒ€์˜ ํ•œ๋งˆ๋””๋„ ์—†์Šต๋‹ˆ๋‹ค.

@tiagodws lol ์ด๊ฑฐ ์˜ฌ๋ฆฌ๋ ค๊ณ  ์–ผ๋งˆ๋‚˜ ๊ธฐ๋‹ค๋ ธ์–ด์š”? ์•Œ๋ฆผ์„ ์„ค์ •ํ•˜์…จ๋‚˜์š”?

์ฐธ๊ณ ๋กœ
๋‚ด ๋ฌธ์ œ๋Š” https://github.com/angular/angular/issues/13590#issuecomment -389113560๊ณผ ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์ ธ์˜ค๊ธฐ๋Š” AOT ๋ชจ๋“œ์—์„œ ๋ถ„๋ช…ํžˆ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@peterdeme ... JavaScript๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค(๋ฌธ์ž์—ด๊ณผ ๋™์ผํ•œ ๊ฒฝ๋กœ ... = Windows๊ฐ€ ์•„๋‹Œ Linux ๊ธฐ๋ฐ˜).

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ๋’ค๋Šฆ์€ 2์ฃผ๋…„ ๊ธฐ๋… ํ–‰์‚ฌ๋ฅผ ์œ„ํ•ด ๋‹ค์‹œ ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค. include ๋ฐ $#$ tsconfig.json ์˜ exclude ์„น์…˜์„ ํฌํ•จํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์˜ ๊ฐ€๋Šฅํ•œ ์›์ธ์— ๋Œ€ํ•ด ๋งŽ์€ ๋…ผ๋ž€์ด ์žˆ์œผ๋ฏ€๋กœ ๊ทผ๋ณธ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•ด.

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๋” ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐ๋Ÿด ํŒŒ์ผ( index.ts )์„ ์ถ”๊ฐ€ํ•˜๋ฉด Angular ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๋ฐฐ๋Ÿด ํŒŒ์ผ(์˜ˆ: @shared/components )์—์„œ ๋ฌด์—‡์ด๋“  ๊ฐ€์ ธ์˜ค์ž๋งˆ์ž ๋ชจ๋“  ๋‹จ์ผ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ: import { SharedToastComponent } from '@shared/components'; )๋ฅผ ์ง€์ •ํ•˜๋”๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์„ ์ฐพ๊ณ  ๋ˆ„๋ฝ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜(๊ฒฝ๊ณ  ์•„๋‹˜)๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฐ๋Ÿด ํŒŒ์ผ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์™„์ „ํžˆ ์ง€์ •๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋น ๋ฅด๊ฒŒ ์ง€์ €๋ถ„ํ•ด์ง‘๋‹ˆ๋‹ค.
  2. ExtrasModule ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“ˆ์„ ์–ด๋””์—๋„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ์—๋งŒ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ฆฌ ์‰์ดํ‚น ํ›„์— ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ถœ๋ ฅ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ๋œ ๋ชจ๋“ˆ์— ํฌํ•จ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด 2๋…„ ๋œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋ณด๋‹ค ์ ์ ˆํ•œ ๊ฒฝ๊ณ ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์† ํ—ˆ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ๊ณ„์† ์„ฑ๊ณตํ•˜๋ฏ€๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2019๋…„์— Angular ํŒ€์ด ์ด ์•„์ฃผ ์˜ค๋ž˜๋˜๊ณ  ๋งค์šฐ ์„ฑ๊ฐ€์‹  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿคž

@swimmadude66 ... ์‹ค์ œ lib ๋ชจ๋“ˆ์„ ๋งŒ๋“ค๊ณ  tsconfig.json ๋ฅผ ํ†ตํ•ด Angular ์•ฑ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. "paths": {"ng-demo": ["./packages/ng-demo/src/index.ts"]} import { DemoModule } from 'ng-demo'; ์˜ค๊ธฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ

๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ์Šคํ…์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์งœ์ฆ๋‚˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋‹ค๋“ค ์ŠคํŽ™ ํ…Œ์ŠคํŠธ/์ž‘์„ฑ ์ค‘์ด์‹œ์ฃ ? ๋”ฐ๋ผ์„œ ๊ตฌ์„ฑ ์š”์†Œ ์Šคํ… ์˜ค๋ฅ˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐฐ๋Ÿด ๋ฌธ์ œ๊ฐ€ ๋œ ์„ฑ๊ฐ€์‹  ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ฐฐ๋Ÿด์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋‘๊ฐ€ ์‚ฌ์–‘์„ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์–‘ ๋ฌธ์ œ๋Š” ํ•ต์‹ฌ ํŒ€์ด ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋™๊ธฐ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ "Frequency Low"๋ผ๋Š” ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด ์žˆ์ง€๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด ๋ฌธ์ œ์— ๋ถ€๋”ชํž ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— "Frequency High"์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ AOT์—์„œ๋„ ์ผ๊ด€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Angular CLI๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ AOT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„๋กœ ์‹คํ–‰ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ ๋นŒ๋“œ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด Angular CLI ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ์ด๊ฒƒ์„ ๋‘˜๋Ÿฌ์‹ผ ๋™์ž‘์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ชจ์˜ ๋ชจ๋“ˆ์„ ์ƒ์„ฑ ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋”๋ผ๋„ ์ด์ œ UI ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ž๊ฐ€ ๋‹จ์ผ ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ชจ์˜ ๋ชจ๋“ˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด "ng ๋นŒ๋“œ"๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์œ„๋Š” UI ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ํ˜„์žฌ CI/CD ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์œ„ํ—˜ ์š”์†Œ ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค!

Angular ๋‹จ์œ„ ํ…Œ์Šคํ„ฐ๊ฐ€ ํ•œ ๋ฒˆ์˜ ์‚ฌ์†Œํ•œ ์ƒ๋žต์œผ๋กœ ์ „์ฒด ๋ฐฐํฌ ๋นŒ๋“œ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋จน์ด ์‚ฌ์Šฌ์˜ ์ƒ์œ„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”. Angular ๊ฐœ๋ฐœ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ดํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ž„์‹œ๋ฐฉํŽธ์œผ๋กœ: "ng build"์— ๋‚˜ํƒ€๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฆ‰ "ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋œ ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ์ธ ๊ฒฝ์šฐ: ํ•ด๋‹น ๋ชจ์˜ ๋ชจ๋“ˆ์— ์ถ”๊ฐ€" ํšจ๊ณผ์— ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ด URL)์— ๋”ฐ๋ผ ํŒŒ์ผ"

ํ‰๊ท ์ ์ธ ์นœ์ˆ™ํ•œ Angular ๊ฐœ๋ฐœ์ž ์ž‘์„ฑ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฌ๊ธฐ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€:

a) IMHO ๋ชจ๋“  .spec ํŒŒ์ผ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ, ์„œ๋น„์Šค ๋“ฑ์„ ๋ฐฐ์น˜ํ•˜๋Š” "๋„์šฐ๋ฏธ" ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ DRY ์ฝ”๋“œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์—ฐ์Šต์€ ํ…Œ์Šคํ„ฐ๋ฅผ ์ด ๋ฒ„๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

b) ๋ชจ๋“  .spec ํŒŒ์ผ์€ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ ๊ด€๋ จ์ด ์—†๋Š” "๋ชจ์˜ ๋ชจ๋“ˆ" ์—†์ด ์ด "๋„์šฐ๋ฏธ" ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์‚ฌ์–‘์˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ „ํ˜€ ์—ญํ• ์ด ์—†๋Š” ๋ชจ์˜ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์› ์ž๊ฒฉ ์—†์ด ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์‚ฌ์†Œํ•˜์ง€๋งŒ Google ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ด ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ณ  ์Šค๋ ˆ๋“œ์™€ ์œ ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฝ๊ณ  ์š”์•ฝํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ชจ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋„์šฐ๋ฏธ ํŒŒ์ผ์˜ ๋์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

/*
  mock components
  !! Each mock component added to this file *must* be added to the "MockTestModule", see below !!
*/
@Component({
  selector: 'app-mock-component',
  template: '<span>mock widget</span>'
})
export class MockComponent {}

/*
  This is an unused module to resolve the ng build error:
    'ERROR in : Cannot determine the module for class MockComponent
    in C:/code/myRepo/src/assets/test/test-resources.ts!
    Add MockComponent to the NgModule to fix it.'

  Reference: https://github.com/angular/issues/13590

  Each mock component added to this file *must* be added to the "MockTestModule"
*/
@NgModule({
  declarations: [ MockComponent ],
})
export class MockTestModule {}

์œ„์˜ ํŒŒ์ผ์€ ์‹ค์ œ๋กœ๋Š” ๊ฝค ํฝ๋‹ˆ๋‹ค... "MockTestModule"์€ ๋„์šฐ๋ฏธ ํŒŒ์ผ์˜ ๋ ๋ถ€๋ถ„์— ๋ฌปํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค...

... ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑ„๊ณ  ์ฝ˜์†” ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” "ng build"์— ๋Œ€ํ•œ package.json ํ•ญ๋ชฉ์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์Šฌ์ฉ ์ฐŒ๋ฅด๋‹ค.

์—ฌ๊ธฐ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โ”œโ”€โ”€ icons.module.ts
โ”œโ”€โ”€ index.ts
โ”œโ”€โ”€ icon
โ”‚ย ย  โ”œโ”€โ”€ icon.component.html
โ”‚ย ย  โ”œโ”€โ”€ icon.component.ts
โ”‚ย ย  โ””โ”€โ”€ icon.module.ts
โ””โ”€โ”€ icon-indicator
    โ”œโ”€โ”€ icon-indicator.component.html
    โ”œโ”€โ”€ icon-indicator.component.ts
    โ””โ”€โ”€ icon-indicator.module.ts

icons.module.ts ๋‚˜๋Š”:

import { IconComponent } from './icon/icon.component';
import { IconIndicatorComponent } from './icon-indicator/icon-indicator.component';

export { IconIndicatorComponent, IconComponent };

@NgModule({
  /* this was all fine */ 
})
export class IconsModule {}

index.ts ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

export * from './icons.module';

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „์— ์•„์ด์ฝ˜ ๋ฐ ์•„์ด์ฝ˜ ํ‘œ์‹œ๊ธฐ ๋ชจ๋“ˆ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์•„ Cannot determine the module for class ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ng 5์ž…๋‹ˆ๋‹ค. ng 7 ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ•œ ๋‹จ๊ณ„ ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ icons.module.ts ์—์„œ export ๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์Œ์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

icon.module.ts:
export { IconComponent };
...

icon-indicator.module.ts:
export { IconIndicatorComponent };
...

์กฐ์ •๋œ index.ts :

export * from './icons.module';
export * from './icon/icon.module';
export * from './icon-indicator/icon-indicator.module';

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด ์•„์ด๋น„ ๋ Œ๋”๋Ÿฌ๊ฐ€ AOT์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. pull ์š”์ฒญ ๋ฐ ๋ฌธ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Angular ํŒ€์€ ivy์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์œผ๋ฏ€๋กœ angular 6์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์กฐ์น˜๋ฅผ ์ทจํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด ์•„์ด๋น„ ๋ Œ๋”๋Ÿฌ๊ฐ€ AOT์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ์—์„œ ์ด๊ฒƒ์„ ๋“ฃ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

angular 7.2.0 ๋ฐ angular-cli 7.3.0์—์„œ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ERROR in : Cannot determine the module for class ModalMockComponent in /Users/user/repos/angular-skeleton/src/app/shared/modal/modal.component.mock.ts! Add ModalMockComponent to the NgModule to fix it.
Cannot determine the module for class TranslatePipeMock in /Users/user/repos/angular-skeleton/src/app/shared/pipes/translate.pipe.mock.ts! Add TranslatePipeMock to the NgModule to fix it.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด Shared Module $ ์•ˆ์— TranslatePipe ์™€ TranslatePipeMock $ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. TranslatePipe๋Š” ๋ชจ๋“ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ๋ชจ์˜ ํŒŒ์ดํ”„๋Š” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
translate.pipe.mock.ts ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์šฉ์ด๋ฏ€๋กœ ์ด ํŒŒ์ผ์„ ๊ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด์ œ ๋‚ด ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
ng build --prod

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Atm ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": []
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts",
    "**/*.mock.ts"
  ]
}

๊ฐ„๋‹จํ•œ ์„ค๋ช…์œผ๋กœ ์ด ๋ฌธ์ œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(๋‚˜์œ ๋””์ž์ธ). ๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‰ฌ์šด๊ฐ€์š” ์–ด๋ ค์šด๊ฐ€์š”?

@rrmayer ์ด ๋ฌธ์ œ์˜ ์ƒํƒœ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  "ํ˜„์žฌ" ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ "๋‹ด์Ÿ์ด๋ฉ๊ตด์„ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค"์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ "์˜ค๋ฅ˜"์—์„œ "๊ฒฝ๊ณ "๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค... ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์Šต๋‹ˆ๊นŒ?

@Terrafire123 ... ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ŠคํŠธ ๋˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ์™€ ๋งŽ์€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ์ด ๊ฒฝ์šฐ๊ฐ€ ์˜ค๋ฅ˜๋กœ ์ด์–ด์ง„๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ๊ฒฝ๊ณ  ๋ณ€๊ฒฝ์€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ˆ˜์ •๋  ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์€ ์—†์Šต๋‹ˆ๋‹ค. D

์ตœ์†Œํ•œ ์˜ค๋ฅ˜๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ๊ฐ€ ๊นจ์ง€๋Š” ๊ฒƒ์€ ๊ฝค ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ์ธํ•ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { UnusedImportComponent } from "./used-somewhere-else-or-not.component";

ํด๋ž˜์Šค ์˜†์— ์žˆ๋Š” 'export' ํ‚ค์›Œ๋“œ๋Š” @Component ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์ ์šฉ๋œ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ชจ๋“ˆ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์˜ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ…Œ์ŠคํŠธ์—์„œ ์ง์ ‘ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ CoreMocksModule๊ณผ ๊ฐ™์ด ์„ ์–ธํ•œ ๋‹ค์Œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค! ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธ๋œ ์Šคํ… ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Component({
  selector: 'app-user-stub-component',
  template: ''
})
export class UserStubComponent {}

'export' ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ/ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค.

@Component({
  selector: 'app-user-stub-component',
  template: ''
})
class UserStubComponent {}

export default UserStubComponent;

์ด์ œ ์Šคํ…์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์–ด๋””์—์„œ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€๊ด„ํ˜ธ๋ฅผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
import UserStubComponent from 'path'

ํšจ๊ณผ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ AOT ์ปดํŒŒ์ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ผ€์ด์‹ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋”์— ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ VS ์ฝ”๋“œ์˜ ์ž๋™ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ์†Œ๋ฌธ์ž๋กœ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

@renilbabu03 JS๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋ฒˆ์—ญ ํŒŒ์ดํ”„๋ฅผ ์กฐ๋กฑํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

export class ์„ default export ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

import { PipeTransform, Pipe } from '@angular/core';

@Pipe({
  name: 'translate'
})
class TranslatePipeMock implements PipeTransform { // <-- NOT: "export class TranslatePipeMock implements PipeTransform"
  public name = 'translate';

  public transform(query: string): any {
    return query;
  }
}

export default TranslatePipeMock;

์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
export default <class> ์‹œ๋„ํ–ˆ์ง€๋งŒ $# ng serve --aot ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฐ’ 'null'์ด ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค .

๋งค์šฐ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

@redplane ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ด? default ์ˆ˜์ถœ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์ด ์Šค์Šค๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/angular/angular/blob/master/aio/content/examples/testing/src/testing/router-link-directive-stub.ts

๋‚ด๊ฐ€ import exported ์ž์‚ฐ์ด ์•„๋‹Œ ํ•œ Angular๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๋‚˜์š”?

์ข…์ข… ๋‚˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  CommonJS ์‹œ์ ˆ์— ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ž˜๋œ ์ปดํฌ๋„ŒํŠธ ์ฐธ์กฐ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํžˆ ์•ˆ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ ์•ž์—์„œ ๋„ˆ๋ฌด ๋งŽ์ด ํ™”์ƒ์„ ์ž…์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Angular๊ฐ€ ๊ฐ•์ œ๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž์‚ฐ์„ ์ œ๊ฑฐํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ชฉ์ด ๊นŠ์„ ๋•Œ ์šฉ๋‚ฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ดํ•‘ ๋‹จ๊ณ„...

๋‚˜๋Š” ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ์œ ์ผํ•œ ๊ฐœ๋ฐœ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— Angular 6์— ๊ฐ‡ํ˜”๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์šด๋ฐ ์ตœ์‹  ์•ˆ์ •์ ์ธ ๋„๊ตฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ์ง€์˜ฅ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ Angular 6+๊ฐ€ ์ด ๋™์ž‘์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋กœ ํŒจ์น˜๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค...

์ œ ๊ฒฝ์šฐ์—๋Š” ๊ฐ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์—์„œ ๋ช‡ ๊ฐœ์˜ ์—ด๊ฑฐํ˜•์„ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋Ÿฌํ•œ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฃจํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Angular ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ์˜ ngModule์—์„œ ์„ ์–ธ๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‚ด ์—ด๊ฑฐํ˜•์„ public-api.ts ํŒŒ์ผ์— ์„ ์–ธ ํ•˜๊ณ  ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„: components-lib
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„: demo-app

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์ธํ„ฐํŽ˜์ด์Šค, ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜• ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ง์ ‘ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

'components-lib'์—์„œ { SearchEnum } ๊ฐ€์ ธ์˜ค๊ธฐ;

๊ทธ๋ฆฌ๊ณ  ํ•˜์ง€๋งˆ
import { SearchEnum } from '../../../projects/components-lib/path-to-your-component';

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฐพ๋Š” ๋ฐ ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ng 8์„ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ng 9๋กœ ๋นŒ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ชจ ํด๋ž˜์Šค ์ฒด์ธ์—์„œ ์ด๋“ค ์ค‘ ์ผ๋ถ€๋Š” ์ถ”์ƒ์ ์ด๋ฉฐ ng 9์—์„œ๋Š” ng 8๊ณผ ํ˜ธํ™˜๋˜๋„๋ก @Directive({ selector: 'random' }) ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฑฐ์˜ ํ”ผํ•  ๋ป”ํ–ˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฌ๋‚˜ :

Cannot determine the module for class NgxSubFormComponent in /........./node_modules/ngx-sub-form/ngx-sub-form.d.ts! Add NgxSubFormComponent to the NgModule to fix it.`

๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์–ด๋–ค ๋ชจ๋“ˆ๋„ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋ชจ๋“ˆ์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๊ทธ๋ž˜์„œ ์ €๋Š” ๋ง‰ํ˜”๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋Œ€์‹  ng 9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•˜๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ž˜๋ผ๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์นจ๋ฌต์„ ์ง€์ผœ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

View Engine์˜ ngc๋Š” ์˜๋„์ ์œผ๋กœ "์ปดํŒŒ์ผ"์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ngfactory ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, tsconfig์— ์˜ํ•ด ์ •์˜๋œ ์ „์ฒด TS ํŒŒ์ผ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด TypeScript๊ฐ€
์ž์ฒด ์ž‘๋™ - tsconfig์— ์˜ํ•ด ์ •์˜๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ngc๋Š” ๊ทธ ์œ„์— ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ปดํŒŒ์ผ์— @Component ๊ฐ€ ์žˆ๊ณ  ngc๊ฐ€ ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์ฆ‰, ์ตœ์ƒ์œ„ ์ˆ˜์ค€์ด๊ณ  ๋‚ด๋ณด๋‚ธ ๊ฒฝ์šฐ) ngc๋Š” ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ngc๊ฐ€ ์ฒ˜์Œ์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋Š” ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ tsconfig์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ํŽธ์ง‘๊ธฐ์šฉ ์ตœ์ƒ์œ„ tsconfig๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ์œผ๋กœ ํŽธ์ง‘๊ธฐ ๊ตฌ์„ฑ์—์„œ ์ƒ์†ํ•˜๊ณ  ์‚ฌ์–‘ ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ tsconfig.app.json ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ๊ตฌ์„ฑ๋งŒ ngc๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ(๊ฐ tsconfig๋Š” "ํ”„๋กœ์ ํŠธ"์ž„)๋Š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•ด๋‹น ๋ชจ๋“ˆ์ด ํ•ญ์ƒ ํ•จ๊ป˜ ์ปดํŒŒ์ผ๋˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Ivy์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ ์ฐจ์ด์ ์„ ์ œ์™ธํ•˜๊ณ  ๋™์ผํ•œ ๊ทœ์น™์ด ์—ฌ์ „ํžˆ ํฌ๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ Ivy๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด _any_ @Component ์ปดํŒŒ์ผ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • Ivy์—์„œ๋Š” ๋ชจ๋“ˆ์ด ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ…œํ”Œ๋ฆฟ์—์„œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ/์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ…œํ”Œ๋ฆฟ ์œ ํ˜• ๊ฒ€์‚ฌ ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด ์—†์œผ๋ฉด ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋‹ค๋ฅธ ๊ฒƒ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์— jit: true ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋‚˜ ๋ชจ๋“ˆ์„ ๋ฌด์‹œํ•˜๊ณ  ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ๋‘๋„๋ก Ivy ์ปดํŒŒ์ผ๋Ÿฌ์— ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alxhub ๋” ์ด์ƒ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์†Œ์‹์„ ๋“ค์œผ๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ngc๊ฐ€ tsc๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์ปดํŒŒ์ผํ•  ๊ฒƒ์ด๊ณ , tsc๊ฐ€ ๊ทธ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ฌด์—‡์ด๋“  ์ปดํŒŒ์ผํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ชจ๋“ˆ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ 100% ๊ฐ๋„ ๋ฌธ์ œ์ด๋ฏ€๋กœ ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ ๋ฒ”์œ„์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ธธ์„ ๊ฑท์–ด์ฐจ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฐ๋Ÿด ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํŒจํ„ด์ด ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ๋„์ค‘์— ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ ํŒŒ์ผ์„ ์ปดํŒŒ์ผ์—์„œ ์ง„์ •์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์œ„์—์„œ ๋‹จ์ˆœํžˆ "ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ์™ธ"ํ•˜๋ผ๋Š” ์š”์ฒญ์— ์ข…์ข… ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

ivy์˜ ๋‚˜๋จธ์ง€ ์ œํ•œ ์‚ฌํ•ญ(๋ชจ๋“ˆ์ด ์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ…œํ”Œ๋ฆฟ ์˜ค๋ฅ˜)๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฒฝ๊ณ ๋„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์€๊ฐ€์š”? ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋“ˆ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ์‹๋ณ„๋˜๊ธฐ ์ „์— ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋” ์–ด๋ ต๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜์ง€๋งŒ Warning: ExampleUnusedComponent does not belong to an NgModule, and will be excluded from the output ํ–‰์— ๋”ฐ๋ฅธ ๊ฒฝ๊ณ ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ(๋ฐ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ)๋Š” ngModule์— ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ํ•œ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์›€์ง์ž„์„ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ivy ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์›๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰