Firefox Extension JSMSおよびNameSpace Ettiquite
-
27-10-2019 - |
質問
したがって、Firefox拡張機能では、拡張機能のオブジェクトがcom.contoso.myextensionのようなサブオブジェクトに住むことが奨励されています。そうすれば、グローバルネームスペースにオブジェクトを置いておらず、拡張機能は一般にお互いの髪の毛から離れています。 (少なくとも一般的なbrowser.xulウィンドウで)
しかし、私が理解していることから JavaScriptコードモジュール(JSMS), 、モジュール自体が別の名前空間で動作している間、それがエクスポートするシンボルは、それをインポートするコードのグローバル名空間に終わるでしょう。さらに、拡張機能が「素敵」であることは不可能であり、サブオブジェクトを構築しようとするだけです。これらのエクスポートされたシンボルは、すでに存在していたグローバル変数がどんなものであれ、ただ強打されます。また、com.contoso.myextensionのようなシンボルをエクスポートすることはできません。単純なグローバル変数にすぎません。
では、JSMSを使用するときにうまくプレイするためのプロトコルは何ですか?本当に長い変数の名前を作成し、彼らが衝突しないことを願っていますか?
解決
まず、私は本当のことを見たことがありません 標準 これを処理する方法について。しかし、私たちは間違いなく長い変数の名前よりもはるかにうまくいくことができます...
あなたは別のものに住んでいるJavaScriptコードモジュールについて正しいです 名前空間 (いわば)、しかし、それらをインポートするとき、それらをグローバルネームスペースにインポートする必要はありません。あなたが見たら components.utils.import ドキュメントでは、特定の範囲にインポートできることがわかります。あれは、 グローバルネームスペースをまったく汚染する必要はありません.
モジュールをaに収集できます myExtension
名前空間。
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
そして、これを自己執行関数内で包むことは、変数がグローバルネームスペースに漏れることをできません。 myExtension
!
(function(){
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
})();