はじめに
以下の記事で、Stimulus アプリケーションの起動時にしていることをまとめました。
起動時に、Router
class、Dispatcher
classのインスタンスを作成して、それぞれのインスタンスでstart
メソッドを実行していることがわかりました。
しかし、それぞれのインスタンスの役割が何であって、なんのためにstart
メソッドを実行しているのいまいちわかりませんでした。
調べた限り、それぞれの役割について書かれている記事は見当たりませんでした。
全てのコードを一気に読んで役割を推察するのは難しいです。
なので、少しずつコードを読み解いて、役割を理解していくことにします。
本記事では、それぞれのclassのプロパティを読み解きます。
Router
classのプロパティ
以下は、Router
classのプロパティです。
readonly application: Application
private modulesByIdentifier: Map<string, Module>
private scopesByIdentifier: Multimap<string, Scope>
private scopeObserver: ScopeObserver
application
は、Stimulus アプリケーション自体です。
modulesByIdentifier
はModule
classのインスタンスを値とするマップです。Module
classの役割は、Stimulus controllerの管理です。1つのStimulus controllerに対して、1つのModule
classのインスタンスが対応します。modulesByIdentifier
のキーは、Stimulus controllerの識別子です。
scopesByIdentifier
の型はMultimap<string, Scope>
classという型ではありますが、要するにMap<string, Set<Scope>>
のインスタンスです。Scope
classは、Stimulus controllerが適用できる範囲を司るclassです。例えば、以下のようにStimulus controllerを指定しているとき、<div>
要素とその子要素がこのcontrollerの適用範囲です。この範囲を司るのがScope
classの役割です。
<div data-controller="modal">
<button data-modal-target="button">閉じる</button>
</div>
<a href="#">戻る</a>
scopeObserver
は、Scope
classの全インスタンスの監視を管理するものです。つまり、Stimulus controllerを指定しているすべてのHTML要素の監視を管理しています。
Dispatcher
classのプロパティ
以下は、Dispatcher
classのプロパティです。
readonly application: Application
private eventListenerMaps: Map<EventTarget, Map<string, EventListener>>
private started: boolean
application
は、Stimulus アプリケーション自体です。
eventListenerMaps
は、イベントを監視するDOMとイベントリスナーを管理するためのものです。
started
は、イベントリスナーを設置済みか否かを判別するためのものです。
おわりに
本記事では、Router
class、Dispatcher
classのプロパティを読み解きました。その結果、それぞれのclassの役割がなんとなくわかってきました。おそらく、以下のような感じだと思います。
-
Router
: Stimulus controllerを管理し、それが適用されているDOMを監視する -
Dispatcher
: Stimulus controllerが適用されているDOM内のイベントに対して、Stimulus controllerのActionを実行させる
なんとなく役割はわかってきたのですが、いまいち全貌がわかりません。なので、今後はclass同士の依存関係を明らかにして、役割の輪郭をはっきりさせようと思います。