React: 【傘】サスペンスを攟す

䜜成日 2018幎07月13日  Â·  83コメント  Â·  ゜ヌス: facebook/react

この問題を䜿甚しお、Suspenseをオヌプン゜ヌスにリリヌスするための残りのタスクを远跡したしょう。

初期リリヌスMVP

芯

  • [x]任意のレンダリングフェヌズ関数内からコンテキストを読み取るAPI@acdlite[13139]
  • [x]タむムアりトしたコンテンツを削陀するのではなく非衚瀺にする@acdlite[13120]
  • [] Reactルヌト@acdliteごずのコンテキストプロバむダヌの自動泚入[13293]
  • []削陀unstable_接頭蟞からAsyncMode 倚分
  • []同期thenablesのサポヌト、およびレンダリングフェヌズが完了する前に解決されるPromiseのサポヌト。

    • []゚ラヌをスロヌする同期thenableが正しく凊理されおいるこずを確認したす

  • [] <div hidden>で動䜜するこずを確認したす[13089]
  • []フィクスチャ内のいく぀かの詳现リンクを1぀ず぀クリックするず、次のリンクをクリックする前にプレヌスホルダヌの遅延よりも短い時間埅っおも、最終的に倧きなプレヌスホルダヌが発生するのはなぜですかツむヌトを参照。

シンプルキャッシュプロバむダヌ

  • []キャッシュの無効化@acdlite[13337]
  • []サブスクリプション@acdlite[13337]
  • []実際の名前を決める

コヌド分​​割

  • [x]コンポヌネントタむプずしおpromiseをサポヌト
  • [x]たぶんオヌプン゜ヌスlazyLoadComponent 

レンダラヌのテスト

  • [] flushAll 、 yieldなどのパブリックAPIを完成させる

    • 暫定的な蚈画は、䞻芁なテストフレヌムワヌクごずにカスタムマッチャヌを公開するこずです。

ドキュメント

  • []ブログ投皿
  • [] React.Placeholder
  • [] simple-cache-provider
  • []名前のないコヌド分割ラむブラリ

フォロヌアップ

゜フト有効期限https://github.com/facebook/react/issues/14248

  • []祖先ではないむンプレヌス読み蟌みむンゞケヌタヌのAPIを実装する
  • []むンラむンスピナヌが十分に速い堎合は、フラッシュを回避する方法があるこずを確認しおください

ストリヌミングサヌバヌレンダラヌ

  • [] @acdliteのZEITトヌクにあるようなストリヌミングサヌバヌレンダラヌを実装する
  • []郚分的な氎分補絊

関連タむムスラむシング傘https://github.com/facebook/react/issues/13306

React Core Team Umbrella

最も参考になるコメント

@mschipperheyn

これは耇数幎にわたるプロゞェクトです。 正盎な答えは、2幎前に始めたずきに思っおいたよりもはるかに倚くの仕事を生み出したずいうこずです。

しかし、幞いなこずに、珟圚は本番環境で頻繁に䜿甚しおいる

今日のさたざたなワヌクストリヌムの倧たかな状態は次のずおりです。

  • <Suspense>ずコヌド分割のためのAPI lazy 。 React 16.6で出荷

    • ご存知かもしれたせんが、これはすでに䜿甚できたす。

  • 䞊行モヌドAPI、䟋 createRootおよびuseTransition 。  experimentalリリヌスで利甚可胜

    • Fluxのようなラむブラリの互換性゜リュヌション。 進行䞭@ bvaughn 、https//github.com/reactjs/rfcs/pull/147

    • 優先モデルをより賢明なモデルに倉曎したす。 進行䞭@ acdlite 、https//github.com/facebook/react/pull/18612

    • 最埌の保留䞭の遷移のみを終了させたす。 進行䞭@acdlite

    • オフスクリヌンAPI進行䞭@lunaruan

    • サスペンスのコンテンツを非衚瀺/衚瀺するずきの火の効果

    • オフスクリヌンのコンテンツを非衚瀺/衚瀺するずきの火の効果

    • 必芁に応じおポヌタルの子を衚瀺および非衚瀺にする

    • スケゞュヌリングのための進行䞭の暙準化䜜業に合わせる開始されおいない

    • 既知の䞻芁なバグを修正したす進行䞭の@gaearonおよび@acdlite

    • むベントのセマンティクスを倉曎したす。 進行䞭@sebmarkbage @trueadm

    • ドキュメントではなくルヌトに委任しお、より段階的な採甚を可胜にしたす進行䞭、@ trueadm

    • キャプチャフェヌズで離散むベントをフラッシュしたす。

    • 呜什型コヌドでよりうたくプレむするには、デフォルトの優先床をeventから取埗するこずを怜蚎しおください。

    • 他のAPIセマンティクスずデフォルトを完成させたす。 開始されおいたせん

    • タむピングずドキュメントを曎新したす。

  • デヌタフェッチのためのサスペンス

    • コンポヌネントのシグナリングの䜎レベルのサポヌトは、レンダリングする準備ができおいたせん技術的には、安定したReactでも利甚できたすが、このAPIは安定しおいるずは芋なされたせん。

    • サヌバヌレンダラヌはサスペンスフォヌルバックを即座にフラッシュしたす実隓的なリリヌスで利甚可胜

    • GraphQLナヌスケヌスの゜リュヌションリレヌフック、出荷枈み。

    • GraphQL以倖のナヌスケヌスの゜リュヌション Next.jsず共同で@sebmarkbageを進行䞭。

    • デヌタ駆動型の䟝存関係のためのバンドラヌ統合。 進行䞭

    • コンテキストを含むブロックAPIをファむナラむズしたす。

    • 䞀般的なキャッシング゜リュヌション。 開始されおいたせん

    • ある皮のルヌタヌ統合。

たるで「Facebookで制䜜䞭なので、完成です」ず感じたす。

私はそれがこのようにどのように芋えるかを芋るこずができたすが、この読曞は少し意気消沈したす。 :-)私たちは過去数ヶ月間、これにノンストップで取り組んできたした。技術的な偎面の倚くは、完成しおいるか、ほが完成に近づいおいたす。 残りの䜜品のほずんどは2぀のカテゎリに分類されたす。

  • 安定したリリヌスでそれらをセメントで固定する前に、初期蚭蚈で発芋した欠陥を修正したす。 珟圚持っおいるものをリリヌスする堎合は、数か月以内に倧幅な倉曎を行う必芁がありたす。 それは玛らわしいだけでしょう。

  • ゚コシステムの互換性ず適切なデフォルト。 ラむブラリや既存のアプロヌチでは機胜しないため、今日誰も䜿甚できないものをリリヌスしおも圹に立ちたせん。 したがっお、䜜業の倧郚分たずえば、 useMutableSourceを介したFluxのようなラむブラリずの互換性、より優れたむベントセマンティクスの遞択、掚奚されるキャッシュ戊略の出荷は、リリヌスしたものを実際に䜿甚できるように

「今日は䜿えたすか」 技術的には、今日は党郚䜿えたす。 したす。 具䜓的には、リレヌフックずコンカレントモヌドを䜿甚したす。 ただ重芁な蚈画された倉曎ず既知の問題があるため、珟圚の状態は、広く採甚される準備ができおいるず芋なす基準を満たしおいたせん。 もちろん、バグやAPIをすぐに倉曎しおもかたわない堎合は、私たちず同じように@experimentalリリヌスを䜿甚できたす。

Facebookが私たちの「成し遂げられた」ずいう点でここで特別な立堎にあるずは蚀えたせん。 たったく逆に、私たちは完了しおいたせん。しかし、内郚的には、解玄を蚱容し、移動䞭の列車の䞊に構築するこずをいずわないのは、それが私たちが構築しおいるものがしっかりしおいるこずを知る方法だからです。 この重いドッグフヌディングがなければ、6か月で発芋した欠陥は、発芋しお再蚭蚈するのに数幎かかるでしょう。

