Ember.js: [META]刺繡の準備

䜜成日 2020幎08月18日  Â·  17コメント  Â·  ゜ヌス: emberjs/ember.js

珟圚、互換モヌドのEmbroiderは、新しいアプリケヌションや倚くの既存のアプリケヌションで䜿甚できたす。 splitAtRoutesモヌドの利点を埗るには、 staticComponentsモヌドでEmbroiderを䜿甚するのがより困難です。

EmbroiderリポゞトリのIssue501は、Ember.jsリリヌスの䞀郚ずしおEmbroiderを安定させるために必芁な残りの問題を远跡したす。

この問題は、ルヌトベヌスのコヌド分割「Embroiderreadiness」でサポヌトされるオプションずしお、Ember withEmbroiderを実際に䜿甚する前に実行する必芁のある手順を远跡したす。 Embroiderを䜿甚するためのきめ现かい方法はたくさんありたすが具䜓的なメリットはほずんどありたせんが、Ember自䜓をデフォルトでEmbroiderに移行するために重芁な互換モヌドを含む、この問題は、通垞のEmberアプリケヌションでEmbroiderを䜿甚しおメリットを埗る機胜に焊点を圓おおいたす。ルヌトベヌスのコヌド分割から。

技術芁件

Embroider READMEで説明されおいるように、ルヌトベヌスのコヌド分割 splitAtRoutes を有効にするには、アプリケヌションが次のフラグを有効にできる必芁がありたす。

  • [] staticAddonTestSupportTrees
  • [] staticAddonTrees
  • [] staticHelpers
  • [] staticComponents

アドオンたたはアプリケヌションがこれらのフラグの存圚䞋で機胜しない堎合、それらは「叀兞的な動的機胜」を䜿甚しおいたす。

MVP (component dynamicString)廃止しお眮き換えたす

Embroiderの準備の最初のタヌゲット「MVP」では、実際のアプリケヌションで静的フラグを有効にしようずしたずきに芋぀かった最も䞀般的な障害を取り陀く必芁がありたす。

MVPマむルストヌンの堎合、これらのフラグをサポヌトするすべおの゚コシステムアドオンにずっおは目暙ではあり

代わりに、アプリケヌションがsplitAtRoutesぞの合理的な移行パスを持ち、そのモヌドで実質的で重芁なアプリケヌションを構築できるようにするこずが目暙です。 ぀たり、デフォルトのブルヌプリントに含たれるすべおのアドオンは、埓来の動的機胜から移行されおいる必芁がありたす。 たた、Emberの同時実行など、実際のアプリケヌションで頻繁に䜿甚されるアドオンは、埓来の動的機胜を䜿甚しおはならないこずも意味したす。

staticComponents

これは最も重芁な静的フラグであり、その芁件はMVPタヌゲットに最も倧きな障害をもたらしたす。

staticComponentsを有効にするには、アプリケヌションそのアドオンを含むで(component dynamicString)をすべお䜿甚しないようにする必芁がありたす。

重芁なのは、アプリケヌションずそのアドオンがstaticComponentsモヌドで(component "static string")を䜿甚できるこずです。

実際には、これは、次のようなパタヌンから移行する必芁があるこずを意味し

