AmazonJS 0.8

ひさしぶりにAmazonJSを更新した。またも普通に使えている人に嬉しい修正はしていない。

  • キャッシュをファイルキャッシュからTransients APIに変更
  • テーマや他プラグインの巻き添え対策

Transients API

WordPressにTransients APIというキャッシュ用のAPIがある。セットアップにてキャッシュディレクトリを作らせたり、ファイルで保存するのがいい加減古い臭いと思ったのでそれに切り替えた。これで0.8からはセットアップでキャッシュディレクトリを作成しなくて良い。Transients APIはDBに書き込んでいるのでDBの接続が遅いと重くなる恐れがあるけどしょうがない。そもそもDBが重い環境ではページキャッシュしないとやっていけないだろうし。

競合対策

競合対策ではAutoptimizeを併用しても動くようにしてみた。ただAutoptimizeを使うとテーマや他のプラグインからの巻き添えを受けやすくなるので難しい。デフォルトではAutoptimizeはテーマやプラグインのスクリプトを全て一つにまとめるので先に読み込まれたテーマや他のプラグインのJavascriptのコードがコケると以降のプラグインのJavascriptコードが実行されなくなる。Javascriptのコードが実行されなくても大きな問題が起きないプラグインが多いと思うがAmazonJSの場合はくるくるローディングしたまま書き換える処理が実行されない問題が起きて被害が大きい。

今回とあるテーマで巻き添え被害を食らう状態が再現できたので対策を試みた。そもそもAutoptimizeなどの高速化型プラグインを使わない場合、なぜテーマや他のプラグインがコケると被害を受けるのか。一つの要因として 誰かがjQuery関連のコードを失敗すると$(document).ready()で追加したコールバックが呼び出されない という現象があることがわかった。

とりあえずなぜ$(document).ready()のコールバックが呼ばれないのかは置いておいて、$(window).load()は行けるのかとか、直接DOMContentLoadeddocument.addEventListenerしたら行けるのかを調べたら手元ではそちらは呼びだされた。というわけで$(document).ready()がダメでも$(window).load()DOMContentLoadedが発火したら描画するようにしてみた。これで被害は避けられるだろうか。

0.8になって動かなくなった人はテーマを変えたりや他のプラグインを無効にしたりして競合するものがわかればお知らせください。原因が不明な場合は古いバージョンを以下からダウンロードしてダウングレードできます。
https://github.com/makotokw/wp-amazonjs/releases

正直バージョン1.0にするタイミングを完全に逸している。