芁玄するず、やるべきこずはただたくさんありたす。

党おのコメント83件

unstable_AsyncMode公開したす倚分

これはすでに公開されおいたせんか

unstable_を削陀する

名前のないコヌド分割ラむブラリのオヌプン゜ヌスを楜しみにし

[傘]ずはどういう意味ですか🀔☂

぀たり、これはいく぀かのプロゞェクト/パッケヌゞ/ツヌルに圱響を䞎える機胜です。

@ghoullierなるほど、ありがずうございたした

ねえ@acdlite 、これに最適な準備をする方法に぀いおの質問です。 どんな皮類のタむムラむンも求めおいない/期埅しおいないが、疑問に思っおいる

珟圚、これらの機胜がReact 16に組み蟌たれ、16.3でリリヌスされた新しいContext APIのように、段階的に簡単に採甚できるこずを期埅しおいたすか

それずも、Reactをv17にプッシュし、採甚するためにより倚くの䜜業が必芁になるず思いたすか

私はあなたのリストにあるほずんどすべおのものず倧幅に亀差するロヌドマップに取り組んでおり、それに察凊するための最善の方法を暡玢しおいるので、尋ねたす。

たた、最善の準備方法に関するヒントはありたすか今日曞かれたコヌドに関しお、Reactのこれらの改善ず将来互換性を持たせたい-ポリフィル/テクニックなど

これらの質問が他の堎所で回答され、私がそれらを芋逃した堎合はお詫びしたす

@JedWatsonの質問に別の質問を远加したす。

  • たた、安定したリリヌスのタむムラむンを取埗する必芁はありたせんが、新しいプレリリヌスを取埗するこずは可胜/有甚でしょうか AFAIKの最新リリヌスは2月から16.4.0-alpha.0911da3です。

ありがずう ❀

IMO、圌らはそれが䞊陞する前のように以前のようにブログ投皿を提䟛するでしょう。

そしお、重倧な倉曎がないため、あたり準備する必芁はないず思いたすサスペンスを䜿甚したreduxフェッチなど、珟圚のプラクティスずは異なる/競合しおいるように芋える倚くの機胜がありたすが、codemodたたは簡単なカプセル化がありたすこれを行うには、fbに3W以䞊のコンポヌネントがありたす。 たた、 @ acdlite ZEITのssrサスペンスに぀いおず@gaearon アむスランドのクラむアントサスペンスに぀いおの話を芋るず、あたり心配する必芁がなく、䟵襲的ではないこずがわかりたす。

ちなみに、レポで「傘」キヌを怜玢するだけで、8830や12152などの詳现情報が芋぀かりたす。

AFAIKの最新リリヌスは2月の16.4.0-alpha.0911da3です。

IIRC、これは誀操䜜ですか

Facebookでサスペンスモゞュヌルず新しいAPIの展開に取り組んでいたす。 @acdliteが䜕か他のこずに忙しい堎合に

珟圚、これらの機胜がReact 16に組み蟌たれ、16.3でリリヌスされた新しいContext APIのように、段階的に簡単に採甚できるこずを期埅しおいたすか

React 16ず17のどちらが付属するかはわかりたせん。Reactチヌムによるず、Facebookでの動䜜や、関連するAPIの準備状況によっお、今幎末たでにリリヌスされる可胜性がありたす。いいえ。 しかし、コヌドに関しおは、Facebookでかなり長い間実隓を行っおきたので、採甚するのは簡単だず蚀っお嬉しいです。 サスペンス機胜は、既存のコヌドベヌスでも匕き続き機胜したす。 ただし、远加の倉曎非同期レンダリングなどを䜿甚するず、新機胜によっおもたらされるボヌナスが増えたす。

最善の準備方法に関するヒントはありたすか今日曞かれたコヌドに関しお、Reactのこれらの改善ず将来互換性を持たせたい-ポリフィル/テクニックなど

移行はかなり段階的で進歩的だず思いたす。 @ NE-SmallTownが蚀ったように、私たちは重倧な倉曎を導入したくありたせん。 コヌドベヌスが非垞に倧きいため、Facebookに展開するのも面倒です。 しかし、これたでのずころ、展開はスムヌズであり、远加の倉曎を行う必芁はありたせん。

@JedWatson

珟圚、これらの機胜がReact 16に組み蟌たれ、16.3でリリヌスされた新しいContext APIのように、段階的に簡単に採甚できるこずを期埅しおいたすか

埐々に。 垞に段階的に:)そうでなければ、Facebookでこれを出荷する方法はありたせん。

これが私が期埅しおいるこずです

| | クラむアント| サヌバヌ偎のレンダリング|
| ----------------- | ---------------------------- |- -------------------------------------------- |
| サスペンス| どこでも動䜜したす* | 既存のサヌバヌレンダラヌず同じ制玄|
| 非同期レンダリング| <AsyncMode>を䜿甚したオプトむン| 既存のサヌバヌレンダラヌず同じ制玄|

*同期モヌドでは、 delayMsは垞に0です。 プレヌスホルダヌはすぐに衚瀺されたす。

サスペンスは、既存のコンポヌネントに倉曎を加えるこずなく機胜したす。 ある時点で<StrictMode>互換性が必芁になるかもしれないず思っおいたしたが、内郚テスト䞭に、厳密モヌドにアップグレヌドするための最良の方法の1぀はサスペンスを䜿甚するこずでした。 鶏が先か卵が先かずいうゞレンマ。 そこで、strictモヌドの倖でも機胜させる方法を芋぀けたした。

぀たり、ナヌザヌは非同期レンダリングに移行する準備ができる前であっおも、サスペンスぞの移行を開始するずいう考え方です。 次に、サブツリヌの準備ができたら、 <AsyncMode>ラップしおオプトむンできたす。

ただし、新しいアプリの堎合、話は異なりたす。デフォルトで非同期になりたす。 非同期のみの新しいルヌトAPI ReactDOM.render代わりを玹介したす。

最初のリリヌス埌、倚くのサヌドパヌティフレヌムワヌクRedux、Apollo、React Router ...が非同期モヌドで正しく機胜しない可胜性がある厄介な期間がありたす。 それはしばらくの間採甚を傷぀けるかもしれたせん。 しかし、その考え方は、新機胜が非垞に魅力的であるため、ラむブラリが適応するか、非同期互換の代替手段に取っお代わられるのにそれほど時間はかからないずいうこずです。

たた、最善の準備方法に関するヒントはありたすか今日曞かれたコヌドに関しお、Reactのこれらの改善ず将来互換性を持たせたい-ポリフィル/テクニックなど

すべおを<StrictMode>ラップし、譊告がないこずを確認したす。 リリヌスが近づくに぀れお、より詳现な移行ガむドが提䟛されたす。

最初のリリヌス埌、倚くのサヌドパヌティフレヌムワヌクRedux、Apollo、React Router ...が非同期モヌドで正しく機胜しない可胜性がある厄介な期間がありたす。

アポロは厄介なこずはしたせん-私たちは準備ができおいたす 🕺😳

真面目な話ですが、私たちはheartすべおがReactなので、最初のリリヌスでこれらの倉曎に察応しおいるこずを確認するこずは、優先床が高いだけでなく、私たちが非垞に興奮しおいるこずでもありたす。 この@acdliteでのすばらしい䜜業に感謝したす

チャむムを鳎らしお、ReduxチヌムがReact-Reduxの非同期互換性に取り組んでいるず蚀いたす。

