宣èšãã¡ã€ã«ãäœæããããã«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ãšrollupconfigãæçš¿ã§ããŸããïŒ
ãŸãã¯è€è£œä»ãã®å°ããªãªããžããª:)
ããã«ã¡ã¯ã
ãŸã第äžã«ããã®ãã©ã°ã€ã³ã«åãçµãã§ãããŠããããšãã ããã¯ç¢ºãã«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
ãã¡ã€ã«ããšã«ã³ã³ãã€ã«ãããããããã®åé¡ãçºçããªãçç±ã説æããŸãã
ãã®å Žåã次ã®ããšãèå³æ·±ããããããŸããïŒ https ïŒ
ãã®åé¡ã«é¢ããäœæ¥ã¯å€§æè¿ã§ãã
äž¡æ¹ã®ãªããžããªã§åçŸãããŠããŸããåãåé¡ã§ãããã©ããã¯ãŸã ããããŸããããå¯èœæ§ããããŸãã
2çªç®ã®ã±ãŒã¹ãä¿®æ£ããã«ã¯ãvueãã©ã°ã€ã³ããããå®è¡ã§ããããã«ãã¢ãžã¥ãŒã«ã®è§£æ±ºãããŒã«ã¢ããã«éãè¿ãå¿ èŠããããŸãã
ããŒã«ã¢ããã®ã¢ãžã¥ãŒã«è§£å床ãštypescriptãæ¥ç¶ããéã®åé¡ã¯ããã以éã®ããŒãžã§ã³ã§ã®ããŒã«ã¢ãããcontext.resolveId(...)
ããPromiseãè¿ãããšã§ãã ãããã£ãŠãã³ãŒã«ãã§ãŒã³ã¯æ¬¡ã®ããã«ãªããŸãã
LanguageService.getEmitOutput
åŒã³åºããŸãLanguageHost.resolveModuleNames
ã®å®è£
ãåŒã³åºãã解決ããããã¹ããã®é¢æ°ã§è¿ãããããšãæåŸ
ããŸãPluginContext.resolveId
åŒã³åºããŸãLanguageService
ã¯å³å¯ã«åæããŠããããã§ãïŒ https ïŒ
Plugin.transform
èªäœãPromiseãè¿ãããšãã§ããŸããããªãã¶ãŒããŒãªããžã§ã¯ãã®ã³ãŒã«ããã¯ã®å¥¥æ·±ãã§è¡ãããè€æ°ã®Promiseããã§ãŒã³ããã¡ã«ããºã ã¯ãçŸæç¹ã§ã¯ç§ãé¿ããŠããŸãã
ããé¢é£ïŒ https ïŒ
ããã«ã¡ã¯ãšãŸã¬ã³ã³ã
çŸåšãJavascriptã®éåæã¡ãœããã¯ãäž»ã«Promisesãè¿ãã¡ãœãããæå³ããŸãã æ°ããasync
/ await
æ§æã¯ãåºæ¬çã«éåæã¡ãœããã®åãªãæ§æç³è¡£ã§ãããéçºè
ã¯åæã³ãŒããšåæ§ã®ã³ãŒããèšè¿°ã§ããŸããã async
ã¡ãœããã¯åŒãç¶ãpromiseãè¿ããŸãã ãã ãã await
ã¯async
ã¡ãœããã§ã®ã¿äœ¿çšã§ããŸãã ãæ°ã¥ãã®ãšããã LanguageHost.resolveModuleNames
ã¡ãœããã¯éåæã§ã¯ãªãããããã¬ãŒã³ãªJavascriptã§promiseãåŸ
ã£ãåŸã§ã®ã¿ããã®ã¡ãœããããæ»ãããšã¯ã§ããŸããã
ãã ããNodeJã§ã¯ããã®ãããªããšã¯ãçŸåšã®ã¹ã¬ããã§åæã¡ãœãããçæããéåæã¡ãœããã«ãžã£ã³ãããŠãéåæã¡ãœããã解決ããããšãã«åæã¡ãœããã«æ»ãããšã§å®éã«å¯èœã§ãã synchronize.jsã®ãããªãã¡ã€ããŒãŸãã¯ãã®åšãã®ã©ãããŒãåç §ããŠãã ããã
ãããã£ãŠãasyncã¡ãœããã®åŒã³åºãã«é¢ããããšã¯å®éã«ã¯ããã»ã©åé¡ã§ã¯ãããŸããã ãã ããå¥ã®åé¡ãããå¯èœæ§ããããŸãã ãã©ã°ã€ã³ã³ã³ããã¹ãã¯ã¡ãœããresolveId
æäŸããŸãããããã ãã§ã¯ååã§ã¯ãããŸããã vueåäžãã¡ã€ã«ã³ã³ããŒãã³ãããtypescriptã³ãŒããæœåºããã«ã¯ã rollup-plugin-vue
ã®transform
ãåŒã³åºãå¿
èŠããããŸãã æ®å¿µãªããããã©ã°ã€ã³ã³ã³ããã¹ãã¯ãã®æ©èœãæäŸããŠããªãããã§ãã
ããã解決ãã1ã€ã®ã¢ãããŒãã¯ããããžã§ã¯ããžã®äŸåé¢ä¿ãšããŠrollup-plugin-vue
ãè¿œå ããvueãã©ã°ã€ã³ã§transform
ãçŽæ¥ããªã¬ãŒããããšã§ãã ããã¯ç¢ºãã«ãŸã£ããçŸããã¯ãªããããŒã«ã¢ãããã©ã°ã€ã³ãæäœããããã®æå³ãããæ¹æ³ã§ããããŸããã
å¥ã®ã¢ãããŒãã¯ãæåã®å®è¡ã§ãã¡ã€ã«ããšã«transform
ã§transpileModule
ã®ã¿ãå®è¡ããŠãããŒã«ã¢ããã«ãã¹ãŠã®ã€ã³ããŒããåéãããvueãã©ã°ã€ã³ã«transform
åäžã«ããããšã§ããã³ã³ããŒãã³ãããã¡ã€ã«ããæœåºãããã¿ã€ãã¹ã¯ãªããã³ãŒãããã£ãã·ã¥ããŸãã 次ã«ãããŒã«ã¢ãããå®äºããåã«ããã©ã³ã¹ãã€ã«ãããã³ãŒããç Žæ£ãã renderChunk
ãŸãã¯generateBundle
ãã©ã°ã€ã³ããã¯ã«ãã£ãã·ã¥ããã³ãŒãã«å¯ŸããŠé©åãªã¿ã€ãã¹ã¯ãªããã³ã³ãã€ã«ãå®è¡ããŸãã ããã¯ä»ã®ãã©ã°ã€ã³ã«å¹²æžããå¯èœæ§ããããŸãããããã¯ç Žæ£ããã³ãŒãã«è¿œå ã®å€æãé©çšããŸãã
ä»ã®ãšããããã以äžçŸãã解決çã¯ãŸã ãããŸããã
ç·šéïŒèãçŽããŠã¿ããšã2çªç®ã®ã¢ãããŒãã¯ããããéããã®ã§ã¯ãããŸããã renderChunk
ãŸãã¯generateBundle
ããã¯ã®ä»£ããã«ããã©ã°ã€ã³ã¯æåŸã®ã€ã³ããŒããã€ã³ããŒãããããšãã«ããèªäœãæ€åºãããã®æç¹ã§ã³ã³ãã€ã«ãæåããéå§ããã³ã³ãã€ã«ããããã¡ã€ã«ãããŒã«ã¢ãããã¥ãŒã«è¿œå ããŠå®éã«ã¯ãä»ã®ãã¹ãŠã®ãã©ã°ã€ã³ã§ãåŠçã§ããŸãã 以åã«çæããããã¡ã€ã«ã¯ãæçµçãªãã³ãã«ã«ãªã£ãŠããŸãããšãé¿ããããã«ãåŒãç¶ãç Žæ£ããå¿
èŠããããŸãã
ããã§ãããã®ã¢ãããŒãã§ã¯ããšã«ããç Žæ£ãããã¡ã€ã«ã«ä»ã®ãã©ã°ã€ã³ãå«ãŸãããããåŠçæéãç¡é§ã«ãªããŸãã
@danimoh @eddowäž¡æ¹ã®ãªããžããªäŸã®åé¿çã¯ãåé¡ã®ããã€ã³ããŒãã®ããäžã«ãã// @ts-ignore
ãšã©ãŒãã§ãã¯ãç¡å¹ã«ããããšã§ãã
ãšã©ãŒã¯åºæ¬çã«typescriptã§ããã*ãvueã®ãã®ãã©ã®ã¿ã€ãã§ããããããããŸããïŒ Cannot find module
ã¯ã¢ãžã¥ãŒã«ã¿ã€ããæå³ããŸãïŒã ãããæ²é»ãããšããã¹ãŠãæ£ããã³ã³ãã€ã«ãããŠããããã«èŠããŸãã æ¬ ç¹ã¯ãvueãã¡ã€ã«ããã€ã³ããŒãããããã®ã¯any
ã¿ã€ãã§ããããšã©ãŒãã§ãã¯ã«åœ¹ç«ããªãããšã§ãã
ïŒæå°ãªããžããªã§ã¯ãæåã®ã³ã³ããŒãã³ãã¯2çªç®ã®ã³ã³ããŒãã³ããžã®åç §ãå¿ èŠãšããŸããããã§ãªãå ŽåãããŒã«ã¢ããããªãŒããã³ãã«ããé¢ããŸãïŒ
@danimohãããã³ã³ããã¹ããä»ããŠããŒã«ã¢ããããã¢ãžã¥ãŒã«ãœãŒã¹ãååŸããæ¹æ³ã¯ãããŸããã ãã®ã»ãšãã©ã¯vueãã©ã°ã€ã³åŽã§å®è¡ã§ããŸãïŒç§ã¯ããã§ã±ãŒã¹ãéããŸããïŒããrpt2ããããã€ã³ããŒãããã¹ã¯ãªãããå€æããåã«æœåºãããã¹ã¯ãªãããå€æããå¿ èŠããããªã©ãæœåšçãªèœãšãç©ŽããŸã ãããŸãã
vueåé¡ã¹ã¬ããã§èª¬æããã¢ãããŒãã§ã¯ãvueãã¡ã€ã«ã®ã€ã³ããŒããæ¬è³ªçã«ç¡èŠããããŒã«ã¢ããããã¡ã€ã«ãtypescriptã«ãã£ãŒãããã¯ããã®ãåŸ ã€ãããtypescriptã§ãã¡ã€ã«ã1ã€ãã€åŠçããå¿ èŠããããšæããŸãã ãããã£ãŠããã¡ã€ã«éã®åãã§ãã¯ãç·©ããããšã«ãªããŸãã
vueãã©ã°ã€ã³ã«tsãåŠçããã代ããã«ã以äžã¯æå¹ãªã¢ãããŒãã§ããã以åã«ææ¡ããéãããã¯ã®äžçš®ã®ããè¯ãå埩ã§ããå¯èœæ§ããããŸãã
options
ããã¯ãä»ããŠå
¬éãããŠããŸããïŒtransform
ã¡ãœãããåŒã³åºãããšãã§ããŸããCompilerHost
ãšLanguageServiceHost
ã«ã¹ã¿ã fileExists
ãã£ãŒãã§ããããã§ãã readFile
ã getScriptSnapshot
ãªã©ã.vue
ãã¡ã€ã«ã®å Žåã¯vueãã©ã°ã€ã³ã«ãªã¯ãšã¹ãããããšãã§ããŸãã ãã¹ãŠã®vueãã¡ã€ã«ã«ã€ããŠãæœåºãããã¿ã€ãã¹ã¯ãªããã³ãŒãããã£ãã·ã¥ãã readFile
ãªã©ã®ã¡ãœãããäžæžãããŠã vue
ã€ã³ããŒãçšã«ãã£ãã·ã¥ãããtsã³ãŒããè¿ããŸããç·šéïŒå®éã fileExists
ãšreadFile
ãäžæžãã§ããå Žåã¯ãã¿ã€ãã¹ã¯ãªãããã€ã³ããŒããããã¹ãŠã®ã€ã³ããŒãã«å¯ŸããŠãããã®ã¡ãœãããåŒã³åºãã ããªã®ã§ãASTããã©ããŒã¹ããŠèªåã§ã€ã³ããŒããåéããå¿
èŠã¯ãããŸãããããããã®æ¹æ³ã 次ã«ãvueãã©ã°ã€ã³ããªã³ããã³ãã§åŒã³åºãå¿
èŠããããŸãã
Vueãã©ã°ã€ã³ã€ã³ã¹ã¿ã³ã¹ãå ¬éãããŠããå¯èœæ§ããããŸããããŒã«ã¢ããããã©ã°ã€ã³ãçžäºã«åŒã³åºãããšãæåŸ ããŠãããã©ããããã®å Žåã«äœããïŒããã«ãŸãã¯å°æ¥ïŒå£ãããã©ããã¯ããããŸããã
2çªç®ã®ãã€ã³ãã¯æ©èœããŸãããããããŸãã«LanguageServiceHost
ç®çã§ãã
ãã®ã¢ãããŒãã¯æ©èœããå¯èœæ§ããããŸããäž»ãªæ¬ ç¹ã¯ãvueãã©ã°ã€ã³ãšã®çµåãå£ããããããšãšã䜿ãæšãŠäœæ¥ã®ããã®äœåãªãµã€ã¯ã«ã§ãã
ããŒã«ã¢ããã«ããã©ã°ã€ã³ãå€æãäžæ¢ããçŸåšã®ãã¡ã€ã«ãåè©Šè¡ãããåã«å€æãããäŸåé¢ä¿ã宣èšããæ¹æ³ãããã°ããã®ã§ãããããã¯ãããã«å®è£ ã§ããŸã...
䜿ãæšãŠã®ä»äºã¯å®éã«ã¯ãªããšæããŸãã Typescriptã¯ã³ãŒãã1åã ãã³ã³ãã€ã«ããæœåºãããtsã³ãŒãããã£ãã·ã¥ããå Žåãvueãã©ã°ã€ã³ã¯ãã¹ãŠã®ãã¡ã€ã«ã1åã ãåŠçããå¿ èŠããããŸãã ãã®ã¢ãããŒãã¯ãããèªäœã®çµæãã以åã®ææ¡ä»¥å€ã®ä»ã®ãã©ã°ã€ã³ã®çµæãç Žæ£ããŸããã
ãããããŒã«ã¢ããã§ã¯ã¢ãŒããã¯ãã£ã®å€æŽãå¿
èŠã«ãªããŸãã ãã¶ãããã®ãããªãã®ãå®è£
ããããã«ããã§åé¡ãéãããšãã§ãããããããŸããããããã¯ããããæéããããã§ãããã
ãŸãããããç©äºãæ¬åœã«è¯ããããã©ãããããããŸããã ãã¹ãŠã®ãã¡ã€ã«ã§åãã§ãã¯ãè¡ãã«ã¯ã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"ã䜿çšããŠVueSFCããã¢ãžã¥ãŒã«ãäœæããããã®æè¯ã®æ¹æ³ã§ãããã©ããã¯ããããŸããã
ãã®èšå®ã§ã¯ãåäžã®vueã³ã³ããŒãã³ããã³ã³ãã€ã«ããããšãã§ããŸãã
ããã§ãããããã¯å®éã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸããã ããã¯HelloWorldã§ãã åé¡ãç解ããã®ã«èŠåŽããŠãã人ã®ããã«ããããç§ãéãããã®ã§ãã
ã©ãããŠïŒ ããã«äŸããããŸãïŒ
<script lang="ts">
import Bar from './Bar.vue';
...
</script>
1ïŒvueãã©ã°ã€ã³ã¯ã¹ã¯ãªãããtypescriptãã©ã°ã€ã³ã«æž¡ããŸã
2ïŒtypescriptãã©ã°ã€ã³ã¯.vue
ãã¡ã€ã«ãæ€åºããŸãããããŒã«ã¢ããã¯ãã©ã°ã€ã³ãwebpackãªã©ã®ã€ã³ããŒãã§ä»ã®ãã©ã°ã€ã³ã«å»¶æããã¡ã«ããºã ãæäŸããªãããããããã©ãåŠçããããç¥ãæ¹æ³ããããŸããã éåžžã®JSã¯ãã©ã°ã€ã³ã«åŸãããšãã§ããŸããããã©ã°ã€ã³ã«ãã£ãŠãã§ã«åŠçãããŠããã³ãŒãã¯ã§ããŸããã
3ïŒãããlang=scss
ãŸãã¯lang=ts
ãšç°ãªãçç±ã¯å®éã«ã¯ããããŸããããããããããã§ãã
ããŠãç§ã¯äœãã§ããŸããïŒ
ããŸããªãã
ããããvuetifyïŒ buefyïŒ
Vuetifyã¯ã¿ã€ãã¹ã¯ãªããã§ãããSFCã䜿çšããŸããã ããã¯çŽç²ãªã¬ã³ããªã³ã°é¢æ°ã§ãã
Buefyã¯SFCãšããŒã«ã¢ããã䜿çšããŸãããã¿ã€ãã¹ã¯ãªããã¯äœ¿çšããŸããã
ã§ããæ¬åœã«ç§ã«ã§ããããšã¯äœããããŸãããïŒ
ããªãã¯ãããæ°ã«å ¥ããªãã§ãããã typescriptãã¡ã€ã«ããã€ã³ããŒãããå¿ èŠã®ãããã¹ãŠã®Vueãã¡ã€ã«ã«ã€ããŠãéåžžã®javascriptãã¡ã€ã«ã®ä»²ä»ãäœæããå¿ èŠããããŸãã
import Bar from './Bar.vue';
export default Bar;
ããããŠåããŠãããŒã«ã¢ããã䜿çšããŠtypescriptSFCã³ã³ããŒãã³ãã©ã€ãã©ãªãæ§ç¯ã§ããããã«ãªããŸãã
ãããããã¯åžã
ããªããããè¯ã解決çãæãã€ãããªããç§ã¯ãããèããŠã¿ããã§ãã
æãåèã«ãªãã³ã¡ã³ã
ããã§ãããããã¯å®éã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸããã ããã¯HelloWorldã§ãã åé¡ãç解ããã®ã«èŠåŽããŠãã人ã®ããã«ããããç§ãéãããã®ã§ãã
ããŒã«ã¢ããã¯æåéããããè¡ãããšã¯ã§ããŸãã
ã©ãããŠïŒ ããã«äŸããããŸãïŒ
1ïŒvueãã©ã°ã€ã³ã¯ã¹ã¯ãªãããtypescriptãã©ã°ã€ã³ã«æž¡ããŸã
2ïŒtypescriptãã©ã°ã€ã³ã¯
.vue
ãã¡ã€ã«ãæ€åºããŸãããããŒã«ã¢ããã¯ãã©ã°ã€ã³ãwebpackãªã©ã®ã€ã³ããŒãã§ä»ã®ãã©ã°ã€ã³ã«å»¶æããã¡ã«ããºã ãæäŸããªãããããããã©ãåŠçããããç¥ãæ¹æ³ããããŸããã éåžžã®JSã¯ãã©ã°ã€ã³ã«åŸãããšãã§ããŸããããã©ã°ã€ã³ã«ãã£ãŠãã§ã«åŠçãããŠããã³ãŒãã¯ã§ããŸããã3ïŒããã
lang=scss
ãŸãã¯lang=ts
ãšç°ãªãçç±ã¯å®éã«ã¯ããããŸããããããããããã§ããããŸããªãã
Vuetifyã¯ã¿ã€ãã¹ã¯ãªããã§ãããSFCã䜿çšããŸããã ããã¯çŽç²ãªã¬ã³ããªã³ã°é¢æ°ã§ãã
Buefyã¯SFCãšããŒã«ã¢ããã䜿çšããŸãããã¿ã€ãã¹ã¯ãªããã¯äœ¿çšããŸããã
ããªãã¯ãããæ°ã«å ¥ããªãã§ãããã typescriptãã¡ã€ã«ããã€ã³ããŒãããå¿ èŠã®ãããã¹ãŠã®Vueãã¡ã€ã«ã«ã€ããŠãéåžžã®javascriptãã¡ã€ã«ã®ä»²ä»ãäœæããå¿ èŠããããŸãã
ããããŠåããŠãããŒã«ã¢ããã䜿çšããŠtypescriptSFCã³ã³ããŒãã³ãã©ã€ãã©ãªãæ§ç¯ã§ããããã«ãªããŸãã
ããªããããè¯ã解決çãæãã€ãããªããç§ã¯ãããèããŠã¿ããã§ãã