14

私はrequire.jsを使用して、Backbone.jsベースのアプリケーションを整理しています。

私はrequire.jsとAMD互換ではないサードパーティのjavascriptライブラリを使用する正しい方法を見つけようとしています

問題のライブラリはbackbone-tastypie.jsです。基本的に、ライブラリが行うことは、TastyPie Django RESTフレームワークのより簡単なサポートを提供するために、Backboneのプロトタイプメソッドのいくつかにモンキーパッチを適用することです。これは、グローバル名前空間のBackboneオブジェクトを直接操作することによって行われます。

ただし、require.jsモジュールとしてBackbone.jsを使用しているため、このライブラリがBackbone.jsにアクセスしようとすると使用できなくなります。

このbackbone-tastypieをBackboneのスコープにインポートするにはどうすればよいですか?

4

3 に答える 3

12

更新:私はbackbone-tastypie-amdと呼ばれるAMD互換のbackbone-tastypieをフォークしました

サンダーのソリューションは機能しますが、バックボーンが必要になるたびに、ネストされたもの全体を実行するのは少し面倒です。

backback-tastypieは、いわゆる「従来のスクリプト」です。この問題は4つの方法で解決できます。

  1. バックボーン-おいしいAMDを自分で互換性のあるものにします。これは、2つの方法のいずれかで実行できます。オプション1は、バックボーンを直接含めないことです。バックボーン-tastypieのみを含めます。次に、バックボーンtastypieを変更して、バックボーンが必要であることを確認します。

    var root = this;
    var Backbone = root.Backbone;
    if (!Backbone && (typeof require !== 'undefined')) Backbone = require('backbone').Backbone;
    

    ただし、これは、backbone-tastypieがロードされた後(同期)にバックボーンのダウンロードを開始するため、あまり便利ではありません。また、requirejsは、これらのモジュールがどのように関連しているかを完全に理解することはできません。それがポイントです。それでは、backbone-tastypieをdefine()でラップしましょう:

    (function (factory) {
            if (typeof define === 'function' && define.amd) {
                    // AMD. Register as an anonymous module.
                    define(['backbone'], factory);
            } else {
                    // RequireJS isn't being used. Assume backbone is loaded in <script> tags
                    factory(Backbone);
            }
    }(function (Backbone) {
            //Backbone-tastypie contents
    }));
    

    これは、この回答のすべての中で断然最良の選択肢です。RequireJSは依存関係を認識しており、それらを解決し、ダウンロードして、正しく評価することができます。バックボーン自体がオプション1を使用してアンダースコアをロードし、それ自体をモジュールとして定義しないことは注目に値します。これはかなり悪いことです。AMDに最適化されたバージョンのバックボーンをここで入手できます。このAMDバージョンを使用していると仮定すると、すぐに先に進んで、アプリでバックボーン-tastypieを要求できます(define()または実際のrequire()関数で要求することにより)。これらの依存関係はrequirejsによって解決されるため、バックボーンやアンダースコアを含める必要はありません。

  2. require.js注文プラグインを使用します。これにより、物事が順番に読み込まれます(いつでもダウンロードされるため、いくつかの点で非同期ですが、正しい順序で評価されます)

    require(["order!backbone.js", "order!backbone-tastypie.js"], function () {
         //Your code
    });
    
  3. 優先設定にbackbone.jsを配置します。これにより、バックボーンとその依存関係は、何があっても常に最初にロードされます。

  4. backback-tastypieをbackbone.jsと同じファイルに追加します。バックボーンがロードされるたびに、バックボーンのおいしいものもロードされます。ハッキー?はい。ただし、これはrequireJSでjqueryを使用する推奨される方法と非常に似てい ます(jqueryプラグインはjqueryをロードする必要があります-バックボーンのように-tastypieはバックボーンをロードする必要があります)。

于 2011-12-31T17:44:04.973 に答える
9

以下は、パスが正しく設定されていることを前提として、RequireJS2.1.0+で機能するはずです。

require.config({
  shim: {
    'underscore': {
      exports: '_'
    },
    'backbone': {
      deps: ['underscore','jquery'],
      exports: 'Backbone'
    },
    'backbone-tastypie': {
      deps: ['backbone']
    }
  }
);
于 2013-02-21T03:13:21.267 に答える
2

あなたはあなたのrequireを別のrequireでラップすることができますプラグインが最初にロードされ、その後あなたはあなたのアプリをすることができます。

require(["myCustomTastyPiePlugin.js"], function () {
    //This callback is called after the one script finish loading.

    require(["one.js", "two.js", "three.js"], function () {
        //This callback is called after the three scripts finish loading.

        // all your code goes here...

    });
});
于 2011-12-30T10:27:11.603 に答える