クライアントの依存関係を解決するために、JSPM を使用して NPM から backbone.marionette をインストールしようとしています。コマンドプロンプトで次のコマンドを使用した簡単な操作:
jspm install marionette=npm:backbone.marionette
jquery を除くすべての依存関係が自動的にダウンロードおよびインストールされます。しかし、実行時エラーが発生します:
未定義の Deferred を呼び出すことはできません。
コードを調べていたところ、バックボーン ソース コードの 9、10、11 行目に問題があることがわかりました。
} else if (typeof exports !== 'undefined') {
var _ = require("underscore");
factory(root, exports, _);
の下traceurJS
で実行すると、factory-method
がここから呼び出され、最後の引数 が省略されていることは明らか$
です。github でバックボーンのソースコードを見ると、同じ行が次のようになっています。
} else if (typeof exports !== 'undefined') {
var _ = require('underscore'), $;
try { $ = require('jquery'); } catch(e) {}
factory(root, exports, _, $);
ここでは、jquery の依存関係がオプション (try/catch) で追加されています。ここで、NPM のバージョンが GitHub と同じバージョン - 1.1.2 でマークされていることを追加する必要があります。
違いはなぜですか? これはしばらくの間問題であったようですが、これをコードに追加するなどのいくつかの回避策が公開されています。
$ = require('jquery');
Backbone = require('backbone');
Backbone.$ = $
回避策であり、「存在しない」ように見えるため、機能しますが、これは好きではありません。