https://github.com/reduxjs/react-redux/issues/950で朜圚的なロヌドマップをレむアりトしたした。 TL; DR

  • React-Redux 5.1は、譊告なしで<StrictMode>で動䜜するこずを願っおいたす珟圚のPRhttps//github.com/reduxjs/react-redux/pull/980
  • 6.0は、新しいコンテキストAPIを䜿甚し、参照転送を远加し、堎合によっおはその他の倉曎を加えるための内郚曞き換えになりたすが、珟圚のパブリックAPIをできるだけ倚く維持するようにしおください぀たり、 <Provider>ずconnect() 。 それが非同期レンダリングでどれほどうたく機胜するかを芋お、前進するための最良の道を芋぀けたす。 私の以前の抂念実蚌PRはhttps://github.com/reactjs/react-redux/pull/898にありたすが、5.1の䜜業から孊んだ他の教蚓に基づいお、おそらくやり盎したす。このリリヌスでは、新しいコンテキストず、おそらくマヌゞされたばかりのただリリヌスされおいない「ラむフサむクルメ゜ッドからのコンテキストの読み取り」PRが必芁なため、少なくずもReact16.5が必芁になりたす。
  • その埌、別のReact-Redux APIのアむデアを受け入れたすはい、はい、レンダリングの小道具や人が含たれる可胜性がありたす。

WIPにもっず泚目しおいただければ幞いです。たた、React Suspenseず非同期レンダリングでReduxをどのように䜿甚しおいるかに぀いお、ナヌスケヌスが適切にカバヌされるように、フィヌドバックやディスカッションを提䟛しおいただければ幞いです。 たた、Reactチヌムず、どのような制玄を凊理する必芁があるかに぀いおさらに話し合うこずを望んでいたす。すべおの問題を解決するために必芁な問題を確認できるサンプルアプリを入手できれば䟿利です。これは正しく機胜したす。

非同期レンダリングずサスペンスのリリヌスを楜しみにしおいたす

@acdliteサスペンスず非同期レンダリングに぀いおも質問したす。
私の質問は、それらが導入されお、その新しいバヌゞョンのreactでアプリを曞き始めるず、それは、react APIず、reactでの人々のコヌディング方法も倉わるこずを意味したすか サスペンスず非同期レンダリングの機胜を䜿甚する予定がない堎合でも

サスペンスず非同期レンダリングを䜿甚しおreactコヌドを䜜成するのは難しいず思いたすがおそらくいく぀かの新しいAPIたたはその他の制玄のため、それを必芁ずしない人にずっおは、なぜ新しい方法でreactを䜿甚するように匷制するのですか そしお、圌らが今のように反応しおコヌディングするこずを蚱可したせんか

サスペンスでreactコヌドを曞くのは難しいかもしれないず思いたす

私の話の埌半を芋る機䌚がありたしたか 私はたったく逆だず思いたす—デヌタフェッチにサスペンスを䜿甚するこずは、他の䜕よりもRedux、ロヌカル状態、たたは他のラむブラリを含む、はるかに難しいこずではありたせん。

@gaearon私はしおいたせん。 私は理論的にもっず話しおいたした。 反応を知っおいる人々のセットがすでにあるず想像しおください。 人々が非同期レンダリングずサスペンスの機胜を必芁ずしないのなら、なぜ圌らに「新しい」反応を孊ばせるのでしょうか 特に「新しい」反応を䜿甚するのが難しい堎合はどうでしょうか。 しかし私は十分な情報を持っおいないので、「トリッキヌ」な郚分に぀いお間違っお蚀うかもしれたせん-私は私の考えのいく぀かを共有しおいるだけです:)。

ある意味で、アプリの10にサスペンスず非同期レンダリングの機胜が必芁な堎合、他の90のケヌスでは、なぜ人々に「新しい」反応を孊ばせるのでしょうか。 しかし、サスペンスず非同期レンダリングに関する情報をただ倚く収集しおいなかったため、間違っおいる可胜性がありたす。

私のデモをただ芋おいないず、䌚話をするのは難しいず思いたす。

明確にするために 「新しいReact」はありたせん。これらの機胜は既存のパタヌンを壊したせん🙂。 それらは盞加的です。 これらの機胜を䜿甚するために、たったく異なる方法でコヌドを蚘述する必芁もありたせん。ただし、䞀郚の機胜は、最新のラむフサむクルメ゜ッドを

これはあなたの懞念ずは盎接関係ありたせんが、私はそれらが「䜿甚するのが難しい」ずいうこずに同意したせん。 サスペンスは、珟圚存圚する他のどのロヌドメカニズムよりもはるかに簡単に䜿甚できるず思いたす。 それが私がずおも興奮しおいる理由です。 ただし、必芁がなければ、新しい機胜叀いパタヌンは機胜し続けたす。

私は本圓に私の話を芋るこずをお勧めしたす。 これらの機胜が実際に動䜜しおいるのを芋るず、これはもっず理にかなっおいるず確信しおいたす。

@gaearon

叀いパタヌンはすべお機胜し続けたす。

フィヌドバックをありがずうダン。 そうですね、そういう機胜が必芁ないのなら、機胜が远加される前のやり方で曞けるはずだず思いたす。

幞運を。

ちょっずダン@gaearon、私は぀たらないこずではありたせんが、それを理解したいず思いたす。 あなたの䞊に蚀った

ただし、必芁がなければ、新しい機胜を䜿甚する必芁はありたせん。 叀いパタヌンは機胜し続けたす。

これは、「叀い」Reactで行ったのず同じ方法で新しいReactでコヌディングできるこずを瀺唆したす。たずえば、ラむフサむクルメ゜ッドを同じ方法で䜿甚できるなどです。

ただし、ここで、bvaughnは、getDerivedStateFromPropsたたはcomponentWillReceivePropsは、1回の曎新で䜕床も呌び出される可胜性があるため、その䞭のデヌタをフェッチしない゜リュヌションであるず述べおいたす。

だから私の質問は、結局のずころ、新しいReactを以前ずたったく同じように䜿甚するこずはできないようですよね 珟圚のreactcomponentWillReceivePropsのAFAIKは、1回の曎新で䜕床も呌び出されないので、そうではありたせんか

@ giorgi-mはい、ラむフサむクルメ゜ッドは倉曎されおいたすが、芁点は、サスペンス自䜓がオプトむン機胜であるずいうこずです。 既存のすべおのReactレンダリングメ゜ッドずReactのレンダリング動䜜はそのたた機胜したす。 ただし、アプリの䞀郚に<AsyncMode>タグを远加しおオプトむンするず、非同期デヌタのニヌズを瀺すためにSuspenseのアプロヌチを䜿甚し始め、それを利甚できるようになりたす。 それをコヌドベヌスに远加しないず、それは起こりたせん。

@ giorgi-m componentDidUpdate componentWillReceivePropsたたはgetDerivedStateFromProps代わりにcomponentDidUpdateを䜿甚する必芁がありたす。

@markerikson぀たり、ここでbvaughnが蚀ったこずは、 <AsyncMode/>有効にしおいない堎合、1回の曎新で_getDerivedStateFromProps_を䜕床も呌び出すこずができるずいうこずですが、必ずしもそうずは限りたせん。
そのような質問をしお申し蚳ありたせんが、時々私にポップアップし、すべおをカバヌするリ゜ヌスが芋぀かりたせんでした。

ps。 bvaughnはたた、リンクされたスレッドでそれのオプション性に぀いお蚀及しおいなかったので、それは私の疑いを匕き起こしたした。

非同期曎新をキュヌに入れるためのメ゜ッドたずえば、レンダラヌ固有のunstable_deferredUpdates()ではなくクラスコンポヌネントのdeferSetState() unstable_deferredUpdates() をコアチェックリストに远加する必芁がありたすか

私の理解では、非同期modeファむバヌの曎新は非同期になりたす。぀たり、理論的にはdeferSetState()は䞍芁です。 ただし、 unstable-async/suspenseデモでは、同期曎新ず非同期曎新が混圚しおいるため、 asyncモヌド「ナニバヌサル」コンポヌネントの堎合でこれをどのように実行できるかわかりたせん。

タむムスラむス傘のチェックリストに茉っおいたす。

コンポヌネントタむプずしおpromiseをサポヌト

これに関連しお、あなたが持っおいるずき

const PromiseType = new Promise(() => {})
class A extends Component {
    componentDidMount() {}
    componentDidUpdate() {}
    render() {
        return <div><PromiseType></PromiseType></div>
    }
}

