require.jsまとめ
7200 ワード
阮一峰先生のブログ
common jとAMD
require.jsはAMD規格によって実現されたもので、AMDとcommon JS規範2009年に米国のプログラマーRyan Dahlがnode.jsプロジェクトを創造し、javascript言語をサーバー側プログラミングに使用します.このマークは「Javascriptモジュール化プログラミング」が正式に誕生しました.正直に言うと、ブラウザの環境下では、モジュールがなくても特に大きな問題ではないです.結局、ウェブページのプログラムの複雑さは限られています.しかし、サーバー側ではモジュールが必要です.オペレーティングシステムと他のアプリケーションとの対話が必要です.node.jsのモジュールシステムは、Common JS仕様を参照して実現されます.Common JSには、モジュールをロードするための大域的な方法があります.数学モジュールがあると仮定して、下記のようにロードできます.
requirejs使用
ダウンロード後、jsサブディレクトリの下に置くとロードできます.
common jとAMD
require.jsはAMD規格によって実現されたもので、AMDとcommon JS規範2009年に米国のプログラマーRyan Dahlがnode.jsプロジェクトを創造し、javascript言語をサーバー側プログラミングに使用します.このマークは「Javascriptモジュール化プログラミング」が正式に誕生しました.正直に言うと、ブラウザの環境下では、モジュールがなくても特に大きな問題ではないです.結局、ウェブページのプログラムの複雑さは限られています.しかし、サーバー側ではモジュールが必要です.オペレーティングシステムと他のアプリケーションとの対話が必要です.node.jsのモジュールシステムは、Common JS仕様を参照して実現されます.Common JSには、モジュールをロードするための大域的な方法があります.数学モジュールがあると仮定して、下記のようにロードできます.
var math = require('math');
その後、モジュールが提供する方法を呼び出すことができます.var math = require('math');
math.add(2,3); // 5
このシリーズは主にブラウザに対してプログラミングしていますので、node.jsには関わりません.私たちはここで知っている限り、モジュールをロードするためにrequireを使えばいいです.サーバー側モジュールがあったら、自然にクライアントモジュールが欲しいです.そして、できれば両方の互換性があります.一つのモジュールは変更せずにサーバーとブラウザで実行できます.しかし、重大な制限のため、CommunJS仕様はブラウザ環境には適用されません.前のコードですか?ブラウザで実行すると大きな問題があります.var math = require('math');
math.add(2, 3);
第二行mash.add(2,3)は、第一行のrequire(‘math’)の後に運行しますので、math.jsのロードが完了するまで待つ必要があります.つまり、ロード時間が長いとアプリケーション全体が止まって待つということです.これはサーバー側の問題ではありません.すべてのモジュールがローカルハードディスクに保存されていますので、同時にロードが完了します.待ち時間はハードディスクの読み込み時間です.しかし、ブラウザについては、これは大きな問題です.モジュールはサーバーの端に置いています.待ち時間はネットの速度によって遅くなります.長い間待つかもしれません.ブラウザは「仮死」状態にあります.したがって、ブラウザ側のモジュールは、「同期ローディング」を採用することができず、「非同期ローディング」しか採用できません.これがAMD仕様の誕生の背景です.AMDは「Aynchronous Module Definition」の略語で、「非同期モジュール定義」という意味です.モジュールを非同期的にロードします.モジュールのロードは、後のステートメントの動作に影響しません.このモジュールに依存するすべてのステートメントは、ロードが完了するまで一つのコールバック関数で定義されます.AMDはrequire()の語句を用いてモジュールをロードしますが、Common JSとは異なり、二つのパラメータが必要です. require([module], callback);
最初のパラメータ[module]は、モジュールをロードするメンバーの配列です.二つ目のパラメータのcalbackは、ロード成功後のコールバック関数です.前のコードをAMD形式に書き換えると、次のようになります. require(['math'], function (math) {
math.add(2, 3);
});
math.add()はmathモジュールのローディングと同期していないので、ブラウザで仮死は発生しません.だから、AMDはブラウザ環境に適していることは明らかです.requirejs使用
ダウンロード後、jsサブディレクトリの下に置くとロードできます.
このファイルを み むと、ウェブページの がなくなるかもしれません. は つあります. つはホームページの に いてロードすることです.もう つは のように くことです.
asyncプロパティは、このファイルは なロードが であり、Webページの が われないようにすることを しています.IEはこの をサポートしていません.deferだけをサポートしますので、deferも き みます.require.jsをロードしてから、 は のコードをロードします. に たち のコードファイルがmain.jsであるとしても、jsディレクトリの に く.では、 のように くだけでいいです.
data-main の は、ページプログラムのメインモジュールを することです. の では、jsディレクトリの のmain.jsです.このファイルは にrequire.jsにロードされます.require.jsのデフォルトのファイルの はjsですので、main.jsをメールに に くことができます.メインモジュールの き はmain.jsです.これをメインモジュールと びます.ホームページ の り コードを します. は、どうやってメールを きますか?コードが のモジュールに しないなら、javascriptコードを き むことができます. // main.js
alert(" !");
これでは、require.jsを う がなくなります. に な は、メインモジュールは のモジュールに しています.この 、AMD で されたrequire() を します. // main.js
require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
// some code here
});
require() は つのパラメータを け れる. のパラメータは1つの であり、 するモジュールを し、 の は「moduleA」、「moduleB」、すなわち「moduleC」であり、 モジュールはこれらの3つのモジュールに している. つ のパラメータは、 に したモジュールが ローディングに すると び されます.ロードされたモジュールはパラメータとして に わり、これらのモジュールはコールバック の で できます.require()はmoduleAを にロードして、moduleBとmoduleC、ブラウザーは を うことはできません.その されたコールバック は、 のモジュールが ローディングに した にのみ され、 の が されます. に、 の を ます.メインモジュールがjquery、undersscore、backboneの3つのモジュールに すると して、main.jsはこのように くことができます. require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
// some code here
});
require.jsはjQuery、undersscoreとbackboneを にロードしてから、コールバック を します.メインモジュールのコードはコールバック に されます.モジュールのロードの のセクションの の では、メインモジュールの モジュールは[jquery]、「undersscore」、「backbone」である.デフォルトでは、require.jsはこの3つのモジュールがmain.jsと じディレクトリにあると し、ファイル はそれぞれjquery.js、undersscore.jsとbackbone.jsとなり、 にロードされる.require.co nfig()を って、モジュールのローディング をカスタマイズできます.require.co nfigはメインモジュールの に いてあります.パラメータはオブジェクトです.このオブジェクトのパス は モジュールのロードパスを します. require.config({
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
のコードは つのモジュールのファイル を えています.パスはデフォルトではmain.jsと じディレクトリ(jsサブディレクトリ)にあります.これらのモジュールが のディレクトリにある 、 えば、js/libディレクトリには、2つの き があります. つは つずつ を することです. require.config({
paths: {
"jquery": "lib/jquery.min",
"underscore": "lib/underscore.min",
"backbone": "lib/backbone.min"
}
});
もう つはベースディレクトリを することです. require.config({
baseUrl: "js/lib",
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
あるモジュールが のホストにある 、そのURLを することもできます. require.config({
paths: {
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
}
});
require.jsは モジュールに のjsファイルを します.このように のモジュールをロードすると、 もHTTP が し、ページのロード に を えます.したがって、require.jsはモジュールの が したら、このツールで のモジュールを つのファイルに して、HTTP を らすための ツールを している.AMDモジュールの き require.jsにロードされたモジュールは、AMD を しています.つまり、モジュールはAMDの に って かなければなりません. には、モジュールは のdefine を いて しなければならない.モジュールが のモジュールに しない 、define に されてもよい. はmath.jsファイルがあると して、それはmathモジュールを しました.それでは、math.jsはこのように きます.// math.js
define(function (){
var add = function (x,y){
return x+y;
};
return {
add: add };
});
ロード は の りです. // main.js
require(['math'], function (math){
alert(math.add(1,1));
});
このモジュールが のモジュールに する 、define の のパラメータは、モジュールの を す である があります. define(['myLib'], function(myLib){
function foo(){
myLib.doSomething();
}
return {
foo : foo
};
});
require() が のモジュールをロードすると、 にmyLib.jsファイルをロードします. ではないモジュールをロードする 、require.jsにロードされるモジュールは、AMD に って、define() で されるモジュールでなければなりません.しかし、 にはすでに の の ライブラリ(jQueryなど)がAMD に していますが、 くのライブラリが しません.では、require.jsは のモジュールをロードすることができますか? えは です.このようなモジュールは、require()でロードする に、require.co.nfig() を いて、それらのいくつかの を する. えば、undersscoreとbackboneの のライブラリは、AMD で されていません.それらをロードするには、まず を しなければなりません. require.config({
shim: {
'underscore':{
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone' }
}
});
require.co nfigは、 に べたpaths の に、 のないモジュールを するためのshim があります. には、モジュールごとに(1)export ( の )を し、このモジュールの び し の を します.(2)deps は、モジュールの を す. えば、jQueryのプラグインはこのように されています. shim: {
'jquery.scroll': {
deps: ['jquery'],
exports: 'jQuery.fn.scroll'
}
}
require.jsプラグインrequire.jsはまた のプラグインを して、いくつかの の を します.domreadyプラグインは、ページDOM のロードが した 、 させることができます. require(['domready!'], function (doc){
// called once the DOM is ready
});
text image , require.js 。
define([
'text!review.txt',
'image!cat.jpg'
], function(review,cat){
console.log(review);
document.body.appendChild(cat);
}
);