Stimulusのコツ

Stimulusを使うコツとして、私は下記を意識するようにしています。

なるべくブラウザネイティブな機能を使う

  • ブラウザネイティブな機能を使えば、コードが少なくなり、メンテナンス性が向上します
  • ブラウザネイティブのアクセシビリティがついてくるので、アクセシビリティの心配が減ります

HTML生成をなるべく避ける

ステートを意識する

  • Stimulusを使う時も、Reactと同様にステートを考慮します。ただしStimulusの場合はステートの種類が多く、どれを使用するかはケースバイケースで判断することになります。
    • ネイティブなHTML要素(<input>タグなど)のステート
    • aria属性
    • StimulusのValues
    • CSSクラス
    • hiddenなどのHTML要素の属性
    • Zustandなどのステートライブラリ(ZustandはReactがvanilla JavaScriptで使えます)
    • Stimulusコントローラのインスタンスプロパティ
  • ステートを画面に反映させる方法を意識します。これもケースバイケースでいろいろなやり方があります。
    • CSSのセレクタ・擬似セレクタで表示を変える方法
      • Aria属性やHTML属性、Stimulus values、hidden属性などをステートとしている場合は、:checked, [aria-expanded="true"], [data-xxx-yyy-value="zzz"], [hidden]のようなCSSを書くだけで自動的にステートを表示に反映できます。
    • StimulusコントローラからDOM要素の属性、classやコンテンツを直接変更して表示を変える方法。
    • Stimulus Valuesを使っている場合は、ステートが変更された時にxxxValueChanged()コールバックが自動的に呼び出されます。この中に画面更新処理を記述できます。

イベント処理、ステート変更、表示更新の責務を分離する

  • Reactはすべての責務を一つのコンポーネントに押し込めます。敢えて密結合・高凝集な設計になっています。
  • 一方でStimulusは責務を分離します。
    • 表示はHTMLおよびCSSの責務です。
    • ユーザイベントに対する応答はStimulusコントローラの責務です。
  • CSSは継承しますので、内包するHTML要素の表示を変えます。上流のCSSが自然と下流に流れますので、データフローと似た感じで表示の変化を変更できます。
    • イベントに応答して画面表示を変える場合は、まずはCSSによる変更を検討します。
    • CSSだけでは十分に表示を変えられない場合は、Stimulusの中からHTMLのコンテンツ等を書き換えます。

コードが複雑になったら単方向データフローを意識する