Angular.jsでRequire.jsを使用することには意味がありますか?[閉まっている]


443

私はAngular.jsの初心者で、Backbone.jsとの違いを理解しようとしています... Backboneを使用しているときに、Require.jsでパッケージの依存関係を管理するために使用していました。Angular.jsで同じことをすることには意味がありますか?


別のブログとシードプロジェクト:startersquad.com/blog/angularjs-requirejs
iwein

19
いいえ-require.jsまたはbrowserifyをAngular.JSで使用しないでください。AngularJSにはモジュールシステムがあり、AngularJSにはモジュールシステムがあり、その上に別のモジュールシステムを使用すると、必要以上に困難になります。私はこのスレッドで答えを追跡しましたが、まったく必要のないものに何時間も費やしました。:なぜ説明し、この記事をお読みくださいmedium.com/@dickeyxxx/...
VitalyB

これを読んで、angularモジュールとrequireモジュールの違いを理解してくださいjuristr.com/blog/2014/07/lazy-angular-modules
pilavdzice

1
ここでは、angularJSでrequireJSを使用するためにどのように良いアイデアやショーだ理由を説明する素晴らしいビデオですyoutube.com/watch?v=4yulGISBF8w#t=142
gskalinskii

2
@VitalyB素敵な記事!私はアプリケーションを小さな部分でロードすることを好みます。すぐに費用はかかりません。ヘック、それは今私には何の費用もかかりません。
dsign

回答:


224

はい、コンポーネントのモジュール化に使用できる場所angular.jsとともに使用することは理にかなっています。require.jsrequire.js

を使用するシードプロジェクトがありますboth angular.js and require.js


108
上記のシードプロジェクトは1年間触れられていないため、testacularによるテストを完全にサポートする最新のAngularJSとRequireJS使用し新しいプロジェクトを作成しました。
tnajdek 2013

2
@tnajdek、私はあなたが提案したものを指すようにAnshuの回答のリンクを更新しました。
David Rivers

7
これらのシードプロジェクトはどちらも、Angularチームによって承認されていないことに注意してください。Requireは、他のコンテキストではより理にかなったパターンであり、Angularへの靴角掛けは、私見では、ベストプラクティスではありません。
XML

2
Brad GreenとShyam SeshadriによるO'Reilly AngularJSの本(今年の4月にリリース)でも、Angularプロジェクトの成長の早い段階でRequireJSを追加することを推奨しており、詳細を非常に明確に示しています。
ビョーク2013年

1
私はむしろ、ビルド時にすべてを実行したい1. browserify.org 2. npmjs.org/package/gulp-angular-filesort
A-Dubb

150

OPの質問が実際に何であると私が思うことを言い換えると、

主にAngular 1.xでアプリケーションを構築していて、Grunt / Gulp / BroccoliとBower / NPMの時代に(暗黙的に)構築していて、追加のライブラリ依存関係がいくつかある場合、Requireは明確で特定のRequireなしでAngularを使用することで得られるものを超える価値

または、別の言い方をすると:

基本的なスクリプトの読み込みを処理する他の方法がある場合、基本的なAngularコンポーネントの読み込みを効果的に管理する必要がありますか?

そして、私はそれに対する基本的な答えは次のとおりであると信じています。

最初に明確にしましょう:RequireJSは、いくつかの非常に重要な問題を解決する優れたツールであり、よりスケーラブルでより専門的なJavascriptアプリケーションに向けて、私たちの道を歩み始めました。重要なのは、多くの人がモジュール化の概念に直面し、物事をグローバルスコープから外すことに初めて遭遇したことです。したがって、スケーリングが必要なJavascriptアプリケーションを構築する場合、RequireとAMDパターンは、そのための悪いツールではありません。

しかし、Require / AMDを特に適切にするAngularについて何か特別なことはありますか?いいえ。実際、Angularは独自のモジュール化とカプセル化パターンを提供します。これにより、多くの点でAMDの基本的なモジュール化機能が冗長化されます。そして、AngularモジュールをAMDパターンに統合することは不可能ではありませんが、少し難しいです。あなたは間違いなく2つのパターンをうまく統合するために時間を費やすでしょう。

Angularチーム自体からのいくつかの見方として、Angular Batarangの作者であり、現在はAngularコアチームのメンバーであるBrian Ford によるこれがあります。

