Rollup-plugin-typescript2: ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ณด๊ธฐ

์— ๋งŒ๋“  2019๋…„ 01์›” 09์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ezolenko/rollup-plugin-typescript2

์„ ์–ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด rollup-plugin-typescript ์—์„œ rollup-plugin-typescript2 ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋™์•ˆ *.vue ํŒŒ์ผ์€ ๋” ์ด์ƒ ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[!] (rpt2 plugin) Error: someFolder/index.ts(2,53): semantic error TS2307 Cannot find module './component.vue'.
src\index.ts
Error: someFolder/index.ts(2,53): semantic error TS2307 Cannot find module './component.vue'.

๋ฌธ์ œ ์—†์ด rollup-plugin-typescript2 ๋ฒˆ๋“ค ๋Œ€์‹  rollup-plugin-typescript ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

(์˜ค๋Š˜๋‚  ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์˜) ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bug help wanted

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

์ด ์„ค์ •์œผ๋กœ ๋‹จ์ผ vue ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š” ์›”๋“œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์—ฌ๊ธฐ ๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋กค์—…์€ ๋ง ๊ทธ๋Œ€๋กœ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์™œ? ๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

<script lang="ts">
import Bar from './Bar.vue';
...
</script>

1) vue ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
2) typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์€ .vue ํŒŒ์ผ์„ ๋งŒ๋‚˜์ง€๋งŒ ๋กค์—…์ด webpack๊ณผ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๊ธฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŒŒ์ผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ JS๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ฝ”๋“œ๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
3) ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด lang=scss ๋˜๋Š” lang=ts ์™€ ๋‹ค๋ฅธ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณ„๋กœ.

ํ•˜์ง€๋งŒ ๋ทฐํ‹ฐํŒŒ์ด! ๋ฒ„ํ”„!

Vuetify๋Š” typescript์ด์ง€๋งŒ SFC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ๋ Œ๋” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Buefy๋Š” SFC์™€ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ typescript๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ •๋ง, ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์„๊ฑฐ์•ผ. typescript ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๋ชจ๋“  Vue ํŒŒ์ผ์— ๋Œ€ํ•ด ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ค‘๊ฐœ์ž๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import Bar from './Bar.vue';

export default Bar;

๊ทธ๋Ÿฐ ๋‹ค์Œ์—๋งŒ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์—ฌ typescript SFC ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ, ์งœ์ฆ๋‚œ๋‹ค

๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

tsconfig ๋ฐ ๋กค์—… ๊ตฌ์„ฑ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜๋Š” ์žฌ์ƒ์‚ฐ์ด ์žˆ๋Š” ์ž‘์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ :)

๋ถˆํ–‰ํžˆ๋„ "์ž‘์€"์ €์žฅ์†Œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” webpack ์—์„œ rollup ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๊ณ  ์—ฌ๊ธฐ ์—์„œ ์ผํ•˜๊ณ 

์—์„œ ๊ฐ€์ ธ ์˜ค๊ธฐ rollup.config.js ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค rollup-plugin-typescript2 ์ฐจ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์šฐ์„  ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์—…ํ•ด ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ rollup-plugin-typescript ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•˜๊ณ  ์ž‘์€ ๋ฐ๋ชจ ์ €์žฅ์†Œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/danimoh/rollup-plugin-typescript2-vue-demo

import AnotherComponent from './AnotherComponent.vue'; ํ–‰์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ด ํ–‰์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ์‹œ๊ธฐ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒ ํ–ˆ์Šต๋‹ˆ๊นŒ?
๋กค์—…, ๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ง€์‹์ด ๋งค์šฐ ์ œํ•œ์ ์ธ ์ œ ์ถ”์ธก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
typescript ์ž์ฒด๊ฐ€ ๋กค์—… ๋Œ€์‹  AnotherComponent ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” rollup-plugin-vue ํ•ฉ๋‹ˆ๊นŒ?

rollup-plugin-typescript transpileModule ํ•˜์—ฌ ํŒŒ์ผ๋ณ„๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ rollup-plugin-typescript ์ด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ด์œ ๊ฐ€ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋‹ค์Œ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#customizing -module-resolution

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์€ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ชจ๋‘ ์žฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ์•„์ง ๋™์ผํ•œ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋กค์—…์˜ ๋ชจ๋“ˆ ํ•ด์ƒ๋„์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ดํ›„ ๋ฒ„์ „์˜ ๋กค์—…์ด context.resolveId(...) ์—์„œ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ถœ ์ฒด์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋กค์—…์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋ณ€ํ™˜์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์€ typescript์˜ LanguageService.getEmitOutput ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ์–ธ์–ด ์„œ๋น„์Šค๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ LanguageHost.resolveModuleNames ๊ตฌํ˜„์„ ํ˜ธ์ถœํ•˜๊ณ  ํ•ด๊ฒฐ๋œ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜ธ์ŠคํŠธ ํ˜ธ์ถœ ๋กค์—…์˜ PluginContext.resolveId
  • ๋กค์—…์€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์•ฝ์†์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์•ฝ์†์„ ํ•˜๋Š” ๊ฒƒ๋ฟ

