非同期ロードのrequirejs、あなたは持つ価値があります
5505 ワード
1、総説:
RequireJSの目的は、従来のラベルとは異なるスクリプトロードステップを使用したコードのモジュール化です.
コードのロードを加速させ、コードを最適化することができますが、主な目的はコードのモジュール化です.
2、jsファイルのロード
RequireJSはbaseUrlに対するアドレスですべてのコードをロードします.ラベルには特殊な属性data-main,requireが含まれています.jsは、スクリプトのロードプロセスを開始するために使用します(data-mainはエントリであり、javaのmainメソッドとして使用したい場合).baseUrlは、一般的にこのプロパティと一致するディレクトリに設定されます.
このような設定では、baseUrlはscriptsディレクトリを指します.もちろんbaseUrlは手動で指定できます.つまりrequirejsです.config({})構成で、明示的な構成がない場合、baseUrlはデフォルトでrequirejsを参照するhtmlが存在するディレクトリを指します.
3、例解析、ディレクトリ構造:
index.htmlのクリップ
ファイルエントリapp.js
baseUrlはファイルのロードの開始位置ですが、paths構成(pathsはbaseUrlに対するパスであり、ロードされたファイルには.js接尾辞は必要ありません.requirejsのデフォルト依存リソースはjsファイルであり、接尾辞を付けるとエラーがロードされます)です.ここで、「app」で始まるModule ID(baseUrl+paths)の場合、js/appがロードされます.
4、requirejsコア
(1)モジュールの定義
モジュールは、従来のスクリプトファイルとは異なり、グローバルネーム空間の汚染を回避するための役割ドメインを良好に定義します.依存関係を明示的にリストし、依存関係を注入することもできます.
単純なオブジェクトを定義するには、次の手順に従います.
外部依存なしでメソッドを定義します.
外部依存を含むメソッドを定義します.
まず例を見ると、このモジュールはbbに依存する.jsとaa.js:
defineのパラメータの1つは配列であり、依存項目、2番目のパラメータはfunction(すなわちモジュールの定義はメソッド体で定義される)であり、すべての依存項目のロードが完了した後に2番目のパラメータfunctionが実行され、依存関係はパラメータの形でこの関数に注入され、パラメータリストは依存名リストに1つ対応している(名前は一致しない).jsに詳しいなら、functionではオブジェクトを返すだけでなく、メソッドを返すこともできます.つまり、次の形式です.
もちろんmodule名を指定できます.
(2)commonJs風にラッピング
CommonJSモジュール形式で記述されたコードがある場合、これらのコードは上記の依存名配列パラメータの形式で再構築するのが難しい場合は、これらの依存を直接ローカル変数に対応させることを考慮することができます.CommonJSの簡単なパッケージを使用して実現できます.
あるいは、exportsで本モジュールのインタフェースを外部に露出し、他の場所で呼び出す形式を書くこともできます.
5、その他の注意点
(1)ファイル定義モジュール
(2)define()の相対モジュール名:define()の内部でrequire(./relative/name)などの呼び出しを使用して相対名を正確に解析できるように、「require」自体を依存としてモジュールに注入することを覚えておいてください.
このように見ても違和感があり、commonJSのスタイルで次のような形に変えることができます.
(3)モジュールに対するURLアドレスを生成する:参照ファイルのurlを生成したい場合は、以下の形式を使用します.
(4)AMD仕様以外の文書をロードする:
backbone、underscoreについては、すでに他の非AMD仕様の必要性はrequirejsを借りる.config({})のshim:
shimの使用上の注意点:
1-shim構成はコードの依存関係のみを設定し、shimが指定したモジュールまたは関連するモジュールを実際にロードするには、通常のrequire/define呼び出しが必要です.shim自体がコードのロードをトリガーしないように設定します.
2-shimスクリプトの依存として他のshimモジュールのみを使用してください
3-CDNロードとshim構成を混在させない
(5)map:与えられたモジュール接頭辞に対して、異なるモジュールIDを用いてモジュールをロードする.
(6)requirejs.configのその他の構成:
config:これらの構成はアプリケーションレベルの情報であり、モジュールに下に渡す手段が必要です.
Packages:CommonJSパッケージからモジュールをロードします.「パッケージからモジュールをロードする」を参照してください.
またcontext、xhtml、urlArgs、callbackなどもありますので、参考にしてくださいhttp://requirejs.org/docs/api.html
(7)マルチバージョンサポート、プラグインのロード、国際化コンポーネントの定義
しばらく使用したことがないので、後で検討します.
比較的良いamdチュートリアルを添付します
http://efe.baidu.com/blog/dissecting-amd-what/
RequireJSの目的は、従来の
コードのロードを加速させ、コードを最適化することができますが、主な目的はコードのモジュール化です.
2、jsファイルのロード
RequireJSはbaseUrlに対するアドレスですべてのコードをロードします.
<script data-main="scripts/main.js" src="scripts/require.js"></script>
このような設定では、baseUrlはscriptsディレクトリを指します.もちろんbaseUrlは手動で指定できます.つまりrequirejsです.config({})構成で、明示的な構成がない場合、baseUrlはデフォルトでrequirejsを参照するhtmlが存在するディレクトリを指します.
3、例解析、ディレクトリ構造:
www/
-index.html
-js/
---app/
------sub.js
---lib/
------jquery.js
------canvas.js
---app.js
index.htmlのクリップ
<script data-main="js/app.js" src="js/require.js"></script>
ファイルエントリapp.js
requirejs.config({
baseUrl: 'js/lib',
paths: {
app: '../app'
}
});
// Start the main app logic.
requirejs(['jquery', 'canvas', 'app/sub'],
function ($, canvas, sub) {
//jquery,canvas,sub 资源都已经加载完毕,可以用了。
});
});
baseUrlはファイルのロードの開始位置ですが、paths構成(pathsはbaseUrlに対するパスであり、ロードされたファイルには.js接尾辞は必要ありません.requirejsのデフォルト依存リソースはjsファイルであり、接尾辞を付けるとエラーがロードされます)です.ここで、「app」で始まるModule ID(baseUrl+paths)の場合、js/appがロードされます.
4、requirejsコア
(1)モジュールの定義
モジュールは、従来のスクリプトファイルとは異なり、グローバルネーム空間の汚染を回避するための役割ドメインを良好に定義します.依存関係を明示的にリストし、依存関係を注入することもできます.
単純なオブジェクトを定義するには、次の手順に従います.
define({
name: "hcc0926",
age: "3"
});
外部依存なしでメソッドを定義します.
define(function () {
return {
name: "hcc0926",
age: "3"
}
});
外部依存を含むメソッドを定義します.
まず例を見ると、このモジュールはbbに依存する.jsとaa.js:
define(["./aa", "./bb"], function(aa, bb) {
return {
name: "hcc0926",
age: "3",
addToCart: function() {
aa.xxx();
bb.add();
}
}
});
defineのパラメータの1つは配列であり、依存項目、2番目のパラメータはfunction(すなわちモジュールの定義はメソッド体で定義される)であり、すべての依存項目のロードが完了した後に2番目のパラメータfunctionが実行され、依存関係はパラメータの形でこの関数に注入され、パラメータリストは依存名リストに1つ対応している(名前は一致しない).jsに詳しいなら、functionではオブジェクトを返すだけでなく、メソッドを返すこともできます.つまり、次の形式です.
define(["./aa", "./bb"], function(aa, bb) {
return function(){
return aa.xxx();
}
});
もちろんmodule名を指定できます.
define("moduleId",["aa", "bb"],function(aa, bb) {
//Define module in here.
});
(2)commonJs風にラッピング
CommonJSモジュール形式で記述されたコードがある場合、これらのコードは上記の依存名配列パラメータの形式で再構築するのが難しい場合は、これらの依存を直接ローカル変数に対応させることを考慮することができます.CommonJSの簡単なパッケージを使用して実現できます.
define(function(require, exports, module) {
var a = require('a'),
b = require('b');
//Return the module value
return function () {};
});
あるいは、exportsで本モジュールのインタフェースを外部に露出し、他の場所で呼び出す形式を書くこともできます.
define(function(require, exports, module) {
var a = require('a'),b = require('b');
exports.add = a.xxx()+b.xxx();
});
5、その他の注意点
(1)ファイル定義モジュール
(2)define()の相対モジュール名:define()の内部でrequire(./relative/name)などの呼び出しを使用して相対名を正確に解析できるように、「require」自体を依存としてモジュールに注入することを覚えておいてください.
define(["require", "./relative/name"], function(require) {
var mod = require("./relative/name");
});
このように見ても違和感があり、commonJSのスタイルで次のような形に変えることができます.
define(function(require) {
var mod = require("./relative/name");
});
(3)モジュールに対するURLアドレスを生成する:参照ファイルのurlを生成したい場合は、以下の形式を使用します.
define(["require"], function(require) {
var cssUrl = require.toUrl("./style.css");
});
(4)AMD仕様以外の文書をロードする:
backbone、underscoreについては、すでに他の非AMD仕様の必要性はrequirejsを借りる.config({})のshim:
requirejs.config({
baseUrl : {},
shim: {
'backbone': {
deps: ['underscore', 'jquery'], //backbone的依赖库
exports: 'Backbone' //backbone对外暴露的接口
},
'underscore': {
exports: '_'
}
}
});
//在其他的文件中就可以通过如下形式访问了,
define(['backbone'], function (Backbone) {
return Backbone.Model.extend({});
});
shimの使用上の注意点:
1-shim構成はコードの依存関係のみを設定し、shimが指定したモジュールまたは関連するモジュールを実際にロードするには、通常のrequire/define呼び出しが必要です.shim自体がコードのロードをトリガーしないように設定します.
2-shimスクリプトの依存として他のshimモジュールのみを使用してください
3-CDNロードとshim構成を混在させない
(5)map:与えられたモジュール接頭辞に対して、異なるモジュールIDを用いてモジュールをロードする.
requirejs.config({
map: {
'some/newmodule': {
'foo': 'foo1.2'
},
'some/oldmodule': {
'foo': 'foo1.0'
}
}
});
(6)requirejs.configのその他の構成:
config:これらの構成はアプリケーションレベルの情報であり、モジュールに下に渡す手段が必要です.
Packages:CommonJSパッケージからモジュールをロードします.「パッケージからモジュールをロードする」を参照してください.
またcontext、xhtml、urlArgs、callbackなどもありますので、参考にしてくださいhttp://requirejs.org/docs/api.html
(7)マルチバージョンサポート、プラグインのロード、国際化コンポーネントの定義
しばらく使用したことがないので、後で検討します.
比較的良いamdチュートリアルを添付します
http://efe.baidu.com/blog/dissecting-amd-what/