AngularJSをRequireJSと組み合わせて使用することは、最近のWebアプリケーションの開発に対するかなり一般的なアプローチです。 主な問題の1つは、アプリケーションの構造です。 そのようなアプリケーションにはかなりよく知られているシード、
tnajdek / angle-requirejs-seedがありますが、それは私には
適していません。アプリケーションの機能が増加すると、この構造は単にファイルの束で詰まり、スクリプトの論理的な分離がなく、それらを管理するのが難しくなるからです
目標は、モジュール化された柔軟なアーキテクチャを備えたアプリケーションを作成することでした(まあ、むしろ単にアプリケーションを壊すことは論理的な部分ではありません)。
モジュール
この場合、これはアプリケーションの論理的に独立した部分であり、コンポーネントのセットが含まれます。
- ngModule;
- コントローラー
- フィルター
- 指令
- サービス
- テンプレート;
- 構成-現在のngModuleの構成()および実行()メソッドが含まれます。
問題
RequrieJSを使用する場合、アプリケーションファイルはほとんどの場合、次のように接続されます。
require('modules/foo/controller/foo-controller.js'); require('modules/foo/service/foo-service.js'); require('modules/foo/directive/foo-controller.js'); require('text!modules/foo/templates/foo.html'); require('modules/bar/directive/bar-controller.js');
明らかな欠点があります:
- コードはプロジェクトの構造に大きく依存しています。
- コードはモジュールの名前に大きく依存しています。
- あなたは手で書く必要があります。
解決策
モジュールコンポーネントをロードするためのRequireJSプラグインが作成されました。
たとえば、次のようなアプリケーション構造があります(ところで、Symfony2のバンドルの構造に非常に似ています)。
アプリ
|-モジュール
| | -menu
| | |-コントローラー
| | | | -menu-controller.js
| | | -menu.js
| |
| | -user
| |-コントローラー
| | | -profile.js
| |-リソース
| | | -configs
| | | | -main.js
| | |
| | |-テンプレート
| | | | -user-profile.html
| | |-ディレクティブ
| | | -user-menu
| | | -user-menu.js
| | | -user-menu.html
| | -src
| | |-プロバイダー
| | | | -profile-information.js
| | |-工場
| | | -guest.js
| | -user.js
|
| -application.js
| -boot.js
この場合、
ユーザーと
メニューの 2つのモジュールがあり
ます 。 ファイル
/app/modules/menu/menu.jsおよび
/app/modules/user/user.jsは、angularJSモジュールの初期化を伴うスクリプトです。 他のすべて-それは明らかだと思います。
次に、すべてのコンポーネントの接続を構成する必要があります。 これは
requirejs.configを使用して行われ
ます :
requirejs.config({ baseUrl: '/application', paths: { 'text': '../bower_components/requirejs-text/text',
各コンポーネントのすべてのパスは、モジュール内で定義されます。
structure.prefixフィールドは、
baseUrlの後のモジュールルートへのパス
です 。
次に、次のファイル
/app/modules/user/user.js :
を含める場合
/app/modules/user/user.js :
1.
/app.js :
require('module!user')
2.
/app/modules/user/controllers/profile.js :
require('module!@')
1つのモジュール内-モジュールの名前は省略できますが、「@」文字で十分です。 したがって、モジュールの名前を変更する必要がある場合は、コードを変更する必要はありません。
ここで、ファイル
/app/modules/user/controllers/profile.js
を含める場合:
1.
/app.js :
require('controller!user:profile')
コロンの前-モジュールの名前、コロンの後-コントローラーの名前。
2.
/app/modules/user/user.js :
require('controller!profile')
1つのモジュールのフレームワーク内-モジュールの名前は省略できますが、コントローラーの名前を指定するだけです。 また、コントローラーが1レベル下の場合、次のように接続できます。
require('controller!additional/path/to/profile')
同様に、他のすべてのコンポーネントについて。
結果
コードをモジュールに分割し、プロジェクト構造へのコードの依存を最小限に抑えた、非常に柔軟なアプリケーション構造であることが判明しました。あるモジュールから別のモジュールにコンポーネントを転送する必要がある場合でも、何も変更する必要はありません。 また、コードも少なくなります。
また、プロジェクトをリセットするときに問題はありません。 テストアプリケーションには、/ buildフォルダーにアセンブルされたプロジェクトの例と、アセンブリ用のGruntfileがありますが、異常なものはありません。
参照:
大規模な企業アプリケーションでこのアプローチを使用しています。このアプローチのサポートと開発はサポートおよび開発されます。