componentDidMountずcomponentDidUpdateラむフサむクルがい぀呌び出されるかに぀いおのヒュヌリスティックはありたすか。

  1. すべおの子䟛が解決されたずき玄束を含む、これは、玄束が決しお解決されない堎合、子䟛が呌び出されないこずを意味したすか
  2. すべおの即時ホストの子がレンダリングされたら

@thysultan  componentDidMountずcomponentDidUpdateは、UIツリヌが完党にレンダリングされおDOMに適甚されたずきに、コミットフェヌズで呌び出されたす。

したがっお、サスペンスに぀いおの私の理解に基づくず、答えは、 Aむンスタンスが実際にマりントされるこずは決しおないずいうこずだず思いたす。 PromiseType _did_が解決されたが、その子孫の1぀も解決されない玄束を埅ずうずした堎合、再びマりントされるこずはありたせん。 したがっお、これらの䟋ではcDMずcDUは実行されたせん。

ここで私の仮定が間違っおいる堎合は、誰かが私を修正しおください:)

ええ、 componentDidMountたたはcomponentDidUpdateは、ツリヌ党䜓が解決された埌にのみ実行されるコミットフェヌズでのみ実行されたす。 このツリヌには、明瀺的に配眮したプレヌスホルダヌが含たれおいる堎合がありたす十分に埅機した埌も、その䞭の䜕かが䞭断するかどうかによっお異なりたす。ただし、プレヌスホルダヌなしで子を明瀺的にレンダリングするず、最終的には「準備ができおいない」状況。

私はこれで遊ぶこずができるこずを本圓に楜しみにしおいたすあなたがただワヌルドワむドりェブにこれの実甚的なバヌゞョンを眮いおいないこずを理解するためだけにたくさんの゜ヌスコヌドを閲芧したした。

これをリリヌスするために私たちにできるこずはありたすか D

プレむしたい堎合は、マスタヌからコンパむルできたす。 fixtures/unstable-async/suspense手順を参照しおください

@gaearonこれは珟圚の状態のクラむアント偎のみであるず私は正しいですかサヌバヌ偎のレンダリングをサポヌトするためにさらに倚くの䜜業を行う必芁がありたす

線集、答えを芋぀けたしたナニバヌサルアプリのSSRでサスペンスを䜿甚するこずを熱心に探しおいる他の人のために。 私はこれが今のずころクラむアント偎であるこずを私たちに知らせるダンによるhttps://www.youtube.com/watch?v=z-6JC0_cOnsも瀺しおい

実際、SSRのケヌスに関連する䜜業を間もなく開始したす。

ロヌ゚ンドのモバむルデバむスで実行されおいる非同期Reactアプリでこのシナリオを想像しおみおください。

  1. すべおのCPUを䜿甚した倖郚広告の読み蟌みがありたす😓
  2. ナヌザヌがリンクをクリックするず、ルヌタヌが新しいレンダリングをトリガヌしたす
  3. Reactは非同期モヌドであるため、Chrome / SafariがCPUの䜿甚を蚱可するたで埅機したすが、広告はさらに3秒間読み蟌たれ続けたす
  4. ナヌザヌはアプリが機胜しおいないず考えおいたす

この問題は、サスペンスで説明したのず同じ<Placeholder>テクニックを䜿甚しお回避できたす。たずえば、1秒埌にスピナヌが衚瀺されたす。

このシナリオは考慮されおいたすか <Placeholder>は遅い非同期レンダリングで機胜したすか

@luisherranzこれを防ぐには2぀のメカニズムがありたす。

  1. Reactには、すべおの曎新に関連付けられた期限がありたす。 クリックやこのような他のむンタラクションからの曎新は、より長い期限を明瀺的に遞択しない限り、玄150ミリ秒以内にフラッシュされるはずですたずえば、必須ではない曎新の堎合。 そのため、䜕かがスレッドを占有しおいる堎合、Reactは同期的にフラッシュを匷制したす。

  2. Reactは、実際にはrequestIdleCallback䜿甚しなくなりたした。これは、実際、ブラりザヌがそれをスケゞュヌルするのに十分積極的ではないためです。 正確なスケゞュヌリングアプロヌチも時間の経過ずずもに倉化する可胜性がありたすが、これは間違いなく私たちが気にかけおいるこずです。

ダンの玠早い回答に感謝したす。

  1. Reactには、すべおの曎新に関連付けられた期限がありたす

玠晎らしい。 テストできるAPIはすでに甚意されおいたすか

  1. Reactは実際にはrequestIdleCallbackを䜿甚しなくなりたした。これは、実際にブラりザヌがそれをスケゞュヌルするのに十分積極的ではないためです。

それは私たちも実隓したこずです。 TwitterやYouTubeからの倖郚広告や埋め蟌みがある混雑したアプリでは、 requestIdleCallbackが呌び出されおレンダリングが完了するたで、数秒かかる堎合がありたす。 だから👍それに。

ずころで、私たちにずっお、あなたの最初の答えに関連する別のナヌスケヌスがありたす私たちは2぀のオフセットを持぀レむゞヌロヌドを䜿甚しようずしおいたす。 1぀目は非同期レンダリングをトリガヌし、2぀目は非同期が終了しおいない堎合に同期レンダリングをトリガヌしたす。 このようなもの

  1. ナヌザヌが䞋にスクロヌルするず、重い芁玠から1200pxになりたす。たずえば、ブログの次の投皿です。
  2. 最初のoffetは、次の投皿の非同期レンダリングをトリガヌしたす。
  3. ナヌザヌは䞋にスクロヌルし続け、次の投皿の600pxになりたす。
  4. 2番目のオフセットトリガヌ非同期投皿が終了した堎合componentDidMountが呌び出された堎合は䜕も起こりたせんが、終了しなかった堎合は、投皿党䜓の同期レンダリングがトリガヌされたす。

したがっお、時間の代わりに、2番目のトリガヌでフラッシュを制埡したいず思いたす。 それは意味がありたすか それは可胜でしょうか

テストできるAPIはすでに甚意されおいたすか

マスタヌを意味するかどうかはわかりたせんが非同期モヌドはnpmリリヌスでは公匏には利甚できたせん、有効期限はすべおの曎新に自動的に割り圓おられたす。 クリックなどのむベントの堎合、本番モヌドでは玄150ミリ秒です。 特別な䞍安定なAPIが必芁な堎合は、延期されたより長い曎新を遞択できたすが、蚭定するこずはできたせん。

したがっお、時間の代わりに、2番目のトリガヌでフラッシュを制埡したいず思いたす。 それは意味がありたすか それは可胜でしょうか

ええ、それは可胜です。 私はここでこのようなメカニズムを説明したした https //github.com/oliviertassinari/react-swipeable-views/issues/453#issuecomment-417939459。

マスタヌを意味するのかどうかはわかりたせん非同期モヌドはnpmリリヌスでは公匏には利甚できたせん

はい、 <unstable_AsyncMode> 、 flushSync 、 unstable_deferredUpdatesのnpmパッケヌゞを䜿甚しおいたす。

npmにこれらの倉曎を加えお、アルファ/ベヌタバヌゞョンのリリヌスを開始しおください。 🙏

ええ、それは可胜です。 私はここでこのようなメカニズムを説明したしたoliviertassinari / react-swipeable-views453コメント。

玠晎らしい。 unstable_deferredUpdatesを䜿甚した珟圚の実装よりもはるかに優れおいたす:)

<div hidden>䜿甚を開始するのが埅ちきれたせん。 あなたたちは玠晎らしい仕事をしおいたす。

@luisherranz泚意しおください、それらのものは䞍安定です。 バグがあるか、かなり非効率的である可胜性がありたすたずえば、重芁な最適化「再開」はただ実装されおいたせん。 新しいscheduleモゞュヌル schedule.unstable_scheduleWork を優先しお、 unstable_deferredUpdatesも削陀したす。

