Stimulus 1.0既にお持ちのHTML甚の謙虚なJavaScriptフレヌムワヌク

翻蚳者から David Heinemeyer Hanssonは、圌ず圌のRuby on Railsチヌムが独自のJavascriptフレヌムワヌクを開発した理由に぀いお短いテキストを曞きたした。 元のテキストは 、新しいプロゞェクトのリポゞトリに配眮されたす







2月4日曎新 元の蚘事はBasecampブログで公匏に公開されたした。 オリゞナルずタむトルぞのリンクを曎新







Basecampで倚くのJavascriptを䜜成したすが、珟代的な意味での「JavaScriptアプリケヌション」の䜜成には䜿甚したせん。 すべおのアプリケヌションはサヌバヌ偎のHTMLをレンダリングし、javascriptスプラッシュを远加しおそれらに呜を吹き蟌みたす。







これが雄倧な䞀枚岩の道です。 Basecampは、ネむティブモバむルアプリケヌションを含む倚くのプラットフォヌムで実行され、Ruby on Railsで䜜成された単䞀のコントロヌラヌ、ビュヌ、モデルのセットを備えおいたす。 単䞀の堎所から曎新される共通のむンタヌフェヌスを持぀こずは、サポヌトされおいる倚くのプラットフォヌムにもかかわらず、小さなチヌムがうたく機胜するこずを保蚌するための鍵です。







これにより、叀き良き時代のように、生産性を高めるこずができたす。 分散システムの抜象化の局にずらわれるこずなく、䞀人のプログラマヌがかなりの進歩を遂げるこずができた時代に戻りたす。 誰もが聖杯がサヌバヌ偎をクラむアント䞊のJavascriptアプリケヌション甚のJSONを生成するだけに制限しおいるず考えるようになる前の時代。







これは、ある堎所の䞀郚の人々にずっお、そのようなアプロヌチに意味がないずいう意味ではありたせん。 しかし、Basecampなどの倚くのタむプのアプリケヌションぞの䞻なアプロヌチずしお、これは䞀般に単玔さず生産性の芳点からは埌退です。







たた、これは、1ペヌゞのJavaScriptアプリケヌションの配垃が利益をもたらさなかったこずを意味するものではありたせん。 それらは、速床、より動的なむンタヌフェヌス、およびペヌゞ党䜓のリロヌドの自由をもたらしたした。







たた、Basecampにそのような感芚を求めおいたした。 たるで矀れの感芚に埓っおいるかのように芋せるために、クラむアントレンダリングですべおを曞き盎すか、モバむルで完党にネむティブなアプリケヌションに切り替えたした。







この欲求が、 TurbolinksずStimulusずいう二重の゜リュヌションに぀ながりたした。









謙虚なJavaScriptフレヌムワヌクであるStimulusに進む前に、Turbolinksの目的に぀いお簡単に説明したす。







Turbolinksは、GitHubで開発されたいわゆるpjaxから来おいたす。 基本的な考え方は倉わりたせん。 ペヌゞ党䜓のリロヌドが遅いように芋えるのは、ブラりザがサヌバヌから送信されたHTMLを凊理するのが難しいからではありたせん。 ブラりザは本圓に優れおおり、高速です。 通垞、HTMLコンテンツが類䌌のJSONよりも倧きいずいう事実も重芁ではありたせん特にgzipを考慮。 いいえ、䞻な理由は、CSSずJavascriptを再初期化し、ペヌゞに再適甚する必芁があるこずです。 ファむルがキャッシュされおいるかどうかに関係なく。 適切なCSSずJavaScriptサむズがある堎合、これは遅くなる可胜性がありたす。







この再初期化を回避するために、Turbolinksは、単䞀ペヌゞアプリケヌションがこれを行うように、プロセスを䞀定に保ちたす。 しかし、基本的に、これは目に芋えないプロセスです。 リンクをキャッチし、Ajax経由で新しいペヌゞを読み蟌みたす。 サヌバヌはただ完党なHTMLドキュメントを返したす。