LanguageService ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ ๋™๊ธฐ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค: https://github.com/Microsoft/TypeScript/issues/1857

Plugin.transform ์ž์ฒด๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€์ฐฐ์ž ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ฝœ๋ฐฑ ๋‚ด๋ถ€์—์„œ ๋งŒ๋“  ์—ฌ๋Ÿฌ ์•ฝ์†์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ˜„์žฌ๋กœ์„œ๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‹ค์†Œ ๊ด€๋ จ: https://github.com/rollup/rollup/issues/2631

์•ˆ๋…•ํ•˜์„ธ์š” ์—์กธ๋ Œ์ฝ”์ž…๋‹ˆ๋‹ค.

์š”์ฆ˜ Javascript์˜ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ๋Œ€๋ถ€๋ถ„ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด async / await ๊ตฌ๋ฌธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™๊ธฐ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ด๋ฉฐ async ๋ฉ”์„œ๋“œ๋Š” ์—ฌ์ „ํžˆ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. await ๋Š” async ๋ฉ”์„œ๋“œ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋‹ค์‹œํ”ผ LanguageHost.resolveModuleNames ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ์‹์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ผ๋ฐ˜ Javascript์—์„œ ์•ฝ์†์„ ๊ธฐ๋‹ค๋ฆฐ ํ›„์—๋งŒ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ NodeJ์—์„œ๋Š” ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋กœ ์ ํ”„ํ•˜๊ณ  ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋กœ ๋‹ค์‹œ ์ ํ”„ํ•˜๋ฉด ์ด์™€ ๊ฐ™์€ ์ž‘์—…์ด ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. synchronize.js ์™€ ๊ฐ™์€ ์„ฌ์œ  ๋˜๋Š” ๋ž˜ํผ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์€ ์‹ค์ œ๋กœ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปจํ…์ŠคํŠธ๊ฐ€ resolveId ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. vue ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ typescript ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜๋ ค๋ฉด transform of rollup-plugin-vue ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปจํ…์ŠคํŠธ๋Š” ๋ถˆํ–‰ํžˆ๋„ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ rollup-plugin-vue ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  vue ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ง์ ‘ transform ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์ „ํ˜€ ์•„๋ฆ„๋‹ต์ง€ ์•Š๊ณ  ๋กค์—… ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ์˜๋„๋œ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰์—์„œ transpileModule in transform ์‹คํ–‰ํ•˜์—ฌ ๋กค์—…์ด ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋„๋ก ํ•˜๊ณ  vue ํ”Œ๋Ÿฌ๊ทธ์ธ transform ์ด ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ถ”์ถœ๋œ typescript ์ฝ”๋“œ๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋กค์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  renderChunk ๋˜๋Š” generateBundle ํ”Œ๋Ÿฌ๊ทธ์ธ ํ›„ํฌ์— ์บ์‹œํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์œ ํ˜• ์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฒ„๋ฆด ์ฝ”๋“œ์— ์ถ”๊ฐ€ ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ๋” ์•„๋ฆ„๋‹ค์šด ์†”๋ฃจ์…˜์ด ์•„์ง ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‘ ๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋งˆ๋„ _๊ทธ_ ์ถ”์•…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. renderChunk ๋˜๋Š” generateBundle ํ›„ํฌ ๋Œ€์‹  ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋งˆ์ง€๋ง‰ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ž์ฒด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์‹œ์ ์—์„œ ์ปดํŒŒ์ผ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์„ ๋กค์—… ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ƒ์„ฑ๋œ ํŒŒ์ผ์€ ์ตœ์ข… ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด์จŒ๋“  ํ๊ธฐํ•  ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๋‹ค.

@danimoh @eddow ๋‘ ์˜ˆ์ œ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ”๋กœ ์œ„์— // @ts-ignore ํ•˜์—ฌ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ *.vue ํ•ญ๋ชฉ์ด ์–ด๋–ค ์œ ํ˜•์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜๋Š” typescript์ž…๋‹ˆ๋‹ค( Cannot find module ๋Š” ๋ชจ๋“ˆ ์œ ํ˜•์„ ์˜๋ฏธํ•จ). ์ผ๋‹จ ์นจ๋ฌตํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์€ vue ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ๋“ค์ด any ์œ ํ˜•์ด๊ณ  ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์— ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ตœ์†Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ฒซ ๋ฒˆ์งธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‘ ๋ฒˆ์งธ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋กค์—… ํŠธ๋ฆฌ๋ฅผ ๋ฒˆ๋“ค์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.)

@danimoh , ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กค์—…์—์„œ ๋ชจ๋“ˆ ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ vue ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธก์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์ €๋Š” ๊ทธ๊ณณ์—์„œ ์‚ฌ๋ก€๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค) ์ž ์žฌ์ ์ธ ํ•จ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด rpt2๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์ „์— ์ถ”์ถœ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

