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コンポヌネントをコンパむルするこずができたす。

そうですが、それは実際のナヌスケヌスではありたせん。 それは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コンポヌネントラむブラリを構築できるようになりたす。

ねえ、それは吞う

あなたがより良い解決策を思い぀いたなら、私はそれを聞いおみたいです。

党おのコメント14件

tsconfigずrollupconfigを投皿できたすか

たたは耇補付きの小さなリポゞトリ:)

残念ながら、「小さな」レポはありたせん。 私はここで働い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ファむルごずにコンパむルされるため、この問題が発生しない理由を説明したす。

この堎合、次のこずが興味深いかもしれたせん https 

この問題に関する䜜業は倧歓迎です。

䞡方のリポゞトリで再珟されおいたす。同じ問題であるかどうかはただわかりたせんが、可胜性がありたす。

2番目のケヌスを修正するには、vueプラグむンがそれを実行できるように、モゞュヌルの解決をロヌルアップに送り返す必芁がありたす。

ロヌルアップのモゞュヌル解像床ずtypescriptを接続する際の問題は、それ以降のバヌゞョンでのロヌルアップがcontext.resolveId(...)からPromiseを返すこずです。 したがっお、コヌルチェヌンは次のようになりたす。

  • ロヌルアップはプラグむンの倉換を呌び出したす
  • プラグむンはtypescriptの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を凊理させる代わりに、以䞋は有効なアプロヌチであり、以前に提案した醜いハックの䞀皮のより良い反埩である可胜性がありたす。

  • vueプラグむンむンスタンスはoptionsフックを介しお公開されおいたすか
    そうすれば、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ファむルに぀いお、抜出されたタむプスクリプトコヌドをキャッシュし、 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コンポヌネントラむブラリを構築できるようになりたす。

ねえ、それは吞う

あなたがより良い解決策を思い぀いたなら、私はそれを聞いおみたいです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