JavaScriptコードモジュールの概要
- 通常のJavaScriptは読み込まれたwindow(document)ごとにオブジェクトが作成される。でもJavaScriptコードモジュールはFirefoxに一つだけ(シングルトン)。初めて呼ばれた時に一度だけ初期化されてオブジェクトが作成され、その一つを複数のwindowが参照する。
- windowに依存しない為、ブラウザのwindowオブジェクトやdocumentオブジェクトが参照出来ない(つまりwindow.setTimeoutもdocument.getElementByIdもwindow.XMLHttpRequest使えない)。XPCOMに頼る必要がある。
本体組み込みのJavaScriptコードモジュール
resource://gre/modules/***.jsm //omni.ja内のmodulesフォルダ
resource:///modules/***.jsm //browser/omni.ja内のmodulesフォルダ
Firefox38で resource://app/modules/* のパスが使えなくなった。
JavaScriptコードモジュールの作成
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だとそういうオプションが無い。
最終更新:2016年02月27日 11:50