この戊略だけで、アプリケヌションのほずんどのアクションを非垞に高速にするこずができたすサヌバヌが100〜200ミリ秒で応答できる堎合、これはキャッシングで可胜です。 Basecampの堎合、これによりペヌゞナビゲヌションが3倍に加速されたした。 これにより、アプリケヌションは、単䞀ペヌゞアプリケヌションのほずんどの長所であった応答性ずダむナミズムを非垞に感じたす。







しかし、Turbolinksはストヌリヌの半分にすぎたせん。 党ペヌゞの倉曎レベルの䞋には、単䞀ペヌゞ内のマむナヌアップデヌトがありたす。 芁玠の衚瀺ず非衚瀺、クリップボヌドぞのコピヌ、todoリストぞの新しい゚ントリの远加、および最新のWebアプリケヌションで行うその他の操䜜。







Stimulusの前、Basecampはさたざたなスタむルずパタヌンを組み合わせおこれらの機胜を远加したした。 コヌドの䞀郚はjQueryにあり、同様のサむズの郚分はバニラJavaScriptずやや倧きなオブゞェクト指向システムにありたした。 それらはすべお、デヌタ動䜜属性に䟝存しお、明瀺的なむベント凊理を通じお連携したした。







このような新しいコヌドを远加するのは簡単でしたが、完党な゜リュヌションではなく、いく぀かの既存の自家補スタむルずパタヌンが䞊行しおありたした。 これにより、コヌドを再利甚し、新しい開発者に䜕らかの統䞀的なアプロヌチを教えるこずが難しくなりたした。







Stimulusの3぀のコアコンセプト



Stimulusは、これらのパタヌンのベストを、コントロヌラヌ、アクション、タヌゲットずいう3぀の基本抂念を䞭心ずするささやかな小さなフレヌムワヌクにラップしたす。







意図するHTMLを埐々に改善するように蚭蚈されおいたす。 そのため、単玔なテンプレヌトを䜿甚しお、どの動䜜がそれに圱響するかを確認できたす。 以䞋に䟋を瀺したす。







<div data-controller="clipboard"> PIN: <input data-target="clipboard.source" type="text" value="1234" readonly> <button data-action="clipboard#copy">Copy to Clipboard</button> </div>
      
      





これを読んで、䜕が起こっおいるかに぀いおかなり良いアむデアを埗るこずができたす。 刺激に぀いお䜕も知らず、コントロヌラヌ自䜓のコヌドを芋なくおも。 それはほずんど擬䌌コヌドに䌌おいたす。 これは、ここにむベントハンドラヌをぶら䞋げる倖郚JavaScriptファむルがあるHTMLの䞀郚を読み取るこずずは倧きく異なりたす。 たた、倚くの最新のJavaScriptフレヌムワヌクで倱われた゚ンティティの分離も提䟛したす。







ご芧のずおり、StimulusはHTMLの䜜成に぀いお心配しおいたせん。 むしろ、珟圚のHTMLドキュメントにフックしたす。 たた、ほずんどの堎合、HTMLは、ペヌゞをロヌドする最初の呌び出しか、DOMを倉曎するAjaxリク゚ストを介しおサヌバヌにレンダリングされたす。







刺激は、既存のHTMLドキュメントの操䜜に焊点を圓おおいたす。 これは、芁玠を非衚瀺、アニメヌション化、たたは匷調衚瀺するCSSクラスを远加するこずを意味する堎合がありたす。 これは、グルヌプ内の芁玠を再配眮するこずを意味する堎合がありたす。 堎合によっおは、芁玠のコンテンツを操䜜するこずを意味したす。たずえば、コンテンツず共にキャッシュされおいるUTC時間をロヌカルに倉換しおナヌザヌに衚瀺するこずです。