AngularJSでRequireJSを使用することはお勧めしません。確かにそれは可能ですが、実際にRequireJSが有益である例は見たことがありません。

したがって、AngularJSの非常に具体的な質問については、AngularとRequire / AMDは直交しており、場所が重複しています。あなたはすることができますそれらを一緒に使用していますが、特に角度自体の性質/パターンに関連する理由はありません。

しかし、スケーラブルなJavascriptアプリケーションの内部および外部依存関係の基本的な管理についてはどうでしょうか。Requireは私にとって本当に重要なことをしませんか?

BowerとNPM、特にNPMをチェックすることをお勧めします。私はこれらのツールの比較メリットについての聖戦を始めようとしているのではありません。私はただ言いたいだけです。その猫の皮をむく方法は他にもあり、それらの方法 AMD / Requireよりも優れているかもしれません。(彼らは確かに2015年後半に特にESPMまたはCommonJSモジュールと組み合わせたNPMでより人気のある勢いを持っています。関連するSO質問を参照してください。)

遅延読み込みについてはどうですか?

遅延読み込みと遅延ダウンロードは異なることに注意してください。Angularの遅延読み込みは、サーバーから直接それらをプルしているという意味ではありません。JavaScript自動化を備えたヨーマンスタイルのアプリケーションでは、シバン全体を1つのファイルに連結および縮小しています。それらは存在しますが、必要になるまで実行/インスタンス化されません。これを実行することで得られる速度と帯域幅の改善は、特定の20ラインコントローラーの遅延ダウンロードによる改善の疑いをはるかに上回ります。実際、そのコントローラーの無駄なネットワーク遅延と伝送オーバーヘッドは、コントローラー自体のサイズよりも桁違いに大きくなります。

