2

例えば:

// a.js
goog.provide('mypackage.a');
goog.provide('mypackage.commands');

mypackage.a.somevar = 1;

mypackage.commands.save = function(...) {...};

// b.js
goog.provide('mypackage.b');
goog.provide('mypackage.commands');

mypackage.b.somevar = 1;

mypackage.commands.read = function(...) {...};

// mypackage/commands.js
goog.provide('mypackage.commands');

mypackage.commands.runCommand = function(commandText, args) {
  return mypackage.commands[commandText](args);
}

これは拡張可能な一連のコマンドを提供するための良い方法ですか、それとも私が考えていないこの複雑さを引き起こす可能性のあるものはありますか?

4

2 に答える 2

1

異なるソース ファイルで同じモジュールを提供できない、または提供すべきでない理由はありません。それがソース コードの編成スキームにとって理にかなっている場合は、まったく問題ありません。私たちが持っている主な理由の 1 つはgoog.provide()、同じシンボルをいくつかの異なる場所で使用できるようにするためですが、たまたま最初に実行されたファイルで定義されています。

私がgoog.provide()正しく理解していれば、オブジェクトが宣言されていることを確認するだけです。したがって、goog.provide('mypackage.commands ) makes sure thatmypackage.commands` はグローバル スコープで宣言されます。

したがってgoog.provide('mypackage.commands');、これに似た何かを達成するだけです:

window.mypackage = window.mypackage || {};
window.mypackage.commands = window.mypackage.commands || {};

このソース ファイル内のそのオブジェクトに何かを追加する予定がある場合にのみ、これを行う必要があります。したがって、複数のソース ファイルがすべて に新しい項目を追加している場合mypackage.commands、各ソース ファイルはgoog.provide('mypackage.commands)` を実行して、正しいグローバル変数構造が宣言されていることを確認します。

それはあなたのコード例であなたがしていることのようであり、それは完全に良いことです。(あなたが持っているように) 複数のソース ファイルをすべて同じオブジェクトに提供する方がよいか、または 1 つの特定の名前空間に関連するすべてのコードが同じになるようにソース ファイルを編成する必要があるかは、コード編成の独自の感覚次第です。ファイル。それは本当にあなた次第であり、ソースコードをどのように整理するのが最善であると考えるかはあなた次第です.どのように整理されているかの背後に韻と理由があるはずです.

役立つ参考記事: https://developers.google.com/closure/library/docs/tutorial

于 2012-08-25T01:53:20.147 に答える
1

を使用goog.provide()して複数のファイルで同じ名前空間を定義しても、名前空間は上書きされません。これは、名前空間の各レベルの存在が左から右にチェックされるためです。ただし、Closure Libraryは、各名前空間が 1 つのファイルでのみ提供されるという規則に従います。

Closure: The Definitive Guide の49 ページから:

Closure Library 内のすべての JavaScript ファイルは、少なくとも 1 回の呼び出しで始まり goog.provide(). ます。提供されている名前空間に追加されたすべての要素がそのファイルに追加されます。Java と同様に、ファイルは名前空間に対応するディレクトリ構造に存在しますが、これは Java の場合と同様に Closure には必要ありません。ただし、この規則により、特定の名前空間を担当するファイルを簡単に見つけることができます。Closure を使用する独自の JavaScript プロジェクトでは、この規則に従うことをお勧めします。

また、Closure Builderを使用して依存関係を管理する場合、複数のファイルで同じ名前空間が提供されると、次のエラーが発生します。

depstree.MultipleProvideError:名前空間「your.namespace」がソースで複数回提供されました

ただし、複数のファイルで同じ名前空間を提供したい場合は、Closure Compilerフラグを使用して依存関係を--only_closure_dependenciesエラーなしで管理できます。

于 2012-08-25T19:01:55.333 に答える