ノードと同じ柔軟性/モジュール性/使いやすさを提供するブラウザ内JavaScript用のライブラリはありますrequire
か?
詳細を提供するために:理由require
はとても良いですそれはそれです:
- コードを他の場所から動的にロードできるようにします(これは、すべてのコードをHTMLでリンクするよりも、スタイル的に優れていると思います)。
- モジュールを構築するための一貫したインターフェースを提供します
- モジュールが他のモジュールに依存するのは簡単です(たとえば、jQueryを必要とするAPIを記述して、使用できるようにすることができます)
jQuery.ajax()
- ロードされたjavascriptはスコープが設定されています。つまり、ロード
var dsp = require("dsp.js");
でき、アクセスできるようになりますdsp.FFT
。これにより、ローカルに干渉することはありません。var FFT
これを効果的に行うライブラリはまだ見つかりません。私がよく使用する回避策は次のとおりです。
coffeescript-concat-他のjsを要求するのは簡単ですが、コンパイルする必要があります。つまり、高速開発(テスト中のAPIの構築など)にはあまり適していません。
RequireJS-人気があり、わかりやすく、1〜3を解決しますが、スコープの欠如は本当に大きな問題です(head.jsは、スコープがないという点で似ていると思いますが、使用する機会はありませんでした。同様に、LABjsは依存関係の問題をロードして緩和できます
.wait()
が、それでもスコープは実行されません)
私の知る限り、JavaScriptの動的および/または非同期ロードには多くの解決策があるように見えますが、HTMLからjsをロードするのと同じスコープの問題が発生する傾向があります。何よりも、グローバル名前空間をまったく汚染しないが、ライブラリをロードして使用できるようにする(ノードの要求と同じように)javascriptをロードする方法が必要です。
2020年の更新: モジュールはES6で標準になり、2020年半ばの時点で、ほとんどのブラウザーでネイティブにサポートされています。モジュールは、同期と非同期(Promiseを使用)の両方のロードをサポートします。私の現在の推奨事項は、ほとんどの新しいプロジェクトでES6モジュールを使用し、トランスパイラーを使用してレガシーブラウザー用の単一のJSファイルにフォールバックすることです。
一般的な原則として、今日の帯域幅も通常、私が最初にこの質問をしたときよりもはるかに広くなっています。したがって、実際には、ES6モジュールで常にトランスパイラーを使用し、ネットワークではなくコード効率に注力することを合理的に選択する場合があります。
以前の編集(またはES6モジュールが気に入らない場合):これを書いた後、私はRequireJSを広範囲に使用しました(これにより、より明確なドキュメントが作成されました)。私の意見では、RequireJSは本当に正しい選択でした。私と同じように混乱している人々のためにシステムがどのように機能するかを明らかにしたいと思います。
require
日常の開発にご利用いただけます。モジュールは、関数(通常はオブジェクトまたは関数)によって返されるものであれば何でもかまいません。スコープはパラメーターです。を使用してプロジェクトを単一のファイルにコンパイルしてデプロイすることもできます(実際には、スクリプトを並列にロードできますがr.js
、これはほとんどの場合高速です)。require
RequireJSとnode-stylerequirelike browserify(tjamesonによって提案されたクールなプロジェクト)の使用の主な違いは、モジュールの設計と要件の方法です。
- RequireJSはAMD(非同期モジュール定義)を使用します。AMDでは、
require
ロードするモジュール(javascriptファイル)のリストとコールバック関数を取ります。各モジュールをロードすると、コールバックのパラメーターとして各モジュールを使用してコールバックを呼び出します。したがって、これは真に非同期であるため、Webに最適です。 - ノードはCommonJSを使用します。CommonJSでは
require
、モジュールをロードしてオブジェクトとして返すブロッキング呼び出しです。これは、ファイルがファイルシステムから読み取られるため、ノードでは正常に機能します。これは十分に高速ですが、ファイルの同期ロードにかかる時間が大幅に長くなる可能性があるため、Webではうまく機能しません。
実際には、多くの開発者は、AMDを目にする前にNode(したがってCommonJS)を使用していました。さらに、多くのライブラリ/モジュールは、AMD(関数exports
からモジュールを返す)ではなく、CommonJS(オブジェクトに物を追加することによって)用に作成されています。define
したがって、ノード化されたWeb開発者の多くは、Web上でCommonJSライブラリを使用したいと考えています。<script>
タグからの読み込みがブロックされているため、これが可能です。browserifyのようなソリューションは、CommonJS(Node)モジュールを取得してラップし、スクリプトタグに含めることができるようにします。
したがって、Web用に独自のマルチファイルプロジェクトを開発している場合は、RequireJSを強くお勧めします。これは本当にWeb用のモジュールシステムです(ただし、公正な開示では、AMDはCommonJSよりもはるかに自然です)。最近、RequireJSで基本的にCommonJS構文を使用できるようになったため、区別の重要性は低くなりました。さらに、RequireJSを使用してノードにAMDモジュールをロードできます(ただし、私はnode-amd-loaderを好みます)。