はい、アプリのごく䞀郚にのみ䜿甚し、集䞭的にテストしおいたすが、これたでのずころ非垞に優れおいたす:)

オフトピックになる可胜性がありたす
requestIdleCallbackは1秒間に20回しか呌び出されたせん-6x2コアのLinuxマシン䞊のChromeは、UI䜜業にはあたり圹立ちたせん。
requestAnimationFrameはより頻繁に呌び出されたすが、名前が瀺すタスクに固有です。

このため、 requestIdleCallback䜿甚を停止したした。

requestIdleCallback代わりに䜕を䜿甚しおいたすか

もちろん。 愚かな私。 スケゞュヌラモゞュヌルがrequestIdleCallback代わりに内郚でどのブラりザAPIを䜿甚するのか疑問に思いたした。 もっずはっきりず質問を提瀺すべきだった。 😅

わあ、芋぀けた。
https://github.com/facebook/react/blob/eeb817785c771362416fd87ea7d2a1a32dde9842/packages/scheduler/src/Scheduler.js#L212 -L222

それは次のレベルのクヌルです。

こんにちは、

サスペンスを理解しようずしおいるずきに、 Suspendコンポヌネントを䜿甚しおいるずきにアプリのどの郚分が実際に「䞀時停止」されおいるのかわからないこずに気づきたした😳😱。

次の䟋では、 Titleがすぐに衚瀺され、 Spinner 1000ミリ秒埌に、 UserData 〜2000ミリ秒埌に衚瀺されるず予想したすそのコンポヌネントのデヌタの「ロヌド」には2000ミリ秒かかるため。
しかし、私が芋おいるのは、 Titleが1000ms埌にSpinnerず䞀緒に最初に衚瀺されるこずです。

// longRunningOperation returns a promise that resolves after 2000ms
const UserResource = createResource(longRunningOperation);

function UserData() {
  const userData = UserResource.read(cache, "Lorem Ipsum");
  return <p>User Data: {userData}</p>;
}

function Spinner() {
  return <h1>Fallback Loading Spinner</h1>;
}

function Title() {
  return <h1>Hello World</h1>;
}

function App() {
  return (
    <React.Fragment>
      <Title />
      <Suspense maxDuration={1000} fallback={<Spinner />}>
        <UserData />
      </Suspense>
    </React.Fragment>
  );
}

unstable_createRoot(document.getElementById("mount")).render(<App />);

React 16.6.0-alpha.8af6728を䜿甚する完党な䟋はここcodesandboxにありたす

Titleすぐに衚瀺しお、アプリケヌションの他の郚分だけを「䞀時停止」する方法はありたすか それずも、おそらくサスペンスを完党に誀解したしたか この皮の質問をするより良い方法があれば、私に知らせおください

ありがずう

こんにちは@nilshartmann 玠晎らしい質問です

タむトルをすぐに衚瀺しお、アプリケヌションの他の郚分だけを「䞀時停止」する方法はありたすか

私が正しく理解しおいる堎合は、この䟋のようにTitleをDOMにフラッシュする前に、Reactに明瀺的に_埅機しない_ように指瀺しお、 Titleすぐに衚瀺し、他の郚分のみを「䞀時停止」する必芁がありたす。すぐにレンダリングされるず予想される郚分を<Suspense maxDuration={0}>ラップするこずにより、アプリケヌションの䞀郚を䜜成したす。

これは、基瀎ずなる䜎レベルのスケゞュヌラメカニズムが原因であるず思いたすか 私もこれをもっずよく理解したいのですが、それで今のずころあなたの問題は解決するはずです。

実際にそこで䜕が起こっおいるのか聞いお興奮しおいたす。

この皮の質問をするより良い方法があれば、私に知らせおください

あるかわかりたせん。 😄それは私には非垞に明癜に思えたす。 質問しおくれおありがずう

@TejasQ私のブラりザでは、サンプルをロヌドするず、フォヌルバックスピナヌがすぐにレンダリングされたす。 1000ms埌にロヌドするべきではありたせんか

@TejasQはあなたの答えに感謝したす、しかし@karlhorkyは正しいです今スピナヌはすぐに珟れたす。

うわぁ 私は逃したした。 私は詊した。 😅それをもう䞀床芋お、あなたに戻っおきたしょう。 私は䜕かを逃したに違いない。 🀷‍♂

〜曎新私はここでそれを理解しようずしおいたす。誰かがリアルタむムで䞀緒にそれを行うこずに興味があれば、私たちは協力するこずができたす。〜

2番目の曎新 @ philipp-spiessず私はそれを芋たした、そしお私は本圓に困惑しおいたす。 私はただそれを理解しおいたせん。 珟時点では、これが実際にはunstable_ずアルファ機胜であるため、バグなのか、それずも単に衚瀺されおいないものなのかはわかりたせん。

どちらの堎合でも、コアチヌムは圹立぀回答を埗るか、質問を䜿甚しおReactをさらに優れた/より芪しみやすいものにするこずができるず思いたす。

圌らが䜕を蚀わなければならないか芋おみたしょう。 😄これを指摘しおくれおありがずう、@ nilshartmann

これはReactv16.6の䞀郚ずしおリリヌスされたしたか ブログ投皿には、Suspenseを䜿甚したサンプルコヌドが瀺されおいたす。

import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));

function MyComponent() (
  <Suspense fallback={<div>Loading...</div>}>
    <OtherComponent />
  </Suspense>
);

これはReactv16.6の䞀郚ずしおリリヌスされたしたか

遅延読み蟌みのナヌスケヌスのみ、および同期モヌドのみ。 䞊行モヌドは匕き続きWIPです。

@nilshartmann

次の䟋では、Titleがすぐに衚瀺され、Spinnerが1000ミリ秒埌に、UserDataが玄2000ミリ秒埌に衚瀺されるず予想したすそのコンポヌネントのデヌタの「ロヌド」には2000ミリ秒かかるため。

maxDuration機胜に぀いお少し混乱しおいるず思いたす。 これは新しいメンタルモデルですが、これを文曞化する時間はただありたせん。 そのため、䞊行モヌドが安定したリリヌスになるたで、しばらく混乱し続けるでしょう。

フックの提案を発衚しおおめでずうございたす。 チヌムず䜕かを共有したいず思いたす。 少し前に、Suspenseに䌌た機胜を持぀ReactAsyncずいうコンポヌネントをリリヌスしたした。 基本的に、Promiseの解決を凊理し、isLoading、startedAt、reloadやcancelなどのメ゜ッドをすべお宣蚀型APIで提䟛したす useAsyncフックが進行䞭です。

今、私の䞻な関心事は、これがサスペンスずどのように統合されるかです。 ほずんどの堎合、私はおそらくReactAsyncのSuspenseAPIを䜿甚しお、Suspenseのスケゞュヌリング機胜を無料で提䟛しながら、䜿い慣れたシンプルなReact AsyncAPIをナヌザヌに提䟛できたす。 私が芋おきたこずに぀いおは、React Async APIは、より抜象的なSuspense APIず比范しお、より賢明で芪しみやすいものだず心から思っおいたす。 基本的に、React Asyncは、ナヌスケヌスのわずかに小さいサブセットで機胜するより具䜓的なAPIを提䟛しようずしたす。

ReactCacheラむブラリを知っお驚いた。 React Asyncの堎合、私は意図的にキャッシュメカニズムを含めたせんでしたが、バニラプロミスを凊理するこずを遞択したした。 その䞊にキャッシュを远加するのはかなり簡単です。

最埌に、カスタムフックからサスペンス機胜にアクセスするこずを懞念しおいたす。 サスペンスはいく぀かの組み蟌みコンポヌネントに倧きく䟝存しおいるようで、フックからこれらを䜿甚するこずは䞍可胜です私は思いたすか。 サスペンスフックはありたすか たたは、2぀を統合する他の方法はありたすか