vue ๋ฌธ์ œ ์Šค๋ ˆ๋“œ์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ณธ์งˆ์ ์œผ๋กœ vue ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋กค์—…์ด ํ•ด๋‹น ํŒŒ์ผ์„ typescript์— ํ”ผ๋“œ๋ฐฑํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” typescript๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ์ „์ฒด์—์„œ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋Š์Šจํ•ด์ง‘๋‹ˆ๋‹ค.

vue ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ts๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ์ด ์œ ํšจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ž์„œ ์ œ์•ˆํ•œ ์ถ”์•…ํ•œ ํ•ดํ‚น์„ ๋” ์ž˜ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • vue ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ options hook์„ ํ†ตํ•ด ๋…ธ์ถœ๋˜๋‚˜์š”?
    ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด vue ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ transform ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API ์—์„œ ts CompilerHost ๋ฐ LanguageServiceHost ์‚ฌ์šฉ์ž ์ •์˜ fileExists ๊ณต๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. readFile , getScriptSnapshot ๋“ฑ.
  • ๋‘˜ ๋‹ค ์ž‘๋™ํ•˜๋ฉด typescript๊ฐ€ vue ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ AST๋กœ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ํ•ด๋‹น AST์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  .vue ํŒŒ์ผ์ธ ๊ฒฝ์šฐ vue ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  vue ํŒŒ์ผ์— ๋Œ€ํ•ด ์ถ”์ถœ๋œ typescript ์ฝ”๋“œ๋ฅผ ์บ์‹œํ•˜๊ณ  vue ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์บ์‹œ๋œ ts ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด readFile ์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‹ค์ œ๋กœ fileExists ๋ฐ readFile ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด typescript๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— AST๋ฅผ ์ˆœํšŒํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง์ ‘ ์ˆ˜์ง‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ . ๊ทธ๋Ÿฐ ๋‹ค์Œ ์š”์ฒญ ์‹œ vue ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Vue ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋…ธ์ถœ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กค์—…์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฒฝ์šฐ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ค‘๋‹จ๋ ์ง€(์ฆ‰์‹œ ๋˜๋Š” ๋ฏธ๋ž˜์—) ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์š”์ ์ด ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ LanguageServiceHost ์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ์š” ๋‹จ์ ์€ vue ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ์˜ ์ž ์žฌ์ ์œผ๋กœ ์ทจ์•ฝํ•œ ๊ฒฐํ•ฉ ๋ฐ ํ๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฃผ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋กค์—…์— ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ณ€ํ™˜์„ ์ค‘๋‹จํ•˜๊ณ  ํ˜„์žฌ ํŒŒ์ผ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ๋ณ€ํ™˜ํ•  ์ข…์†์„ฑ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

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

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

์ด ์„ค์ •์œผ๋กœ ๋‹จ์ผ vue ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

import VuePlugin from 'rollup-plugin-vue'
import typescript from 'rollup-plugin-typescript2'

export default {
  plugins: [
    typescript({
      typescript: require('typescript'),
      objectHashIgnoreUnknownHack: true,
    }),
    VuePlugin(/* VuePluginOptions */),
  ],
  input: 'src/components/HelloWorld.vue',
  output: [
    { file: 'dist/HelloWorld.cjs.js', format: 'cjs' },
    { file: 'dist/HelloWorld.esm.js', format: 'esm' },
  ],
}

์ด๊ฒƒ์ด lang="ts"์ธ Vue SFC์—์„œ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์กฐ์–ธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ด ์„ค์ •์œผ๋กœ ๋‹จ์ผ vue ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š” ์›”๋“œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์—ฌ๊ธฐ ๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋กค์—…์€ ๋ง ๊ทธ๋Œ€๋กœ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์™œ? ๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

<script lang="ts">
import Bar from './Bar.vue';
...
</script>

1) vue ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
2) typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์€ .vue ํŒŒ์ผ์„ ๋งŒ๋‚˜์ง€๋งŒ ๋กค์—…์ด webpack๊ณผ ๊ฐ™์€ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๊ธฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŒŒ์ผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ JS๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ฝ”๋“œ๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
3) ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด lang=scss ๋˜๋Š” lang=ts ์™€ ๋‹ค๋ฅธ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณ„๋กœ.

ํ•˜์ง€๋งŒ ๋ทฐํ‹ฐํŒŒ์ด! ๋ฒ„ํ”„!

Vuetify๋Š” typescript์ด์ง€๋งŒ SFC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ ๋ Œ๋” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

Buefy๋Š” SFC์™€ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ typescript๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ •๋ง, ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์„๊ฑฐ์•ผ. typescript ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๋ชจ๋“  Vue ํŒŒ์ผ์— ๋Œ€ํ•ด ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ค‘๊ฐœ์ž๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import Bar from './Bar.vue';

export default Bar;

๊ทธ๋Ÿฐ ๋‹ค์Œ์—๋งŒ ๋กค์—…์„ ์‚ฌ์šฉํ•˜์—ฌ typescript SFC ๊ตฌ์„ฑ ์š”์†Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ, ์งœ์ฆ๋‚œ๋‹ค

๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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