私はRequireJS2.0.1で少し実験しています。私の目標は、jQuery、Underscore、およびBackboneを正しくロードすることです。元の RequireJS doc から、著者のJ. Burkeが(この新しいリリースに) shimという新しい設定オプション を追加したことを発見しました。
それから私はこれをここに書きました:
index.html
<!DOCTYPE html>
<html>
<head>
<title>Testing time</title>
<script data-main="scripts/main" src="scripts/require.js"></script>
</head>
<body>
<h1>Testing time</h1>
</body>
</html>
scripts/main.js
requirejs.config({
shim: {
'libs/jquery': {
exports: '$'
},
'libs/underscore': {
exports: '_'
},
'libs/backbone': {
deps: ['libs/underscore', 'libs/jquery'],
exports: 'Backbone'
}
}
});
define(
['libs/jquery', 'libs/underscore', 'libs/backbone'],
function (jQueryLocal, underscoreLocal, backboneLocal) {
console.log('local', jQueryLocal);
console.log('local', underscoreLocal);
console.log('local', backboneLocal);
console.log('global', $);
console.log('global', _);
console.log('global', Backbone);
}
);
すべてがうまく機能しているように見えますが、何かが足りないような気がします。jQueryとUnderscoreのAMDedバージョンがあることは知っていますが、設定が非常に単純な場合は、なぜそれらを使用する必要があるのか理解できません。
それで、この設定は正しいですか、それとも何か不足していますか?
ライブラリがモジュールを宣言するためにdefine()
をまだ呼び出していない場合にのみ、「shim」構成を使用する必要があります。 jQueryはこれをすでに実行しているため、shim構成から削除できます。上記のコードはそのまま動作しますが、jQueryはシム作業が完了する前にdefine()
を呼び出すため、jQueryのエクスポートシム構成は無視されます。
シムの欠点と、モジュールを定義するスクリプトがdefine()
を呼び出すことの欠点:
移植性や信頼性は低くなります。すべての開発者は、shim構成を行い、ライブラリの変更を追跡する必要があります。ライブラリ作成者がライブラリ内でインラインで行うと、誰もがより効率的にメリットを得ることができます。 mdjs/umd のコードテンプレートは、そのコードの変更に役立ちます。
最適化されていないコードの読み込み:shim configは、実際のライブラリを読み込む前にshim depを読み込むことで機能します。そのため、並列よりも順次読み込みが少し多くなります。すべてのスクリプトを並列にロードできる場合は、define()
を使用した場合に可能です。最終的な展開のためにビルド/最適化を行い、すべてのスクリプトを1つのスクリプトに結合する場合、これは実際にはマイナス面ではありません。
あなたがやっていることは正しいですが、jQueryは [〜#〜] amd [〜#〜] (非同期モジュール定義)モジュールをエクスポートするため、shim構成にある必要はありません。アンダースコアは、AMD/Require.jsのサポートを追加した直後に削除しました。以下を参照してください なぜunderscore.jsがAMDのサポートを削除したか
Shimは、AMDモジュールをエクスポートしないライブラリを使用するための便宜を目的としています。使用しているライブラリがAMDをサポートしているか、2つのバージョン(AMDをサポートしているバージョンとグローバル変数であるバージョン)がある場合は、AMDバージョンを使用する必要があります。最初にAMDを使用するのと同じ理由で、またライブラリのソースにrequire.js(または Almond )が含まれ、不要なファイルサイズがあなたのプロジェクト。
元の例(jqueryへのパスが 'libs/jquery'に設定されている)でjqueryの「シミング」を実際に回避できますか?jqueryはAMDモジュール定義に「jquery」という名前を追加するためです。
define( "jquery"、[]、function(){return jQuery;});
私の経験では、jquery.jsをbaseurlディレクトリに配置して、jquery AMDモジュールを期待どおりに定義するか、元の例のように「シム」する必要があります。