Hatena::Groupmoz-addon

hogezilla RSSフィード

当ページに書かれているコードは、修正BSDライセンスのもと、再頒布して頂いて構いません。

 | 

2011-06-25

lazy loader

| 01:13 | はてなブックマーク - lazy loader - hogezilla

コードが実行さえる口が一つ。例えば、初期状態では「ツールバーのカスタマイズ」にボタンがあって、そのボタンからしか実行されないコードがある場合。

そのコードはアプリケーション起動時に読み込むのは無駄ではないか? と思い、やってみた。

ここでは以下の様なボタンがあるとしよう、oncommandHoge.foo.action()が実行される。

<toolbarbutton label="hoge button"
               oncommand="Hoge.foo.action();"/>

これに対するスクリプトとして、通常なら以下の様な感じになる。

var Hoge = {
  foo: {
    action: function () {
      this.action2();
      alert("OK");
    },
    action2: function () {
      // ...
    },
  }
};

ここで、Hoge.foo.action2Hoge.foo.actionからしか呼ばれないとすると、ボタンがクリックされるまで役に立たない無駄なコードとなる。

じゃあ、ボタンがクリックされた時に、読み込むようにすればいいじゃないか。Services.jsmにあるmozIJSSubScriptLoaderを使用してみよう。

var Hoge = {
  foo: {
    action: function Init () {
      Services.scriptloader.loadSubScript("chrome://Hoge/content/fooButton.js", this);
      this.action();
    },
  }
};
// chrome://Hoge/content/fooButton.js
function action () {
  action2();
  alert("OK");
}

function action2 () {
  // ...
}

重要なのはmozIJSSubScriptLoader.loadSubScriptの第二引数thisにより、this(上記コードではHoge.foo)を実行コンテキストとしてスクリプトが実行される。

それと、this.action()と自分を実行しているように見える部分。mozIJSSubScriptLoaderで読んだコード側でthis.actionを上書きしている。よって、this.actionは読み込んだ側の関数を実行することになる。スクリプトの読み込みは一度すれば良いので上書きして消し飛ばす。

アプリケーション起動時には初期化処理部分のみをロードしておき、後は実行時に読み込むようにすれば、なかなかにエコなシステムができあがるのではないだろうか。

トラックバック - http://moz-addon.g.hatena.ne.jp/teramako/20110625
 |