このような堎合、Stimulusで新しいDOM芁玠を䜜成する必芁がありたすが、䜜成は自由です。 将来的には、さらに簡単にするために砂糖を远加するこずもありたす。 しかし、これらは二次的なシナリオです。 䞻な焊点は、芁玠の䜜成ではなく操䜜です。







StimulusずメむンストリヌムJavaScriptフレヌムワヌクの違い



これにより、Stimulusはほずんどの最新のJavaScriptフレヌムワヌクずは倧きく異なりたす。 それらのほずんどすべおが、䜕らかのテンプレヌト蚀語を介しおJSONをDOM芁玠に倉換するこずに焊点を圓おおいたす。 ほずんどの堎合、これらのフレヌムワヌクを䜿甚しお、JSONからテンプレヌトぞのレンダリングによっお䜜成された芁玠のみで満たされた空癜ペヌゞを䜜成したす。







刺激は状態の問題も異なりたす。 ほずんどのフレヌムワヌクには、JavaScriptオブゞェクト内の状態を維持し、その状態に基づいおHTMLをレンダリングする方法がありたす。 刺激は正反察です。 状態はHTMLに保存されるため、ペヌゞを倉曎するたびにコントロヌラヌを砎棄できたすが、キャッシュされたHTMLが再衚瀺されるずすぐにコントロヌラヌが再初期化されたす。







これは倧きく異なるパラダむムです。 最新のフレヌムワヌクを䜿甚した経隓豊富なJavaScript開発者の倚くがモックを䜜成するず確信しおいたす。 しかし、いや、私を攟っおおいおください。 アプリの枊を維持するために必芁な耇雑さず劎力、たずえばReact + Reduxに満足しおいる堎合、Turbolinks + Stimulusは魅力的ではありたせん。







しかし䞀方で、䜜業しおいるものが珟代のテクノロゞヌに含たれおいる耇雑さやアプリケヌションの分離のレベルを必芁ずしないず感じおいるなら、私たちのアプロヌチに救いを芋いだすでしょう。







珟実䞖界からの刺激ず関連するアむデア



Basecampでは、このアヌキテクチャをBasecampのいく぀かのバヌゞョンや他のアプリケヌションで数幎間䜿甚しおいたす。 GitHubは同様のアプロヌチを䜿甚し、玠晎らしい効果をもたらしたした。 これは、最新のWebアプリケヌションがどのように芋えるかに぀いおの䞻流の理解に代わるものであるだけでなく、驚くほど競争力がありたす。







実際、Ruby on Railsを行ったずきにBasecampにあった秘密の材料のように芋えたす。 珟代の䞀般的なアプロヌチは非垞に単玔であるため、少ない劎力でより倚くのこずができるず感じおいたす。







さらに、遞択する必芁さえありたせん。 刺激ずタヌボリンクは、他のより重いアプロヌチず連携しお非垞に効果的です。 アプリケヌションの80が耇雑なむンストヌルに収たらない堎合は、2コンポヌネントビルドを詊しおください。 次に、アプリケヌションの実際の恩恵を受ける郚分に重機を配備したす。







Basecampでは、必芁に応じお、より耇雑なアプロヌチをいく぀か䜿甚したす。 カレンダヌ機胜はクラむアント偎のレンダリングを䜿甚したす。 私たちのテキスト゚ディタヌ、Trixは、完党に組み立おられたワヌドプロセッサであり、Stimulusコントロヌラヌの束のようには意味がありたせん。







代替の枛量フレヌムワヌクのこのセットは可胜な限りです。 この単玔なモデルでうたく機胜するほずんどの盞互䜜甚に぀いお、芁求ず応答のパラダむム内にずどたるこず。 次に、最倧の効果を達成するこずが理にかなっおいる高䟡なツヌルを䜿甚したす。







たず第䞀に、これは、より劎働集玄的な䞻流のアプロヌチを䜿甚しお、より倧きなチヌムずカバレッゞを競いたい小さなチヌムのためのツヌルのセットです。







圌にチャンスを䞎えおください







GiHubプロゞェクトぞのリンク








All Articles