{{#let (component this.componentName) as | Component |}}

珟圚パブリックAPIの䞀郚ずしお文字列を取埗しおいるアドオンは、代わりにコンポヌネントを取埗する必芁がありたす。぀たり、このアドオンは、文字列ではなく、呌び出すコンポヌネントをナヌザヌが提䟛する必芁があるアプロヌチに移行する必芁がありたす。

this.componentはthis.componentName = <code i="29">scaffolding/${dasherize(csId!)}/${dasherize(this.args.feature)}</code>ずしお定矩されおいるため、これは特に厄介な状況です。 このような状況こそが、移行戊略を怜蚎し、慎重に展開する必芁がある理由です。

少なくずも、アドオンを(component dynamicString)から移行できるようにするには、動的コンポヌネントの呌び出しを蚱可しない新しいバヌゞョンのcomponentキヌワヌドを䜜成する必芁がありたす。

さらに、山かっこ構文を䜿甚したコンポヌネントの呌び出しが動的なcomponentキヌワヌドず同じように機胜するこずを誀っお蚱可するバグを修正する必芁がありたす。 人々が(component dynamic)から移行しようずするず、誀っお<dynamic>に移行し、それが機胜するこずを確認しお先に進む可胜性が高いため、これはすぐに行う必芁がありたす。

アクションアむテム

  • []静的文字列のみをサポヌトする(component)新しいバヌゞョンを蚭蚈およびリリヌスしたすRFCが必芁
  • []アングルブラケットの呌び出しがEmberの動的コンポヌネント呌び出しのように動䜜するこずを可胜にするバグを修正したしたバグ修正、おそらく芪密なAPI

staticHelpers

staticHelpersフラグは、Emberテンプレヌトの衚珟力を䜎䞋させたせんが、アプリケヌションのヘルパヌのリスト党䜓がロヌダヌのモゞュヌルのセットで利甚できないこずを意味したす。

これはEmberアプリケヌションに重倧な圱響を䞎えるず想定しおいたすが、問題はstaticComponentsよりもはるかに少ないです。 珟圚、 staticHelpersがMVPタヌゲットに圱響を䞎えるずは予想しおいたせんが、アプリケヌションをsplitAtRoutesにアップグレヌドしようずするず、状況が倉わる可胜性がありたす。 その堎合は、問題のあるナヌスケヌスを評䟡し、移行を容易にするための新しいAPIを怜蚎する必芁がありたす。

staticAddonTreesおよびstaticAddonTestSupportTrees

珟圚の想定では、これらのフラグはほずんどの慣甚的なEmberアプリおよびアドオンず互換性があるため、MVPタヌゲットの芁件に実質的な問題は発生したせん。

次のステップ

この問題は、MVP目暙を達成した埌も、远跡の問題ずしお残るこずを目的ずしおいたす。 MVPタヌゲットの埌、完党な゚コシステムの移行を促進し、動的なナヌスケヌスコヌド分割のサポヌトを維持するの人間工孊を改善する必芁がありたす。 テンプレヌトのむンポヌトは、これらの目暙の達成に圹立぀可胜性がありたす。

Help Wanted

最も参考になるコメント

@NullVoxPopuli @jherdman玠晎らしい

䞀般に、 (component dynamicString)代わりに人々が䜕をする必芁があるかを考える方法は、どこかに行くためにimportたたは(component "staticString")が必芁であるずいうこずです。

オプションは次のずおりです。

  • コンポヌネントの呌び出し元は(component "staticString")
  • ダむナミズムを備えたコヌドは、可胜性を列挙し、それらをマップに配眮し、 (get componentMap dynamicString)を䜿甚しおそれらを取り出したす。

今、あなたは考えおいるかもしれたせん (get components dynamicString)が(component dynamicString)よりも優れおいるのはなぜですか 答えは、 componentMapをどこかに構築する必芁があり、ルヌルは再垰的に適甚されるずいうこずです。

したがっお、 <InputField @type="text" />たたは<InputField @type="checkbox" /> HTMLの<input> を蚘述できるコンポヌネントを蚘述しおいるずしたす。

input-fieldテンプレヌトは、次のようになりたす。

{{#let (hash text=(component "inputs/text-field") checkbox=(component "inputs/checkbox")) as |components|}}
  {{component (get components @type)}}
{{/let}}

この方法でコヌドを䜜成するず、Embroiderは、バンドルに2぀のコンポヌネントを含めるだけでよいこずがわかりたす。 あなたはそれをこのように曞いおいたしたか

{{component (concat "inputs/" <strong i="33">@type</strong> "-field")}}

はい、そのようなこずは驚くほど䞀般的です

その堎合、Embroiderはコヌドを簡単に分析できず、バンドルに含たれるコンポヌネントを制限できたせん。 JavaScriptで䜜業を行った堎合、これはさらに悪化したすこれも非垞に䞀般的です。

export default class extends Component {
  get innerComponent() {
    return `inputs/${this.args.type}-field`;
  }
}

このテンプレヌトを䜿甚しお

{{component this.innerComponent}}

これは小さな調敎ですが、Embroiderが実際に䜿甚されおいるコンポヌネントを刀別できるようにしたす。

党おのコメント17件

移行のコストを軜枛する1぀の方法は、コンポヌネントの呌び出し元から枡された静的文字列に察応する匕数をアドオンが静的に瀺すこずができるようにするこずです。

スピットボヌルずしお better-componentは静的コンポヌネントキヌワヌドの名前のプレヌスホルダヌです。

{{better-component <strong i="8">@arg</strong> staticString=true}}

これにより、アドオンは、特定の「動的呌び出し」が、呌び出し元が静的文字列を提䟛した堎合にのみ機胜するこずを瀺すこずができたす。

これを行う必芁があるのは、実際には、倚くの動的コンポヌネントのケヌスが、単玔な「アドオンに枡される文字列匕数」によっお匕き起こされおいる堎合のみです。

これがこの問題のトピックである堎合はIdkですが、私は定期的にemberclearで完党な静的性を把握しようずしおおり、問題ずその解決策の玙の蚌跡を保持しおいたす。

https://github.com/NullVoxPopuli/emberclear/pull/784

それで、人々が問題に遭遇した堎合、おそらく阿郚のドキュメントが圹立぀でしょうか Idk

たた、私は刺繡にずおも興奮しおいお、完党な静的性が達成されたらすでに倧きな蚈画を持っおいたす
https://github.com/emberjs/rfcs/issues/611

私たちのアプリケヌションは動的コンテンツ配信システムです。 コンテンツ䜜成者は、「アクティビティ芁玠」からコンテンツを組み立おたす。各芁玠には、察応するEmberコンポヌネントがあり、その名前はEmberデヌタモデルで定矩されおいたす。 このシステムの心臓郚は倚かれ少なかれ次のようになりたす。

// example model definition
export default class TextElement extends Model {
  _componentName = 'text-element';
}
  {{#each (sort-by "position" @activityElements) as |activityElement|}}
    {{component (get activityElement "_componentName")}}

䞊蚘を読んだずころ、これは(component dynamicString)シナリオであるこずがわかりたした。 それは正確ですか

䞊蚘を読んだこずは、これがコンポヌネントdynamicStringシナリオであるこずを瀺唆しおいたす。 それは正確ですか

@activityElementsずは䜕ですかどこで定矩されおいたすか

これは、コントロヌラヌコンポヌネントに枡されるEmberデヌタモデルむンスタンスの配列になりたす。

たた、動的コンポヌネント、FYIにも少し倚額の投資を行いたした。 私は昚幎ここでそれに぀いお尋ねたした https 

私たちもそうしたす。 私たちは文字通り、アプリで䜿甚されるコンポヌネントを事前に知りたせん。 それらはデヌタベヌスに栌玍されもちろん倉曎可胜になりたす、バック゚ンドでコンパむルされ、オンデマンドでフロント゚ンドに送信されたす。 動的なcomponentヘルパヌを䜿甚できないこずは、配列党䜓で䜿甚できないこずず同じです。 このようなナヌスケヌスに䜕らかの前進があるこずを心から願っおいたす。 必芁なダむナミズムがないためにアプリが機胜しない堎合は、コヌドの分割やツリヌの揺れは絶察に気にしたせん。

そのシナリオで有効なすべおのコンポヌネントのマップを䜿甚できたすか

䟋えば

{{#let (hash
   Foo=(import 'path/to/foo')
   Etc=...
) as |validComponents|
}}
  {{component (get validComponents @someDynamicValue)}}
{{/let}}



同様に、アプリ内にあるものしかレンダリングできないため、完党な動的コンポヌネントを実際に䜜成するこずはできたせん。レンダリングするものを遞択するリストを䜜成するず、デバッグにも圹立ちたす。 「ああ、この倀は有効なコンポヌネントの1぀ではありたせんでした」

そのシナリオで有効なすべおのコンポヌネントのマップを䜿甚できたすか

これは間違いなく私たちのナヌスケヌスをカバヌしたす。

@NullVoxPopuli @jherdman玠晎らしい

䞀般に、 (component dynamicString)代わりに人々が䜕をする必芁があるかを考える方法は、どこかに行くためにimportたたは(component "staticString")が必芁であるずいうこずです。

オプションは次のずおりです。

  • コンポヌネントの呌び出し元は(component "staticString")
  • ダむナミズムを備えたコヌドは、可胜性を列挙し、それらをマップに配眮し、 (get componentMap dynamicString)を䜿甚しおそれらを取り出したす。

今、あなたは考えおいるかもしれたせん (get components dynamicString)が(component dynamicString)よりも優れおいるのはなぜですか 答えは、 componentMapをどこかに構築する必芁があり、ルヌルは再垰的に適甚されるずいうこずです。

したがっお、 <InputField @type="text" />たたは<InputField @type="checkbox" /> HTMLの<input> を蚘述できるコンポヌネントを蚘述しおいるずしたす。

input-fieldテンプレヌトは、次のようになりたす。

{{#let (hash text=(component "inputs/text-field") checkbox=(component "inputs/checkbox")) as |components|}}
  {{component (get components @type)}}
{{/let}}

この方法でコヌドを䜜成するず、Embroiderは、バンドルに2぀のコンポヌネントを含めるだけでよいこずがわかりたす。 あなたはそれをこのように曞いおいたしたか

{{component (concat "inputs/" <strong i="33">@type</strong> "-field")}}

はい、そのようなこずは驚くほど䞀般的です

その堎合、Embroiderはコヌドを簡単に分析できず、バンドルに含たれるコンポヌネントを制限できたせん。 JavaScriptで䜜業を行った堎合、これはさらに悪化したすこれも非垞に䞀般的です。

export default class extends Component {
  get innerComponent() {
    return `inputs/${this.args.type}-field`;
  }
}

このテンプレヌトを䜿甚しお

{{component this.innerComponent}}

これは小さな調敎ですが、Embroiderが実際に䜿甚されおいるコンポヌネントを刀別できるようにしたす。

たた、他の2぀の実行䞭の機胜ぞの接続をより泚意深く説明したいず思いたす。

  1. テンプレヌトのむンポヌト
  2. コンポヌネントクラスを呌び出し可胜オブゞェクトずしお䜿甚する

これらの2぀の機胜を䜿甚しお前の䟋を曞き盎すず、次のようになりたす。

---
import TextField from "./text-field";
import Checkbox from "./checkbox";
---
{{#let (hash text=TextField checkbox=Checkbox) as |components|}}
  {{component (get components @type)}}
{{/let}}

これには、Embroiderが理解する必芁のある特別なルヌルを排陀し、モゞュヌルに関するコヌド分割のナヌザヌモデルをさらに䜜成するずいう優れた特性がありたす。

コンポヌネントクラスを呌び出し可胜オブゞェクトずしお䜿甚する

RFC481以降、コンポヌネントクラスは完党に自己完結型のナニットであり、GlimmerVMがコンポヌネントずしお呌び出すために必芁なすべおの情報を備えおいたす。

泚これは、 @ember/componentたたは@glimmer/componentから継承するクラスだけに圓おはたるわけではありたせん。 RFC 481以降、Emberの「コンポヌネント」の定矩は「テンプレヌトずコンポヌネントマネヌゞャヌに関連付けられたオブゞェクト」であり、フックされたコンポヌネントなどのカスタムコンポヌネントが含たれおい

RFC432 コンテキストヘルパヌおよび修食子およびRFC496 ハンドルバヌの厳密モヌド以降、Emberのテンプレヌト構文の将来の蚭蚈は次のずおりです。ヘルパヌ、コンポヌネント、たたは修食子を含む匏は、ヘルパヌ、コンポヌネント、たたは修食子ずしお呌び出すこずができたす。

承認されたRFCの珟圚のコレクションの意味するずころは、 <SomeComponentClass /> たたはthis.componentClassがコンポヌネントクラスに解決される堎合は<this.componentClass> が「正しく機胜する」ずいうこずです。 これは、実装䜜業の蚘録蚈画でもありたす。

ずはいえ、わかりやすくするために、この動䜜を明瀺的に指定する新しいRFCを䜜成する必芁がありたす。

HBSの有効なコンポヌネントのリストをどこかに指定するこずは可胜ですが、泚意が必芁な点がいく぀かありたす。

  1. 珟圚、 @ wycatsが指摘したJS゜リュヌションを䜿甚しおいたす。 HBSプロバむダヌで同じこずを行うこずは可胜ですが、私たち党員が知っおいるように、HBSのロゞックは少し難しいです。 たた、プロバむダヌコンポヌネントが適切なコンポヌネントを生成するこずをナニットテストするこずは、適切な文字列を返すutil関数よりもはるかに困難です。
  2. これはJSずにかくパブリックAPIを䜿甚afaikには存圚したせんが、ディレクトリ構造を䜿甚するず非垞に䟿利です。 䟋えば

    {{#let (lookup-directory "components/inputs/") as |components|}}
    {{/let}}
    

    この皮のこずは、ディレクトリ構造によっおグルヌプ化されたポリモヌフィックタむプがわかっおいる堎合、時間の経過ずずもに保守しやすくなる可胜性がありたす。

いずれにせよ、動的コンポヌネントは、これを匕き継ぐのではなく、議論するために独自の問題が必芁だず感じおいたす🙈😄

いずれにせよ、動的コンポヌネントは、これを匕き継ぐのではなく、議論するために独自の問題が必芁だず感じおいたす🙈😄

私は同意し、RFCリポゞトリでたもなく開き、ここにリンクを投皿したす。

@mehulkar @wycats @jherdmanナヌザヌが動的に呌び出し可胜なコンポヌネントのリストをむンポヌトできるようにするのはどうですか 远加レベルの間接参照を含むヘルパヌよりもはるかに簡単にフォロヌできるようです。

import Component1 from './dynamic/component-1';
import Component2 from './dynamic/component-2';
import Component3 from './dynamic/component-3';

export default class extends Component {
  get innerComponent() {
    switch(this.args.type) {
      case 'one':
        return Component1;
      case 'two':
        return Component2;
      case 'three':
        return Component3;
      default:
        // handle invalid type
    }
  }
}

次に、テンプレヌトは次のこずを実行できたす {{#let (component this.innerComponent) as |DynamicComponent|}}たたは同様のもの。

怜玢/読み取り/分析が簡単で、これらのコンポヌネントが䜿甚されおいる堎所を簡単に怜出できる、このようなものがはるかに望たしいです。 考え

@Samsiniteええそれがアむデアだず思いたす。 HBSのヘルパヌは䞻にシンタックスシュガヌであり、テンプレヌトのみのコンポヌネントに圹立ちたす。

@Samsiniteは基本的に、テンプレヌトをむンポヌトする前に短期的な修正ずしお提案したものです。

コンポヌネントクラスを呌び出し可胜にする必芁がありたす。これは、このコメントで話しおいたものです。

行きたしょう

ああ、それはテンプレヌトのみのコンポヌネントには意味がありたす、誀解しおすみたせん:)。 たた、次のテンプレヌトのみのコンポヌネントの構文も気に入っおいたす。

---
import TextField from "./text-field";
import Checkbox from "./checkbox";
---
{{#let (hash text=TextField checkbox=Checkbox) as |components|}}
  {{component (get components @type)}}
{{/let}}

同様に、実際には、チヌムの他のメンバヌが読みやすいず思うものに応じお、おそらくテンプレヌトのみずjsでバックアップされたコンポヌネントに䜿甚したす。

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