こんにちは。 Suspense / Lazyでコヌドをテストするにはどうすればよいですか
珟圚、renderer.create...toTreeがスロヌしたす
「toTreeは、tag = 13のノヌドを凊理する方法をただ知りたせん」

Suspenseの小道具maxDurationが、同期モヌドず同時モヌドの䞡方ではなく、 Concurrent Modeでのみ䜿甚される理由。 誰かが説明するのを手䌝っおもらえたすか

珟時点では Concurrent Modeがこのツリヌを保留にしおから、匷制的にコミットするたでの期間を意味したす。これは、タむムスラむスの期限を効果的に制埡し、同期モヌドではタむムスラむスは存圚したせん。 ツリヌをコミットする前に埅機するず、必然的にコミットが行われたす...同期ではありたせん。

私はデヌタフェッチ甚の内郚アプリケヌションでSuspenseを䜿甚しおきたしたが、デヌタフェッチ甚にただ䜿甚されおいない理由にすぐに気付きたした。

ただし、最終的には、デヌタのフェッチに䜿甚するこずを目的ずしおいたす。 おそらくキャッシュプロバむダヌを陀いおAPIが倧幅に倉曎される可胜性は䜎いず思われる堎合、デヌタをフェッチした埌にデヌタを倉曎する必芁がある堎合、Suspenseはどのように機胜するのでしょうか。

䟋ずしお、これは私のアプリケヌションからの本圓にひどいフックです。

function useComponentList(id) {
  const incomingComponents = useSuspenseFetch(
    React.useCallback(() => getComponentAPI().listComponents(id), [id])
  )

  const map = React.useMemo(
    () =>
      Map(
        (incomingComponents || []).map(component => [component.id, component])
      ),
    [incomingComponents]
  )

  return useCacheValue(map)
}

このフック

  1. 指定された゚ンドポむントから指定されたコヌルバックを䜿甚しおデヌタをフェッチしたす
  2. そのデヌタをImmutableJSマップに倉換したす-これは朜圚的にコストがかかるため、操䜜をメモしたす。
  3. useCacheValueでラップされたマップを返したす。これは、特に厄介なビットです。

useCacheValueは次のようになりたす。

export default function useCacheValue(value) {
  const [state, setState] = React.useState(value)
  React.useEffect(() => {
    setState(value)
  }, [value])

  return [state, setState]
}

value倉曎デヌタが再フェッチされたこずを瀺したすに応答するフックであるずいう考えで、ナヌザヌはその状態の反応アプリ衚珟を倉曎できたす。 ある意味で、それは非垞に悪いキャッシュのように機胜したすそのため名前が付けられおいたす。

このパタヌンが珟圚の状態のReduxでどのように機胜するかを確認するのに苊劎しおいたす。 私ではないプログラマヌによっお曞かれたずき、そしおサスペンスがデヌタフェッチの「準備ができおいる」ずき、これがどのように芋えるかに぀いおの発芋はありたしたか 珟状では、これは呜什型フェッチフラグを䜿甚しおReduxを単独で䜿甚するよりもはるかに面倒です。

Reduxが独自のフックを持っおいるず、これはおそらくはるかに簡単になりたす。これは、Reduxが公開されるこずを意図しおいないコンテキストでHOCを䜿甚するこずが䞻な難しさであるためですが、それでも公匏の内容を確認したいず思いたす。答えは:)

サスペンスは、倖郚キャッシュ状態によっお駆動されるフックではないで機胜するこずを目的ずしおいたす。 単玔なナヌスケヌスで機胜するこのようなキャッシュのリファレンス実装を提䟛したす。 リレヌは独自のキャッシュメカニズムを実装したす。 他のツヌルApolloなども、互換性のある独自のキャッシュを実装できるようになり、これら2぀の実装に觊発される可胜性がありたす。

答えが必芁な質問は、突然倉異/無効化だけではありたせん。 たた、スピナヌを衚瀺するタむミング、吊り䞋げられたツリヌの倖偎にある「むンラむンむンゞケヌタヌ」などの䞀般的なパタヌン、読み蟌み状態の調敎トップダりンの順序でロックを解陀する必芁があるもの、たたはそのたた入っおくる必芁があるものに぀いおも考慮する必芁がありたす。準備完了、リストのストリヌミングレンダリング、これが郚分的な氎分補絊にどのように圱響するかなど。 私たちはこれらのこずに取り組んでいたすが、それらのいずれにも「公匏の掚奚事項」はただありたせん。 ある堎合は、曎新を発衚するブログからわかりたす。

ちなみに、デヌタフェッチのサスペンスは、人々が慣れおいるものずは十分に異なるメンタルモデルです。 Reduxのような非垞に制玄のないメカニズムず統合した堎合、必ずしもそれほど匷力になるず期埅するのは公平ではないず思いたす。 しかし、私たちは芋るでしょう。 今は䜕も蚀えたせん。

@gaearon 「私たちはこれらのこずに取り組んでいたす」ず蚀うずき、私が賌読できる問題はありたすか、それずもこれらの議論は非公開で行われおいたすか

ありがずう、 @ gaearon :)

@ntuckerい぀ものように、進行䞭のアクティビティをPRずしお芋るこずができたす。 たずえば、次のようにhttps://github.com/facebook/react/pull/14717 、 https://github.com/facebook/react/pull/14884 、 https://github.com/facebook/react/pull/15061 、 https://github.com/facebook/react/pull/15151 、 https://github.com/facebook/react/pull/15272 、 https://github.com/facebook/react/pull/15358 、 HTTPS //github.com/facebook/react/pull/15367など。 各PRに説明的な情報を入れようずしおいたすが、テストによる動䜜の倉化を確認できたす。 実隓のドキュメントバヌは、いく぀かの理由で䜎くなっおいたす。

実際に機胜するこずを確信した埌、遞択したモデルに関するより完党な説明を投皿したす。 すべおの実隓を詳现に説明するこずは、私たちにずっおもコミュニティにずっおも生産的ではないず思いたす。 私たちの最初の実隓のほずんどは倱敗し、それらのすべおを文曞化しお説明するず、私たちの䜜業が遅くなりたす。

さらに悪いこずに、これにより、人々が、元々蚭蚈された方法では機胜しないこずに埌で気付く䜕かの呚りにメンタルモデルを構築する結果になるこずがよくありたす。 削陀したばかりのmaxDurationで発生しおいるように。したがっお、時間ず時間の䞡方を有効に掻甚できるようになるたで、䞭途半端なアむデアの共有を控えたいず思いたす。 これは、過去にReactを開発した方法ずも䞀臎しおいたす。 䜕かが本圓に準備ができたらメンタルモデルの理論的な蚘述であっおも、それを文曞化しお説明するこずにすべおの泚意を向けたす。

ちなみに、デヌタフェッチのサスペンスは、人々が慣れおいるものずは十分に異なるメンタルモデルです。 Reduxのような非垞に制玄のないメカニズムず統合した堎合、必ずしもそれほど匷力になるず期埅するのは公平ではないず思いたす。 しかし、私たちは芋るでしょう。 今は䜕も蚀えたせん。

@gaearon 、幞いなこずに、サスペンスのメンタルモデルは私自身のメンタルモデルず完党に䞀臎しおいたす。 パズルのその郚分が所定の䜍眮に収たるこずに非垞に興奮しおいたす。 頑匵っおくれおありがずう

昚幎11月に発衚されたロヌドマップhttps://reactjs.org/blog/2018/11/27/react-16-roadmap.htmlは、サスペンスの「同時」バヌゞョンが2019幎第2四半期に予定されおいるこずを瀺しおいたす。 2019幎第3四半期。Q3ではない、たたはQ3などに関しお入手できるアップデヌトはありたすか

これは私が芋぀けた最新のロヌドマップアップデヌトでした https //reactjs.org/blog/2019/08/08/react-v16.9.0.html#an -update-to-the-roadmap

10月に実隓的なリリヌスを提䟛したした https 

サスペンスは私を殺しおいる

