3

アプリケーションの名前空間を必要とするモジュールがあるとします。たとえば、次のようになります。

define(["app"], function(App){
    [...]
});

...そして名前空間には、すべてのモジュールで使用されるライブラリが必要です。

define(["jquery", "underscore", "backbone"], function($, _, Backbone){
    [...]
});

...その後、すべてのモジュールが名前空間に必要なライブラリにアクセスできます。つまり$、 、_、およびを使用できますBackbone

繰り返しを避けることができるため、この動作は気に入っていますが、何かごまかしている疑いがあり、各モジュールでライブラリを要求する必要があります。

誰か私をここに立たせることができますか?

4

2 に答える 2

2

ええ、それはちょっとハッキーです。jQuery、アンダースコア、およびバックボーンもグローバル スコープで定義されているため、これらにのみアクセスできます。バックボーンとアンダースコアは実際の AMD モジュールではなく、shim 構成を使用する必要があります。jQuery は、グローバル スコープで AMD モジュールとして自身を宣言するため、どこでも動作します。

はい、そのように動作しますが、最適ではありません。実際の AMD モジュール (シムなし) は、定義関数の引数で渡す必要があるため、この方法では機能しません。また、別の環境でテストするために 1 つのモジュールのみをプルすることはできません。この方法では、 、異なるバージョンのスクリプトを読み込んで、異なるモジュール/アプリ セクション/ページを操作することはできません。

AMD の目標は、コードにモジュール性をもたらし、すべてのモジュールが独自の依存関係を宣言し、グローバル スコープに依存せずにすぐに使用できるようにすることです (これは、名前の衝突やサード パーティ/他の開発者との競合を防ぐための良い方法です)。同じプロジェクトに取り組んでいます)。

ベース依存関係を毎回再宣言するのが冗長であることがわかった場合は、別のモジュールを作成するときにコピー/貼り付けするだけのボイラープレート ファイルを作成します (何もないよりはましです)。また、一部のコマンド ライン ツールで AMD モジュール ラッパーをビルドできる場合もあります。

そうです、はい、機能しますが、プロジェクトが大きくなったり、少しずつ更新する必要がある場合は、拡張できません。

この助けを願っています!

于 2012-09-26T02:11:26.793 に答える
0

上記の回答に対する朗報です。アンダースコア 1.6.0 が amd モジュールとしてラップされるようになりました :)

AMDラップされていない「shimmed」JavaScriptライブラリでグローバルをエクスポートするには、「lib.chartjs」を参照してください

requirejs.config({
    paths: {
        "moment": "PATH_TO/js/moment/2.5.0/moment.min",
        "underscore": "PATH_TO/js/underscore/1.6.0/underscore",
        "jquery": "PATH_TO/js/jquery/1.10.2/jquery.min",
        "lib.jssignals": "PATH_TO/js/jssignals/1.0.0-268/signals.min",

        // WORKAROUND : jQuery plugins + shims
        "lib.jquery.address": "PATH_TO/js/jqueryaddress/1.6/jquery-address"
        "lib.jquery.bootstrap":"PATH_TO/js/bootstrap/3.0.3/bootstrap",
        "lib.chartjs": "PATH_TO/js/chartjs/0.2/Chart.min",
    },
    shim: {
        "lib.jquery.address": {deps: ["jquery"]},
        "lib.jquery.bootstrap": {deps: ["jquery"]},
        "lib.chartjs": {deps: ["jquery"], exports: "Chart"},
    }
});
于 2014-02-20T17:06:33.637 に答える