0

互いに関連する 2 つの問題があります。

1 つ目は、backbone という名前のフォルダーを作成したいということです。これは、パス内のライブラリの短い名前として backbone を使用することと衝突します。RequireJS は backbone/model/User が backbone ライブラリの子か何かだと考えているようです。解決策として、ライブラリの名前を大文字の B で Backbone にします。

2 つ目の問題は、依存関係として「バックボーン」を持つ ModelBinder を使用していることです。解決策、縮小されたファイルを変更します。

どちらのソリューションも、RequireJS 構成で何かを正しく行っていないための悪いハックのように思えますが、何が間違っているのかわかりません。

私のパブリック フォルダー構造は次のようなものです。

public/
  js/
    backbone/
      model/
        ...
      view/
        ...
    vendor/
      backbone.min.js
      Backbone.ModelBinder.js
      ...
  common.js

私のcommon.jsには次のようなものがあります:

require.config({
    baseUrl: "/js",
    shim: {
        'underscore': {
            exports: '_'
        },
        "Backbone" : {
            deps: ["underscore", "jquery"],
            exports: 'Backbone'
        }

    },
    paths: {
        underscore: 'vendor/underscore.min',
        jquery: 'vendor/jquery',
        model_binder: 'vendor/Backbone.ModelBinder',
        Backbone: 'vendor/backbone.min'
  }
});

したがって、私の2つの質問は次のとおりです。Backbone.ModelBinderをそのまま維持し、そのライブラリがバックボーンを要求するときに、グローバルパスを「汚染」することなくjs/vendor/backbone.min.jsを要求するようにrequirejsに指示するにはどうすればよいですか?

また、パスでバックボーン (小文字の b) とディレクトリを両方とも使用できないのはなぜですか?

4

1 に答える 1

1

1 つの解決策 (はい、あまり正気ではありません) は、以下pathsのすべてのディレクトリの定義を含めることですjs/backbone

require.config({
    ...
    paths: {
        ...
        backbone: 'vendor/backbone.min', // NOTE lower-case 'b', as desired
        "backbone/model": "backbone/model",
        "backbone/view": "backbone/view",
        ... // and so on
    }
});

これは、 の直下にモジュールがないことも意味しますjs/backbone

別の方法は、バックボーンのモジュール名に大文字の「B」を保持し、次の構成を使用することmapですBackbone.ModelBinder.js

require.config({
    ...
    paths: {
        ...
        Backbone: 'vendor/backbone.min' // NOTE capital 'B' again
    },
    map: {
        "model_binder": {
            "backbone": "Backbone"
        }
});

振り返ってみると、 はすべてのモジュールmapに適用できるため、モジュールが要求するたびに(小文字の「b」) を配信できます。"backbone""Backbone"

require.config({
    ...
    paths: {
        ...
        Backbone: 'vendor/backbone.min' // NOTE capital 'B' again
    },
    map: {
        "*": {    //  <------ Here difference form code above
            "backbone": "Backbone"
        }
});

これで、誰でも"backbone"Backbone または"backbone/model/User"(または"backbone/module") を要求して取得し、対応するモジュールを取得できます。

于 2013-10-24T08:10:02.930 に答える