6

Firefox の拡張機能を開発する際に、グローバルな名前空間の汚染について調べていましたが、拡張機能ではできるだけ回避したいと考えています。いくつかの解決策がありますが、一般的に、解決策は拡張機能のグローバル変数を 1 つだけ宣言し、その中にすべてを入れることに集中しているようです。したがって、グローバル名前空間に変数を 1 つ追加するだけで済みますが、これはそれほど悪くはありません。

余談ですが、グローバル名前空間に余分な変数を入れないようにする解決策を提案してもらいました。すべてを関数にラップします。ここでの問題は、XUL オーバーレイで参照するものが何もないことです。オーバーレイで要素を宣言する必要があります。次に、JS で大量の s を追加して、XULaddEventListenerの のようなものを置き換えます。oncommand="..."私はこれをしたくありません。私は XUL 自体にイベントを含めることを絶対に望んでいます。oncommand="..."したがって、参照する XUL 属性用に少なくとも 1 つのグローバル変数が必要です。

したがって、コンセンサスは、拡張機能に 1 つ (そして 1 つだけ) の変数を持ち、すべてのコードをその中に入れることです。ここに問題があります。一般に、他の変数と衝突する可能性がほとんどないように、その変数には長くてユニークな名前を付けることをお勧めします。したがって、拡張機能の ID が の場合myextension@mycompany.com、変数myextensionAtMycompanyDotComに 、またはという名前を付けることができますcom.mycompany.myextension。これは、グローバル名前空間での衝突を回避するのに適していますが、問題が 1 つあります。その変数名は長くて扱いにくいです。私の XUL には、次のようなイベント ハンドラへの参照が散らばっています。oncommand="myextensionAtMycompanyDotCom.doSomeEvent". オーバーレイはブラウザー ウィンドウの DOM に追加されるだけなので、XUL オーバーレイでグローバル名前空間を参照する必要を回避する方法はありません。独自の名前空間を持たないため、拡張機能の変数スコープを独自のオーバーレイだけに制限することはできません。したがって、私が見ているように、4つの解決策があります。

1. XUL で長い変数名を使用するだけ

これにより、次のようなやや扱いにくく冗長な XUL コードが生成されます。

<statusbarpanel id="myStatusBar" onmousedown="myextensionAtMycompanyDotCom.onMyStatusBarClick();">

2. 短い変数名にランダム性の要素を追加する

拡張機能の短い変数名を思いつきます。myExtたとえば、myExtAX8T9. 次に、XUL には次のものがあります。

<statusbarpanel id="myStatusBar" onmousedown="myExtAX8T9.onMyStatusBarClick();">

明らかに、ランダムな文字が奇妙に見え、ある種の一時変数のように見えるため、これはかなり見苦しく、混乱を招くコードになります。

3. グローバル変数を宣言しない

すべてを関数にまとめることができます。addEventListenerもちろん、これは XUL で参照するものが何もないことを意味するため、すべてのイベントを JavaScript コードで使用する XUL 要素に関連付ける必要があります。上記のように、大量の JS コードを検索してどのイベントがどの XUL 要素に関連付けられているかを見つけるよりも、XUL コードでイベントを参照する方がクリーンだと思うので、私はこの解決策が好きではありません。

4. XUL では短い変数名を使用する

拡張機能の variable を呼び出すだけで、次のmyExtような素敵な XUL コードを取得できます。

<statusbarpanel id="myStatusBar" onmousedown="myExt.onMyStatusBarClick();">

もちろん、この短い名前は、グローバル名前空間内の何かと競合する可能性がはるかに高いため、理想的ではありません。

それで、私は何かを逃しましたか?上記で提案した 4 つのソリューションに代わるものはありますか? そうでない場合、4 つのうちどれが最も優れているでしょうか (#3 は基本的に私には受け入れられないことを考えると)、その理由は何ですか?

4

2 に答える 2

5

このブログ投稿で説明されている JavaScript モジュール パターンを使用します: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth。説明されているように、XUL ハンドラーで使用するシンボルをエクスポートできます。

さらに、名前空間を確実に制御するために、逆のホスト名をモジュール名のプレフィックスとして使用します。

/* Set up the global namespace. */
if (typeof(com) == "undefined") var com = {};
if (!com.salsitasoft) com.salsitasoft = {};

/* Main namespace. */
com.salsitasoft.myExtensionGlobalStuffGoesHere = (function (my) {
  return my;
})(com.salsitasoft.myExtensionGlobalStuffGoesHere || {});

更新: com.salsitasoft.myExtensionGlobalStuffGoesHere が既に存在する場合はクロージャーに渡すように変更して、名前空間を複数のファイルに分散できるようにしました。

于 2011-07-13T10:17:22.903 に答える
1

関数はいずれかの方法でどこかに「住んでいる」必要があるため、ある種の名前空間を主張することを避けることはできません。また、XUL でイベントを定義する方がイベントをアタッチするよりも優れているというあなたの指摘にも同意します。そこで、3+4 のハイブリッドを提案します。

  • プラグインに固有でありながら、できるだけキャッチーな名前空間を見つけてください (例: "catchyseo")。
  • プラグインのすべてのコードとすべての変数をこのネームスペース内に配置します。次のような無名関数ラッパー パターンを使用します (コード例としていくつかの jQuery プラグインを見てください)。

    window.catchyseo = (function(){var private = x; [...] })();
    
  • 名前空間で、XUL で参照できるいくつかのイベント ハンドラーを公開します。

このアプローチにより、XUL でイベントを定義でき、1 つの名前空間変数を除いて、グローバルな名前空間の汚染のない閉じた名前空間を使用できます。

于 2011-07-13T10:01:53.810 に答える