์ ์ธ ํ์ผ์ ์์ฑํ๊ธฐ ์ํด 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
๋ฅผ ๊ฐ์ ธ์ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
(์ค๋๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์) ๋ง์ง๋ง ๋ฒ์ ์ด ์์ง๋ง ์ด๊ฒ์ ์ด ๋ฌธ์ ์ ๊ด๋ จ ์ด ์์ ์ ์์ต๋๋ค.
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(...)
์์ ์ฝ์์ ๋ฐํํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ํธ์ถ ์ฒด์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๋์ ๋ค์์ด ์ ํจํ ์ ๊ทผ ๋ฐฉ์์ผ ์ ์์ผ๋ฉฐ ์์ ์ ์ํ ์ถ์ ํ ํดํน์ ๋ ์ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
options
hook์ ํตํด ๋
ธ์ถ๋๋์?transform
๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.CompilerHost
๋ฐ LanguageServiceHost
์ฌ์ฉ์ ์ ์ fileExists
๊ณต๊ธํ ์ ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. readFile
, getScriptSnapshot
๋ฑ..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 ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค.
์ด๋ฐ, ์ง์ฆ๋๋ค
๋ ๋์ ํด๊ฒฐ์ฑ ์ด ์๋ค๋ฉด ๋ฃ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ง์ต๋๋ค. ํ์ง๋ง ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ ์๋๋๋ค. ์๋ ํ์ธ์ ์๋์ ๋๋ค. ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ์ฌ๋์ ์ํด ์ฌ๊ธฐ ๋ด๊ฐ ์์งํ ๋ด์ฉ์ด ์์ต๋๋ค.
๋กค์ ์ ๋ง ๊ทธ๋๋ก ์ด๊ฒ์ ํ ์ ์์ต๋๋ค
์? ๋ค์์ ์์ ๋๋ค.
1) vue ํ๋ฌ๊ทธ์ธ์ ์คํฌ๋ฆฝํธ๋ฅผ typescript ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ ๋ฌํฉ๋๋ค.
2) typescript ํ๋ฌ๊ทธ์ธ์
.vue
ํ์ผ์ ๋ง๋์ง๋ง ๋กค์ ์ด webpack๊ณผ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ์์ ํ๋ฌ๊ทธ์ธ์ด ๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ ์ฐ๊ธฐํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ํ์ผ๋ก ๋ฌด์์ ํด์ผ ํ ์ง ์ ์ ์์ต๋๋ค. ์ผ๋ฐ JS๋ ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋ฅผ ์ ์์ง๋ง ์ด๋ฏธ ํ๋ฌ๊ทธ์ธ์์ ์ฒ๋ฆฌ ์ค์ธ ์ฝ๋๋ ์ํํ ์ ์์ต๋๋ค.3) ์ค์ ๋ก ์ด๊ฒ์ด
lang=scss
๋๋lang=ts
์ ๋ค๋ฅธ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ์ง๋ง ์ถ์ธกํฉ๋๋ค.๋ณ๋ก.
Vuetify๋ typescript์ด์ง๋ง SFC๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ํ ๋ ๋ ๊ธฐ๋ฅ์ ๋๋ค.
Buefy๋ SFC์ ๋กค์ ์ ์ฌ์ฉํ์ง๋ง typescript๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๋น์ ์ ๊ทธ๊ฒ์ ์ข์ํ์ง ์์๊ฑฐ์ผ. typescript ํ์ผ์์ ๊ฐ์ ธ์์ผ ํ๋ ๋ชจ๋ Vue ํ์ผ์ ๋ํด ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ์ค๊ฐ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์์๋ง ๋กค์ ์ ์ฌ์ฉํ์ฌ typescript SFC ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ ์ ์์ต๋๋ค.
๋ ๋์ ํด๊ฒฐ์ฑ ์ด ์๋ค๋ฉด ๋ฃ๊ณ ์ถ์ต๋๋ค.