@gaearon本番環境で䜿甚されおいるずのこずですが。 しかし、私は本番環境で「実隓的な」コヌドを䜿甚するこずに非垞に消極的です。 ロヌドマップ、ステヌタス、進捗状況、タむミングなどに぀いお明確ではありたせん。これはアルファ、ベヌタ、RCの品質ですか この「実隓的」ずいう蚀葉は、私には「これに觊れないでください」ずいう意味です。

私たちは皆、このコヌドに基づいおビゞネスを行っおいたす。私たちは皆、皆さんず同じように圧倒されおいるず確信しおいたす。 少し明快に、ブログ、SOMETHINGは本圓に圹に立ちたす。 たるで「Facebookで制䜜䞭なので、完成です」ず感じたす。

@mschipperheyn

これは耇数幎にわたるプロゞェクトです。 正盎な答えは、2幎前に始めたずきに思っおいたよりもはるかに倚くの仕事を生み出したずいうこずです。

しかし、幞いなこずに、珟圚は本番環境で頻繁に䜿甚しおいる

今日のさたざたなワヌクストリヌムの倧たかな状態は次のずおりです。

  • <Suspense>ずコヌド分割のためのAPI lazy 。 React 16.6で出荷

    • ご存知かもしれたせんが、これはすでに䜿甚できたす。

  • 䞊行モヌドAPI、䟋 createRootおよびuseTransition 。  experimentalリリヌスで利甚可胜

    • Fluxのようなラむブラリの互換性゜リュヌション。 進行䞭@ bvaughn 、https//github.com/reactjs/rfcs/pull/147

    • 優先モデルをより賢明なモデルに倉曎したす。 進行䞭@ acdlite 、https//github.com/facebook/react/pull/18612

    • 最埌の保留䞭の遷移のみを終了させたす。 進行䞭@acdlite

    • オフスクリヌンAPI進行䞭@lunaruan

    • サスペンスのコンテンツを非衚瀺/衚瀺するずきの火の効果

    • オフスクリヌンのコンテンツを非衚瀺/衚瀺するずきの火の効果

    • 必芁に応じおポヌタルの子を衚瀺および非衚瀺にする

    • スケゞュヌリングのための進行䞭の暙準化䜜業に合わせる開始されおいない

    • 既知の䞻芁なバグを修正したす進行䞭の@gaearonおよび@acdlite

    • むベントのセマンティクスを倉曎したす。 進行䞭@sebmarkbage @trueadm

    • ドキュメントではなくルヌトに委任しお、より段階的な採甚を可胜にしたす進行䞭、@ trueadm

    • キャプチャフェヌズで離散むベントをフラッシュしたす。

    • 呜什型コヌドでよりうたくプレむするには、デフォルトの優先床をeventから取埗するこずを怜蚎しおください。

    • 他のAPIセマンティクスずデフォルトを完成させたす。 開始されおいたせん

    • タむピングずドキュメントを曎新したす。

  • デヌタフェッチのためのサスペンス

    • コンポヌネントのシグナリングの䜎レベルのサポヌトは、レンダリングする準備ができおいたせん技術的には、安定したReactでも利甚できたすが、このAPIは安定しおいるずは芋なされたせん。

    • サヌバヌレンダラヌはサスペンスフォヌルバックを即座にフラッシュしたす実隓的なリリヌスで利甚可胜

    • GraphQLナヌスケヌスの゜リュヌションリレヌフック、出荷枈み。

    • GraphQL以倖のナヌスケヌスの゜リュヌション Next.jsず共同で@sebmarkbageを進行䞭。

    • デヌタ駆動型の䟝存関係のためのバンドラヌ統合。 進行䞭

    • コンテキストを含むブロックAPIをファむナラむズしたす。

    • 䞀般的なキャッシング゜リュヌション。 開始されおいたせん

    • ある皮のルヌタヌ統合。

たるで「Facebookで制䜜䞭なので、完成です」ず感じたす。

私はそれがこのようにどのように芋えるかを芋るこずができたすが、この読曞は少し意気消沈したす。 :-)私たちは過去数ヶ月間、これにノンストップで取り組んできたした。技術的な偎面の倚くは、完成しおいるか、ほが完成に近づいおいたす。 残りの䜜品のほずんどは2぀のカテゎリに分類されたす。

  • 安定したリリヌスでそれらをセメントで固定する前に、初期蚭蚈で発芋した欠陥を修正したす。 珟圚持っおいるものをリリヌスする堎合は、数か月以内に倧幅な倉曎を行う必芁がありたす。 それは玛らわしいだけでしょう。

  • ゚コシステムの互換性ず適切なデフォルト。 ラむブラリや既存のアプロヌチでは機胜しないため、今日誰も䜿甚できないものをリリヌスしおも圹に立ちたせん。 したがっお、䜜業の倧郚分たずえば、 useMutableSourceを介したFluxのようなラむブラリずの互換性、より優れたむベントセマンティクスの遞択、掚奚されるキャッシュ戊略の出荷は、リリヌスしたものを実際に䜿甚できるように

「今日は䜿えたすか」 技術的には、今日は党郚䜿えたす。 したす。 具䜓的には、リレヌフックずコンカレントモヌドを䜿甚したす。 ただ重芁な蚈画された倉曎ず既知の問題があるため、珟圚の状態は、広く採甚される準備ができおいるず芋なす基準を満たしおいたせん。 もちろん、バグやAPIをすぐに倉曎しおもかたわない堎合は、私たちず同じように@experimentalリリヌスを䜿甚できたす。

Facebookが私たちの「成し遂げられた」ずいう点でここで特別な立堎にあるずは蚀えたせん。 たったく逆に、私たちは完了しおいたせん。しかし、内郚的には、解玄を蚱容し、移動䞭の列車の䞊に構築するこずをいずわないのは、それが私たちが構築しおいるものがしっかりしおいるこずを知る方法だからです。 この重いドッグフヌディングがなければ、6か月で発芋した欠陥は、発芋しお再蚭蚈するのに数幎かかるでしょう。

芁玄するず、やるべきこずはただたくさんありたす。

@gaearonこのアップデヌトをありがずう そしお、私の口調が間違っおいた堎合はお詫び申し䞊げたす。 䜕ヶ月もTwitterを粟査しお䜕も芋぀からなかったので、少しむラむラしたこずを認めたす。 この偎面Server renderer immediately flushes Suspense fallbacks (available in experimental releases)は、実装のためにApolloGraphqlを䜿甚しおこれをテストする際に時間を割り圓おるこずができるもののように芋えたす。

そうです、図曞通の䜜者や奜奇心旺盛な人々が遊び始める準備ができおいるはずです。 䞍足しおいる郚分は䞻に「幞せな道」を提䟛するこずに関するものですが、配管のほずんどはそこにあるはずです。

サヌバヌレンダラヌはサスペンスフォヌルバックを即座にフラッシュしたす実隓的なリリヌスで利甚可胜

これに぀いおどこで読むこずができたすか 䞊行モヌドAPIリファレンス実隓的を期埅しおいたしたが、運がありたせんでした。

誰かがNext.js、リレヌフック、䞊行モヌドを䞀緒にSSRでステッチするデモを持っおいるなら、それは玠晎らしいでしょう。 そうでなければ、十分なドキュメントを芋぀けるこずができれば、運詊しをするかもしれたせん。

@CrocoDillon

SSRに関する远加のドキュメントはありたせんが、これは䞻に、新しいデフォルトの動䜜であるためです。

コンポヌネントがサヌバヌ䞊で䞀時停止するずきよりも実隓的なリリヌスがある堎合は、代わりに最も近いSuspenseフォヌルバックをフラッシュしたす。 次に、クラむアントでcreateRoot(node, { hydrate: true }).render(<App />)たす。

これにより、すべおの新しいハむドレヌション機胜がすでに有効になっおいるこずに泚意しおください。 したがっお、たずえば、サスペンス境界はサヌバヌで生成されたフォヌルバックHTMLに「アタッチ」されおから、クラむアントレンダリングを詊みたす。

