Visit Mozilla.org

Components.utils.import

出典: MDC

この記事は Firefox 3 の新機能について述べています


このメソッドは Firefox 3 で導入され、異なるスコープ間でコードを簡単に共有するのに使われます。例えば、自分のコンポーネントの中で、長いコンポーネント登録の定型文をコピーアンドペーストすることを避けるために XPCOMUtils.jsm をインポートすることができます。

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

ドキュメンテーションは、Using_JavaScript_code_modules を参照してください。

[編集] mozIJSSubScriptLoader との違い

mozIJSSubScriptLoader との違い:

  • 異なる場所から同じコードをインポート/読み込みした時の挙動
    • サブスクリプトローダ (subscript loader) は、特定のコードが実行される度毎に 呼び出し元 (caller) のグローバルオブジェクトで評価します。
    • Components.utils.import はそれぞれのモジュールのコードを一度だけ、自分自身のスコープの中で評価します

    例:

    var scope1 = {}, scope2 = {};
    Components.utils.import("resource://gre/modules/JSON.jsm", scope1);
    Components.utils.import("resource://gre/modules/JSON.jsm", scope2);
    assert(scope2.XPCOMUtils === scope1.XPCOMUtils);
    

    ...true を返します。対して:

    var someURL = "resource://gre/modules/JSON.jsm";
    var obj1 = {}, obj2 = {};
    var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
                           .getService(Components.interfaces.mozIJSSubScriptLoader);
    loader.loadSubScript(someURL, obj1)
    loader.loadSubScript(someURL, obj2)
    assert(obj2 === obj1);
    

    ..false を返します。

    これは、異なるスコープで実行している JS 間での効果的なコード (とデータ?) の共有に Components.utils.import がより適している事を意味しています。

  • サブスクリプトローダは読む込むコードの URL を受け付けますが、import は、resource:file: URI しか受け付けません。

[編集] 追加リソース