2

私は Uzi Kilon の BackboneJS / RequireJS / backbone.LocalStorage の例をhttp://kilon.org/blog/2012/08/build-backbone-apps-using-requirejs/でフォローしています。

私の場合はgit clone https://github.com/uzikilon/Todos問題なく動作しますが、古いバージョンの backbone.localstorage を使用しています。lib/backbone.localStorageただし、新しいバージョンに置き換えると、 http://cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.1.0/backbone.localStorage-min「Uncaught TypeError: undefined is not a function」が表示されます: https://github.com/uzikilon/Todos/blob/master/js/models/Todo.js#L3 - どうして?これは、 http://requirejs.org/docs/api.html#config-shimまたはおそらくこれのトリッキーな詳細と関係があると思います: http://blog.mostlystatic.com/2013/01/backbone-localstorage -uncaught.html .

require.config({
  baseUrl: "./js/",
  paths: {
    jquery: 'lib/jquery-1.8.2',
    underscore: 'lib/underscore-1.4.2',
    backbone: 'lib/backbone-0.9.2',
//    'backbone.localStorage': 'lib/backbone.localStorage'
    'backbone.localStorage': 'http://cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.1.0/backbone.localStorage-min'

  },
  shim: {
    underscore: {
      exports: "_"
    },
    backbone: {
      deps: ['underscore', 'jquery'],
      exports: 'Backbone'
    },
    'backbone.localStorage': {
      deps: ['backbone'],
      exports: 'Backbone'
    }
  }
});
4

1 に答える 1

9

問題は、最新の Backbone localStorage が AMD と互換性があるという事実にありますが、その例のバージョンは互換性がないため、shim 構成です。

修正

backbone.localStorageの構成を削除しshimます。必要ありません。

'backbone.localStorage': {
  deps: ['backbone'],
  exports: 'Backbone'
}

次に、Todo.js定義呼び出しを次のように変更します。

define(['underscore', 'backbone.localStorage'], function(_, Backbone) {

に:

define(['underscore', 'backbone', 'backbone.localStorage'], function(_, Backbone) {

なんで?

shimexports構成は、「backbone.localStorage を要求したら、Backbone を返してください」と言うために使用されていました。

これにより、「backbone.localStorage」を単に Todo モジュール内のバックボーンとして使用できるようになりました。

ただしbackbone.localStorage、AMD をサポートするようになり、define呼び出しから明示的に値を返します。したがって、BackboneTodo.js の の値はもはやバックボーン ライブラリではなく、実際にはのコンストラクタです。Backbone.LocalStorage

私が理解している限り、shim設定は AMD モジュールでは無視されるか、少なくとも使用すべきではありません。

他の「shim」モジュールのみを、shim スクリプトの依存関係として使用するか、依存関係がなく、グローバル (jQuery や lodash など) を作成した後に define() を呼び出す AMD ライブラリを使用します。それ以外の場合、AMD モジュールを shim 構成モジュールの依存関係として使用すると、ビルド後、その AMD モジュールは、ビルドで shim されたコードが実行されるまで評価されず、エラーが発生します。最終的な修正は、すべての shimmed コードをアップグレードして、オプションの AMD define() 呼び出しを行うことです。

問題を解決するには、追加の依存関係を Todo.js に追加して、コールバック パラメータが一致するようにする必要があります。

うまくいけば、それは理にかなっています。

于 2013-08-04T12:02:21.697 に答える