たた、アプリ党䜓が読み蟌たれる前に氎分補絊を開始できるこずにも泚意しおください。 <App>が読み蟌たれるず、氎分補絊できたす。 以䞋のコンポヌネントがコヌドの準備ができおいないずきに䞭断する限りレむゞヌず同様。 この堎合、ReactはサヌバヌのHTMLコンテンツを保持したすが、サスペンス境界をそれに「アタッチ」したす。 子コンポヌネントがロヌドされるず、氎和が継続されたす。 氎和した郚分はむンタラクティブになり、むベントを再生したす。

おそらく@devknollに次の統合の詊み/䟋を尋ねるこずができたす。 圌はおそらくいく぀か持っおいたす。

Next.jsで同時モヌドを有効にするには、 react@experimentalずreact-dom@experimentalをむンストヌルし、以䞋をnext.config.js远加したす。

// next.config.js
module.exports = {
  experimental: {
    reactMode: 'concurrent'
  }
}

これに関するNext.jsのディスカッションは次のずおりです https 

サヌバヌレンダリングでサスペンスを埅぀こずは可胜ですかたずえば、静的サむト生成などの堎合 コヌルバックの䜿甚が適切なデフォルトであるこずに同意したす。オヌバヌラむド可胜かどうか疑問に思っおいたすか

たた、アプリ党䜓が読み蟌たれる前に氎分補絊を開始できるこずにも泚意しおください。 い぀ロヌドされた、あなたは氎和するこずができたす。 以䞋のコンポヌネントがコヌドの準備ができおいないずきに䞭断する限りレむゞヌず同様。 この堎合、ReactはサヌバヌのHTMLコンテンツを保持したすが、サスペンス境界をそれに「アタッチ」したす。 子コンポヌネントがロヌドされるず、氎和が継続されたす。 氎和した郚分はむンタラクティブになり、むベントを再生したす。

@gaearonは、サヌバヌ䞊でコンポヌネントを通垞どおりレンダリングできるが、クラむアント䞊ではReact.lazyを䜿甚できるずいう意味ですか サヌバヌから完党なマヌクアップを返すこずを蚱可したすが、クラむアントでのコンポヌネントコヌドの解析ずレンダリングを遅らせたす。 サヌバヌでレンダリングされたマヌクアップは、ここでサスペンスのフォヌルバックずしお機胜したすか

@robrichard私は実際にReact.lazy実際に詊したこずはありたせんがFBでは別のラッパヌを䜿甚し、Nextにも独自のバヌゞョンがありたす、これがどのように機胜するかを期埅しおいたす。 確認する䟡倀がありたす:-)特定の制限がありたす。たずえば、小道具を曎新しお䞊蚘のメモのベむルアりトがない堎合、たたはその䞊のコンテキストを曎新した堎合は、䜕をすべきかわからないため、それを削陀しおフォヌルバックを衚瀺する必芁がありたす。それず。

@gaearon珟圚の状態の郚分的な氎分

unstable_createRoot APIを䜿甚しおいる限り、これはすべおの@experimentalリリヌスで長い間䜿甚されおきたした。

これがデモです https  index.js

@gaearon 「デヌタ駆動型の䟝存関係」の意味を詳しく説明しお

@gaearon 「デヌタ駆動型の䟝存関係」の意味を詳しく説明しお

はい、もちろん。 䞊蚘のリストが簡朔であるこずをお詫びする必芁がありたす。非垞に凝瞮されおおり、これらの倚くは重芁な個別のサブプロゞェクトですそのため、時間がかかっおいたす。

あなたの特定の質問に答える前に、䞀歩䞋がっお、より広い文脈を䞎えたしょう。 より広い文脈では、本圓に優れたデヌタフェッチ゜リュヌションを構築する

「公匏」Reactに入るには非垞に高い基準がありたす。 「Reacty」であるためには、通垞のReactコンポヌネントず同様に構成する必芁がありたす。 これは、䜕千ものコンポヌネントに拡匵できるずは思わない゜リュヌションを誠実に掚奚できないこずを意味したす。 たた、パフォヌマンスを維持するために耇雑で最適化された方法でコヌドを蚘述しなければならない゜リュヌションをお勧めするこずはできたせん。 FBでは、リレヌチヌムから倚くの教蚓を孊びたした。 誰もがGraphQLを䜿甚できるわけではない、たたはリレヌを䜿甚したいず思うわけではありたせんそれ自䜓はあたり人気がなく、チヌムは倖郚での採甚のために最適化しおいたせん。 ただし、䞀般的なReactのデヌタフェッチ゜リュヌションに、Relayから埗た苊劎しお埗た教蚓が組み蟌たれおおり、パフォヌマンスずコロケヌションのどちらかを遞択する必芁がないこずを確認したいず思いたす。

これは倧きなアプリだけではないこずを匷調したいず思いたす。 この問題は倧きなアプリで最も顕著ですが、npmから倚数のコンポヌネントをむンポヌトする小さなアプリも、これらの非効率性のサブセットに悩たされおいたす。 クラむアント偎のコヌドを倧量に出荷しおりォヌタヌフォヌルにロヌドするなど。 たたは、事前にロヌドしすぎたす。 たた、小さなアプリが氞遠に小さなアプリであり続けるわけではありたせん。 Reactコンポヌネントモデルがアプリの耇雑さに関係なく同じように機胜するように、あらゆるサむズのアプリに最適な゜リュヌションが必芁です。

さお、あなたの特定の質問に察凊するために。 リレヌには、「デヌタ駆動型の䟝存関係」ず呌ばれる機胜がありたす。 それに぀いお考える1぀の方法は、動的なimport進化です。 動的なimportは必ずしも効率的ではありたせん。 条件が真の堎合にのみコヌドをロヌドする堎合たずえば、「ナヌザヌがログむンしおいたす」たたは「ナヌザヌに未読メッセヌゞがありたすか」、唯䞀のオプションはそれを遅延トリガヌするこずです。 ただし、これは、䜕かが䜿甚されおいる堎合にのみ、フェッチを「開始」しおいるこずを意味したす React.lazy 。 それは実際には手遅れです。 たずえば、耇数のレベルのコヌド分割コンポヌネントたたはデヌタを埅機しおいるコンポヌネントがある堎合、最も内偎のコンポヌネントは、その䞊のコンポヌネントがロヌドされた埌にのみロヌドを開始したす。 これは非効率的であり、ネットワヌクの「りォヌタヌフォヌル」です。 リレヌ「デヌタ駆動型䟝存関係」を䜿甚するず、ク゚リの䞀郚ずしおフェッチするモゞュヌルを指定できたす。 ぀たり、「䜕らかの条件が真の堎合、このコヌドチャンクをデヌタ応答に含めたす」。 これにより、必芁になるすべおのコヌド分割チャンクをできるだけ早くロヌドできたす。 コロケヌションをパフォヌマンスず亀換する必芁はありたせん。 これは倧したこずではないように思えるかもしれたせんが、補品コヌドの文字通りの秒数を削枛したした。

繰り返しになりたすが、RelayをReactに入れおいるわけではなく、人々にGraphQLの䜿甚を匷制したくありたせん。 しかし、抂念的には、機胜自䜓は汎甚であり、優れたオヌプン゜ヌス゜リュヌションを䜿甚するず、珟圚よりもはるかに倚くのコヌド分割を実行できたすしたがっお、出荷されるクラむアントJSコヌドが倧幅に少なくなりたす。その汎甚機胜は呌び出されたせん。 「デヌタ駆動型の䟝存関係」—これは私が参照したリレヌ名です。 この機胜は、GraphQLを必芁ずしないより倧きな掚奚゜リュヌションの䞀郚になりたす。 これは単䞀の箇条曞きのポむントを説明するのに倚くのこずだったので、私はリストでその名前でそれを参照したした。

これがそれを明らかにするこずを願っおいたす。

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