Mutation Event は、薬にも毒にもなるから気をつけて

jQuery1.3β みた(jQueryのコードをまじめに見たのは、これが初めてかも)

Sizzle 0.9 から キャッシュ機能 が消えたわけを想像してみる

  • CSSセレクタの結果をキャッシュする方法の一つに、Mutation Event がある。
  • document.addEventListener("DOMSubtreeModified") ってやると、DOMツリーの全ての改変をフックしてくれる。
  • ちょっと前の Sizzle は、"DOMNodeInserted", "DOMNodeRemoved", "DOMAttrModified" を監視してた。
  • でも、監視をOFFにする仕組みが無かったため、監視しっぱなしになってた。
  • 監視しっぱなしだと、style.top なんかのプロパティをいじるだけで、毎回関数が呼ばれるので、モッサリに。
  • セレクタだけ速くても、それ以外がモッサリしてしまう」→ 「IEでキャッシュ効かないし、最新のブラウザってみんな querySelectorAll つかえるし。キャッシュは止めよう」

といった流れかもしれません。

Peppy のことも

# Peppy は Sizzle のライバルらしい。

Peppy が Sizzle より速い理由は2つ

  • その1: nth-child の実装がインチキ。ドーピング検査で引っかかるレベル。
    • ノードを一つ追加/削除すると nth-child の結果が不定になる。何がヒットするかは状況依存。
    • ドーピングを止めると、唯一の特徴である高速性が死ぬ。
  • その2: Sizzle 同様に、Mutation Event 使ってるから。
    • Mutation Event を ON / OFFできず、ずっと ON
    • Peppy の作者は、Mutation Event の毒性に気が付いていない。
    • CSSセレクタ以外にも目を向けないと、落とし穴に気が付けない。