しかし、管理インターフェイスなど、アプリケーションの使用頻度の低い部分について、遅延ダウンロードが本当に必要であるとしましょう。これは非常に正当なケースです。Requireは実際にそれを行うことができます。しかし、そこにあるにも 多くの 他の潜在的に 、より 柔軟 なオプションと同じことを達成します。そして、Angular 2.0は、ルーターに組み込まれているように見えます。(詳細

しかし、私のローカル開発ボックスでの開発中はどうですか?

手動でindex.htmlに添付する必要なしに、数十/数百のスクリプトファイルをすべてロードするにはどうすればよいですか?

Yeomanのgenerator-angularのサブジェネレーター、またはgenerator- gulp -angularに組み込まれた自動化パターン、またはReactの標準Webpack自動化を見てください。これらは、クリーンでスケーラブルな方法を提供します。コンポーネントが足場を組まれたときにファイルを自動的に添付するか、特定のフォルダーに存在する場合、または特定のグロブパターンに一致する場合、それらをすべて自動的に取得します。後者のオプションを取得したら、自分のスクリプトの読み込みについて考える必要はもうありません。

ボトムライン?

Requireは、特定の目的のための優れたツールです。しかし、可能な限り細かいところまで行き、懸念は可能な限り分離してください。AngularがAngular自身のモジュール化パターンについて心配し、ES6モジュールまたはCommonJSを一般的なモジュール化パターンとして使用することを検討してください。最新の自動化ツールがスクリプトの読み込みと依存関係の管理について心配するようにします。また、非同期の遅延読み込みを他の2つの問題に巻き込むのではなく、きめ細かく処理してください。

とは言っても、Angularアプリを開発しているが、何らかの理由でマシンにNodeをインストールしてJavascript自動化ツールを使用できない場合は、Requireが優れた代替ソリューションになる可能性があります。そして、人々がそれぞれ独自の依存関係などを宣言するAngularコンポーネントを動的にロードしたいという非常に手の込んだ設定を見てきました。そして、私はおそらくその問題を別の方法で解決しようとすると思いますが、その非常に特殊な状況でのアイデアのメリットを見ることができます。

しかし、それ以外の場合...新しいAngularアプリケーションと、近代的な自動化環境を作成するための柔軟性をゼロから始める場合...他にも、より柔軟でより近代的なオプションがたくさんあります。

(進化するJSシーンに追いつくために繰り返し更新されます。)


1
NG-Boilerplateシードプロジェクト(github.com/ngbp/ngbp)も、1つのjsファイルを持つ単一ページのwebappを作成します。HTML5マニフェストを使用すると、このファイルがバージョンごとに1回だけ読み込まれるようになります。
フェデリコエレス2014年

2
ただし、いつものように、<i>状況によって異なります</ i>。多くの人々は、アーキテクチャ全体にRequireを使用し、Angularをそのエコシステムに統合する必要があります。これは、アプリを個別に構築する場合とは大きく異なります。
デイブニコル

2
同意した。しかし、OPの推力は次のように思われます。「アプリケーションを主にAngularで構築し、Gruntの時代に(暗黙的に)構築している場合、さらにいくつかの追加のライブラリ依存関係がある場合、要件を超えて明確で特定の値を追加する必要があります。 RequireなしでAngularを使用することで何が得られますか?」そして、私は信じています、答えは:いいえ。外部の依存関係が40ある巨大なアプリケーションがある場合、CI環境を制御できない場合、または上司がRequireを崇拝している場合、またはRequireを崇拝している場合、またはAngularが大きなアプリケーションの1つにすぎない場合などです。 YMMV。
XML

1
しかし、彼はそれらの質問をしないようであり、単にバックボーンアプリの代替コンテキストに言及しているため、「バニラAngularはコンポーネントを効果的に管理する必要があるか?」と尋ねるようです。そして答えは、「何か他のことが起こっていない限り」です。また、この質問はJavascript CIの動きの頂点に達しました。そこでは、基本的な物理的な「スクリプト読み込み」を処理するためのはるかに優れた方法が得られました。その問題を解決した場合、基本的にはRequireは依存関係のマッチングとカプセル化についてです。Angularはあなたのためにそれらの両方を行います。
XML

Googleは、AngularJSプロジェクトの一部で遅延読み込みを使用しています。それ以外の場合、ユーザーは最初のページの読み込み時に24 MBのファイルをダウンロードするためです(これはファイルが統合されて連結されているためです)。そのため、はい、複雑なアプリケーションでは、すべてのセクションを連結するだけではなく、ユーザーがアクセスするたびにユーザーが開くセクションがない場合があります。
ngDeveloper 2015

136

はい、それは理にかなっています。

Angularモジュールは、スクリプトのロード順序や遅延スクリプトフェッチの問題を解決しようとはしていません。これらの目標は直交しており、両方のモジュールシステムが共存して目標を達成できます。

出典:Angular JS公式ウェブサイト


6
jsファイルごとに1つのモジュールを使用する場合、角度モジュールを任意の順序でロードできます。しかし、たとえば異なるjsファイルに異なるサービスを配置したいが、それらを同じ角度のモジュールにアタッチしたい場合は、サービス宣言の前にモジュール宣言をロードする必要があります。したがって、これはアーキテクチャの決定です。
Matohawk 2013

@ティアゴ:これを入手した場所へのリンクを提供してください。どこにも見つかりません。Angularのパターンが十分に確立される前、かつ少なくともAngularコンポーネントについてはRequireを回避することには大きな利点があることが明らかになる前に、それがAngularドキュメントの以前のバージョンから来たと思います。
XML

@XMLilley:Angularを使用するときにRequireを回避することの利点を説明するリンクを提供できますか?私のプロジェクトでRequireを使用するかどうかを決定しています。これは役に立ちそうです。
Trevor

1
私の言語はここでははっきりしていませんでした。Angular独自の組み込みモジュールローダーを活用し、Angularパターンの粒度に取り組むことには大きな利点があります。問題は、必須を回避するかどうかではなく、複雑さの層を追加することに価値があるかどうかです。明らかなのは、Angularの組み込みパターンが、Angular独自のモジュールをロードする必要性に簡単かつエレガントに対処することです。RequireがAngularコンテキストの外でモジュールをロードする目的を果たしている場合は、そうです。しかし、Require for Angularの使用は無関係です。
XML

6
@XMLilleyは、Angularが行うことすべてに依存性注入を提供します。モジュールの実際のロードは、あなたの責任です。これを行うには、スクリプトタグを追加するか、ビルドスクリプトを作成するか、requirejsを使用します。Angularsモジュールシステムはこれについて意見を持っていません。
ギルスルパート2013年

57

これは主観的な質問だと思うので、主観的な意見を述べます。

Angularにはモジュール化メカニズムが組み込まれています。アプリを作成するとき、最初にすることは

var app = angular.module("myApp");

その後

app.directive(...);

app.controller(...);

app.service(...);

angularのきちんとしたスターターアプリであるangular-seedを見ると、ディレクティブ、サービス、コントローラーなどが別々のモジュールに分離されており、それらのモジュールが依存関係としてメインアプリに読み込まれています。

何かのようなもの :

var app = angular.module("myApp",["Directives","Controllers","Services"];

Angularはまた、スクリプトファイルではなく、これらのモジュールを(メモリに)遅延読み込みします。

スクリプトファイルの遅延読み込みに関して言えば、極端に大きなものを書いていない限り率直に言って、角度がその性質上、書き込むコードの量を減らすため、やり過ぎです。他のほとんどのフレームワークで記述された典型的なアプリは、角度で記述された場合、LOCで約30-50%の削減を期待できます。


5
実際、Require.jsを使用してモジュールをロードするよりも、Angular.jsでサービスを構成する方が適切です。これにより、Socket.ioで遊んだように$ scopeとサービスで簡単に遊ぶことができます
MarcoGodínez

33

AngularJSでRequireJSを使用するのは理にかなっていますが、依存関係の注入に関してそれぞれがどのように機能するかを理解している場合にのみ、両方とも依存関係を注入するので、非常に異なるものが注入されます。

AngularJSには独自の依存関係システムがあり、実装を再利用するために、新しく作成したモジュールにAngularJSモジュールを挿入できます。AngularJSフィルター「greet」を実装する「最初の」モジュールを作成したとします。

angular
  .module('first', [])
  .filter('greet', function() {
    return function(name) {
      return 'Hello, ' + name + '!';
    }
  });

そして、「さようなら」フィルターを実装する「second」と呼ばれる別のモジュールで「greet」フィルターを使用するとします。「最初の」モジュールを「2番目の」モジュールに注入することで実行できます。

angular
  .module('second', ['first'])
  .filter('goodbye', function() {
    return function(name) {
      return 'Good bye, ' + name + '!';
    }
  });

RequireJSなしでこれを正しく機能させるには、「2番目の」AngularJSモジュールを作成する前に、「最初の」AngularJSモジュールがページにロードされていることを確認する必要があるということです。引用文書:

モジュールによっては、必要なモジュールをロードする前に、必要なモジュールをロードする必要があることを意味します。

その意味で、ここでRequireJSが役立つのは、RequireJSがページにスクリプトを挿入するクリーンな方法を提供するためです。相互間のスクリプトの依存関係を整理するのに役立ちます。

「最初の」と「2番目の」AngularJSモジュールに戻ります。ここでは、RequireJSを使用してモジュールを異なるファイルに分離し、スクリプトの依存関係のロードを活用する方法を示します。

// firstModule.js file
define(['angular'], function(angular) {
  angular
    .module('first', [])
    .filter('greet', function() {
      return function(name) {
        return 'Hello, ' + name + '!';
      }
    });
});
// secondModule.js file
define(['angular', 'firstModule'], function(angular) {
  angular
    .module('second', ['first'])
    .filter('goodbye', function() {
      return function(name) {
        return 'Good bye, ' + name + '!';
      }
    });
});

「最初の」AngularJSモジュールをロードして「2番目の」AngularJSモジュールを作成する必要があるRequireJSコールバックのコンテンツを実行する前に、「firstModule」ファイルに依存していることがわかります。

補足:RequireJSコールバック関数内でAngularJSを使用するには、依存関係として「firstModule」ファイルと「secondModule」ファイルに「angular」を注入する必要があり、「angular」をライブラリコードにマップするようにRequireJS構成で構成する必要があります。AngularJSを従来の方法(スクリプトタグ)でページにロードすることもできますが、RequireJSの利点はありません。

私のブログの投稿に、2.0バージョンのAngularJSコアからのRequireJSサポートの詳細があります。

私のブログ投稿「AngularJSでRequireJSを理解する」に基づいて、ここにリンクがあります。


2
リンクを含める場合は、リンクオーバーフローのリンクのコンテンツをここで要約するのが実際には最善です。あなたのリンクがこれまでに壊れた場合、どのリンクがインターネット上で行われるか、ここでのあなたの答えは将来の訪問者にとって役に立たないでしょう。編集を検討して要約を取り込み、この投稿を改善してください。幸運を!
jmort253 2014年

3
はい、jmort253に感謝します。
レオ2014年

これらの編集、およびRequireJSが依存関係を管理して、まだ存在しないものをロードしようとするAngularの問題を回避する方法を説明していただきありがとうございます。
jmort253 2014年

私は完全に同意します。アプリケーションに複数の<script>タグがない場合は、この方法を大規模なアプリケーションに使用するのが最善です。
I.Tyger

21

@ganarajが述べたように、AngularJSはそのコアに依存性注入を持っています。RequireJSを使用して、または使用せずにおもちゃの種のアプリケーションを構築するとき、私はRequireJSがほとんどのユースケースでおそらくやり過ぎであることに個人的に気付きました。

だからといって、RequireJSがスクリプトの読み込み機能や開発中のコードベースをクリーンに保つのに役に立たないというわけではありません。r.jsオプティマイザ(組み合わせるhttps://github.com/jrburke/r.jsアーモンド(と)https://github.com/jrburke/almondは)非常にスリムなスクリプトローディング物語を作成することができます。ただし、その依存関係管理機能は、アプリケーションのコアの角度ではそれほど重要ではないため、他のクライアント側(HeadJS、LABjsなど)またはサーバー側(MVC4バンドラーなど)のスクリプトロードソリューションを評価することもできます。あなたの特定のアプリケーションのために。


17

はい、特に非常に大規模なSPAの場合はそうです。

一部のシナリオでは、RequireJSは必須です。たとえば、Google Map APIも使用するAngularJSを使用してPhoneGapアプリケーションを開発しています。RequireJSのようなAMDローダーがないと、Google Map APIスクリプトを調達できないため、オフラインでアプリを起動するとクラッシュします。AMDローダーは、ユーザーにエラーメッセージを表示する機会を与えてくれます。

ただし、AngularJSとRequireJSの統合は少し注意が必要です。これを苦痛の少ないプロセスにするために、angularAMDを作成しました。

http://marcoslin.github.io/angularAMD/



7

コントローラーやディレクティブの遅延読み込みを計画している場合は、angularjsでrequirejsを使用することは理にかなっています。同時に、複数の遅延依存関係を単一のスクリプトファイルに結合して、より高速の遅延読み込みを実現できます。RequireJSには、結合を簡単にする最適化ツールがあります。http://ify.io/using-requirejs-with-optimisation-for-lazy-loading-angularjs-artefacts/を参照してください


7

はい、AngularでrequireJSを使用することは理にかなっています。私はいくつかの技術的なソリューションをテストするために数日を費やしました。

サーバー側でRequireJSを使用してAngular Seedを作成しました。とてもシンプルなものです。AMDモジュールではなく、AMDではなくSHIM表記を使用します。これは、2つの異なる依存性注入システムを処理することが非常に難しいためです。

サーバー上のjsファイルを連結するためにgruntとr.jsを使用していますが、SHIM構成(依存関係)ファイルに依存しています。私のアプリでは、jsファイルを1つだけ参照しています。

詳細については、私のgithub Angular Seedにアクセスしてくださいhttps : //github.com/matohawk/angular-seed-requirejs


3

Require.jsの使用は避けます。これを行うアプリは、複数のタイプのモジュールパターンアーキテクチャの混乱を引き起こします。AMD、Reveiling、IIFEのさまざまなフレーバーなど。loadOnDemandAngular modのようにオンデマンドでロードする方法は他にもあります。他のものを追加すると、コードが一杯になり、信号対雑音比が低くなり、コードが読みにくくなります。


2

ここに私が使用するアプローチがあります:http : //thaiat.github.io/blog/2014/02/26/angularjs-and-requirejs-for-very-large-applications/

このページは、AngularJS + RequireJSの可能な実装を示しています。このコードは、機能とコンポーネントタイプによって分割されています。


3
リンクが質問に回答するための情報を提供する場合でも、ページに表示される内容の説明がベストプラクティスです。
juliocesar 2014


0

angularはかなりモジュール化されているので、プロジェクトの複雑さに依存すると思います。コントローラーをマップして、それらのJavaScriptクラスをindex.htmlページにインポートするだけです。

しかし、プロジェクトが大きくなる場合に備えて。または、そのようなシナリオを予期している場合は、angularをrequirejsと統合する必要があります。で、この記事で、あなたは、このような統合のためのデモアプリケーションを見ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.