Expand description
セレクタ右端キーによるルールインデックス(カスケード高速化)。
§背景
カスケードは「全ルール × 全ノード」を総当たりで matches_selector に掛けていた。
実サイト(www.sugi-lab.net)では Font Awesome を含めて 2403 ルールあり、
ノード数 365 との組み合わせで 1 回のレイアウトに約 50 秒かかっていた。
JS タイマーが毎フレーム DOM を dirty にするため、この 50 秒が延々と繰り返され、
ページが一度も描画完了しない状態になっていた。
§手法
ブラウザ実装と同じく、セレクタの右端コンパウンドから絞り込みキーを 1 つ取り、
#id / .class / tag のバケットへ振り分けておく。ある要素に対しては
「その要素の id / class / タグ名に対応するバケット」+「ユニバーサルバケット」
だけを照合すればよく、.fa-xxx のような数千件のアイコンルールは
対象要素がそのクラスを持たない限り一切触らない。
キーの選択は右端コンパウンド内で id > class > tag > universal の順。
右端が :hover や [attr] だけで id/class/tag を持たない場合は
必ず universal 扱いにする(絞り込みで取りこぼすと描画が壊れるため、
判断がつかないものは常に照合する側へ倒す)。
本モジュールはグローバル状態にもハードウェアにも依存しない純粋ロジックのみで構成し、 ホスト側の単体試験で契約を固定する。
Structs§
- Rule
Index - スタイルシート内のルールを右端キーで振り分けた索引。
保持するのは元の
rulesスライスに対する添字のみで、ルール本体は複製しない。
Enums§
- Index
Error - インデックス操作の引数が不正だった場合のエラー。
- RuleKey
- ルールを振り分けるバケットの種類。
Constants§
- STATE_
ACTIVE - STATE_
FOCUS - STATE_
HOVER state_masksのビット位置。
Functions§
- key_
from_ 🔒simple - 右端コンパウンドから絞り込みキーを決める。
- push_
unique 🔒 - 既に末尾にある添字は積まない(同一ルールが複数セレクタで同じバケットへ来る場合)。
- rightmost_
key - セレクタ 1 本の絞り込みキーを返す。チェーンなら右端のステップを見る。