私はここ数日間requirejsで遊んでいます。 defineとrequireの違いを理解しようとしています。
Defineはモジュールの分離を可能にし、依存関係の順序付けを順守することを可能にするようです。しかし、それはそれが最初に必要とするすべてのファイルをダウンロードします。あなたがそれを必要とするときあなたが必要とするものだけをロードする間、必要とします。
この2つを一緒に使用することはできますか。また、それぞれをどのような目的に使用する必要がありますか?
define
を使用してモジュールをrequire.jsに登録し、それを他のモジュール定義またはrequireステートメントに依存させることができます。 require
を使用すると、require.jsでロードできるモジュールまたはJavaScriptファイルを「単に」ロード/使用できます。例としては ドキュメント を見てください。
私の経験則:
定義:モジュールを宣言したい場合は、アプリケーションの他の部分が依存します。
必須:あなたがものをロードして使いたいだけなら.
Require.jsから ソースコード (1902行目):
/**
* The function that handles definitions of modules. Differs from
* require() in that a string for the module should be the first argument,
* and the function to execute after dependencies are loaded should
* return a value to define the module corresponding to the first argument's
* name.
*/
define()
関数は、2つのオプションパラメータ(モジュールIDと必須モジュールの配列を表す文字列)と1つの必須パラメータ(ファクトリメソッド)を受け取ります。
ファクトリメソッドの戻り値MUSTは、モジュールの実装を返します( Module Pattern と同じ方法で)。 ).
require()
関数は新しいモジュールの実装を返す必要はありません。
define()
を使用して、のように入力しています。合格していますが、その前に、これらの依存関係がロードされていることを確認してください。
require()
を使って、のように言っています。 "私が渡す関数には、以下の依存関係があります。実行しています "。
require()
関数は、モジュールが定義されていることを確認するために定義済みのモジュールを使用する場所ですが、新しいモジュールは定義していません。
モジュール定義を容易にするための "define"メソッドと、依存関係のロードを処理するための "require"メソッド
defineは、次のシグネチャを使用して、提案に基づいて名前付きモジュールまたは名前なしモジュールを定義するために使用されます。
define(
module_id /*optional*/,
[dependencies] /*optional*/,
definition function /*function for instantiating the module or object*/
);
一方、requireは通常、トップレベルのJavaScriptファイルまたはモジュール内にコードをロードするために使用されます。動的に依存関係を取得する場合は、
詳しくは https://addyosmani.com/writing-modular-js/ を参照してください。
require()とdefine()はどちらも依存関係のロードに使用されます。これら2つの方法には大きな違いがあります。
その非常に単純な人たち
Require():メソッドは即時機能を実行するために使用されます。 define():メソッドは、複数の場所で使用するためのモジュールを定義するために使用されます(再利用)。
一般的なルール:
再利用するモジュールを定義する場合、defineを使用します
Requireを使用して、単に依存関係をロードします
//sample1.js file : module definition
define(function() {
var sample1 = {};
//do your stuff
return sample1;
});
//sample2.js file : module definition and also has a dependency on jQuery and sample1.js
define(['jquery', 'sample1'], function($,sample1) {
var sample2 = {
getSample1:sample1.getSomeData();
};
var selectSomeElement = $('#someElementId');
//do your stuff....
return sample2;
});
//calling in any file (mainly in entry file)
require(['sample2'], function(sample2) {
// sample1 will be loaded also
});
これがお役に立てば幸いです。