※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

JavaScriptコードモジュールの概要

  • 通常のJavaScriptは読み込まれたwindow(document)ごとにオブジェクトが作成される。でもJavaScriptコードモジュールはFirefoxに一つだけ(シングルトン)。初めて呼ばれた時に一度だけ初期化されてオブジェクトが作成され、その一つを複数のwindowが参照する。
  • windowに依存しない為、ブラウザのwindowオブジェクトやdocumentオブジェクトが参照出来ない(つまりwindow.setTimeoutもdocument.getElementByIdもwindow.XMLHttpRequest使えない)。XPCOMに頼る必要がある。


本体組み込みのJavaScriptコードモジュール

他にも色々便利なのがあるので、MDNのページを参照

  • 読み込むためのURL(Firefox21以降)
resource://gre/modules/***.jsm  //omni.ja内のmodulesフォルダ
resource:///modules/***.jsm     //browser/omni.ja内のmodulesフォルダ
Firefox38で resource://app/modules/* のパスが使えなくなった。

JavaScriptコードモジュールの作成

  • 拡張子jsmで作成
var EXPORTED_SYMBOLS = ["myJSM_1", "myJSM_2"];
var myJSM_1 = "sample";
var myJSM_2 = {};
var myJSM_3 = {}; 
  • EXPORTED_SYMBOLS配列に登録したオブジェクトだけが外部からアクセス出来る。
  • 上の例で言えばmyJSM_1とmyJSM_2は外部からアクセスできるが、myJSM_3はこのモジュール内のみのローカルなオブジェクトで外部からはアクセス出来ない。

JavaScriptコードモジュールの読み込み

その場で読み込む

Components.utils.import("resource://gre/modules/Services.jsm");
// temp.Services でアクセス
var temp = {};
Components.utils.import("resource://gre/modules/Services.jsm", temp); 
var {Services} = Components.utils.import("resource://gre/modules/Services.jsm", {});
初期化などで必ず使われる場合はこれ。

使われる時になったら読み込まれる

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm");
// temp.tempServices でアクセス
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
var temp = {};
XPCOMUtils.defineLazyModuleGetter(temp, "tempServices", "resource://gre/modules/Services.jsm", "Services");
ユーザーの操作によって使われるかもしれない、という時はこれ。

問題点

  • 日本語が文字化けする。UTF-8で読み込んでくれてないっぽい。loadSubScriptなら文字コード指定してスクリプトを読み込んでくれるけど、Cu.importだとそういうオプションが無い。