Sleipnir2のUAスクリプトでjQueryを使う その2

以前の記事Sleipnir 2 のUAスクリプトjQuery を使う方法を紹介したんですけれど、そこの最後のほうで

スクリプトのサイズを小さくするためのネタに関してはあったりしますけど気が向いたらいずれまた。

と書きました。
で、気が向いたので書いてみます。

まぁ、基本的に方法は変わりません。
ポイントはファイルサイズで一番ネックになっている jQuery のコード部分を外に追いやるだけです。
とはいえUAスクリプトではローカルファイルは読み込めないので、インターネットの公開サーバに上げるとかローカルはローカルでもローカルサーバに上げるとかって話になります。
それじゃあ、面白くない……というわけでは無いですが、一般人には手間がかかります。*1

で、しばらく考え続けていました。
起きて、寝て、飯食って、トイレして、風呂入って、仕事して、ゲームして、ネットして、本読んで、(中略)音楽聴いて、動画見て、スクリプト書いて、何か解決方法が無いか考えてってな具合程度には。

そんなある日ふと思いついたわけです。
Web Storage があるじゃないか。あるじゃぁないかと。

まず、下準備として jQuery のコードを sessionStorage に保存するUAスクリプトを書きます。
"jQuerify1.8.3.js"、"jQuerify1.10.2.js"のような名前にしておくと分かりやすいでしょう。*2

(function(){
	sessionStorage.setItem("UserActionScriptJQuey" + new Date().getTime(), loadJQ.toString());
	
function loadJQ() {
// ここに jquery-X.Y.Z.min.js の中身をそのまま貼る
}
})();

次に、実際に使用するUAスクリプトを書きます。

(function() {
if(sessionStorage) {
	var pnir = sleipnir.api, $;
	pnir.ExecuteAction("jQuerify1.10.2");
	for(var i=sessionStorage.length-1;i>=0;i--){var ssk=sessionStorage.key(i);if(ssk.match(/^UserActionScriptJQuey[0-9]+$/)){eval(sessionStorage.getItem(ssk));loadJQ();sessionStorage.removeItem(ssk);break;}}$=jQuery.noConflict(true);loadJQ=void 0;
	
	// ここにコードを書く
	
}
})();
  • sessionStorage が使えないと使えません
    • Trident だと about:blank とかローカルファイルでは使えません
    • その場合は前回の方法を用いると良いでしょう
  • 可能性は低いですがWebページ側で上手くタイミングを合わせて sessionStorage に書き込めば、理論上は任意のコード(もちろん悪意のあるコードも)を読ませることが可能という脆弱性があります
  • あとは基本的に前回のと同じです

個人的には初めて sessionStorage を使うことが出来たのが嬉しい。*3

*1:個人的にはSleipnirに簡易Webサーバ立てる機能あったらいいなとは思ったり

*2:ちなみに jQuerify は、どこでも jQuery が読み込める jQuerify というブックマークレットにあやかってです

*3:localStorage は使ったことがある