15

jquery、underscore.js、およびrequire.jsを介してロードされたbackbone.jsを使用する非常に基本的なテストを実装しようとしていますが、何らかの理由ですべてを適切に並べることができないようです。調査によると、他の人は同じ問題を抱えていないことがわかっているので、私が見ていない単純なものに違いないとわかっています.

私が抱えている問題は、backbone.js の読み込み中に _ への参照が見つからないことです。同じ問題を報告している他の人を見つけましたが、問題は通常、依存関係の参照をハンドラーに間違った順序で渡すか、その他の明らかな問題でした。これは、バックボーンがロードされているときに発生しています。

また、「すべてを同じファイルに入れる」などの「機械的な」ソリューションもいくつか見てきましたが、適切な順序で多数のスクリプト インクルードを使用することで、従来の方法でそれらをロードするだけですが、これを機能させたいと本当に思っています。強力なアプローチのようです。

最初は、デモで動作するhttp://backbonetutorials.com/organizing-backbone-using-modules/の構造から始めましたが、非常に単純な変更を加えたり、単純なサンプルを作成しようとすると、少し壊れやすいと感じます地面まで、それは壊れます。

あまりにも長い間これに頭を悩ませた後、戻ってこのページ Loading Backbone and Underscore using RequireJS with another simple example を見つけ、希望を取り戻しました。ただし、それに基づいて新しいテストを作成した後、バックボーンの 0.5.3-optamd ブランチがアンダースコアへの独自の依存関係を処理することになっているにもかかわらず、同じ問題が発生します。

これ以上苦労することなく、これは非常に単純なコードであり、機能するはずですが、代わりに私を狂わせています。どういうわけか見逃したのが明らかであることを願っています:

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>Backbone.js/Underscore.js via Require.js Learning Page</title>
        <script src="js/libs/require/require.js"></script>
        <script src="js/main.js"></script>
    </head>
    <body>
        <div>Backbone.js/Underscore.js via Require.js Learning Page</div>
        <div class="testhook"></div>
    </body>
</html>

js/main.js

require.config({
    paths: { 
            'jquery': 'libs/jquery/1.7/jquery',
            'underscore': 'libs/underscore/1.2.2/underscore',
            'backbone': 'libs/backbone/0.5.3-optamd/backbone'
    },
    baseUrl: '/js',
    urlArgs: 'v=1.0'
});

require([
         'domReady',
         'app'
         ], 
         function( domReady, App ){
            domReady(function(){
                console.log( 'Dom is ready' );
                App.init();
            });
        }
);

js/app.js

// Filename: app.js
define([
        'jquery', 
        'underscore', 
        'backbone'
        ], 
        function( $, _, Backbone ){

            var init = function(){

                console.log( 'app.js > init()' );

                // jquery test (WORKS)
                $('.testhook').append('testhook append');

                // underscore test (WORKS)
                console.log( _.map([1, 2, 3], function(n){ return n * 2; }));

                // backbone test (DIES)
                var artist = new Backbone.Model({
                      firstName: "Wassily",
                      lastName: "Kandinsky"
                    });

                    artist.set({birthday: "December 16, 1866"});

                    console.log(JSON.stringify(artist));
            }

            return { init: init };
        }
);

正確なコンソール出力は次のとおりです。

Uncaught TypeError: Cannot call method 'extend' of undefined (backbone.js:150)
main.js:18    Dom is ready
app.js:11     app.js > init()
app.js:17     [2, 4, 6]
app.js:20     Uncaught TypeError: Cannot read property 'Model' of null (app.js:20)

NOTE:
Line 150 in unminified backbone.js is:
_.extend(Backbone.Model.prototype, Backbone.Events, {

Chrome 17.0.938.0 dev-m を使用している Windows 7 マシンを使用しています。

私のスクリプトのバージョンは次のとおりです。

backbone:       0.5.3-optand
jquery:         1.7
require:        1.0.1
underscore:     1.2.2

私のディレクトリ構造は次のとおりです。

js
+-- libs/
¦       +-- backbone/
¦       ¦     +-- 0.5.3-optamd/
¦       ¦                 +-- backbone.js
¦       +-- jquery/
¦       ¦     +-- 1.7/
¦       ¦          +-- jquery.js
¦       +-- require/
¦       ¦      +-- require.js
¦       +-- underscore/
¦              +-- 1.2.2/
¦                    +-- underscore.js
+-- app.js
+-- domReady.js
+-- main.js
+-- order.js
index.html

これが私にどれほどの困難を与えているか信じられません.誰かがここで何が起こっているのかを明らかにすることを本当に望んでいます.

4

5 に答える 5

20

私は実際、これとまったく同じ問題に苦労して多くの時間を費やしてきました!

これが私がそれを機能させる方法です...

まず、jQuery 1.7 を含む新しいサンプルの require-js プロジェクトをダウンロードします。zip ファイルには、現在 AMD に準拠している jQuery 1.7 を含む require-jquery.js というファイルがあります。

次に、require の最新バージョンをダウンロードします。現在は AMD でもあります。最後に、このバージョンの Backbone を試してください...

https://github.com/jrburke/backbone/blob/optamd/backbone.js

Burke はこれをバックボーンのフォークから作成し、AMD 準拠のバージョンを作成しました。

次に...
Index.htm

<!DOCTYPE html>
<html>
    <head>
        <title>Google Analytics API Browser</title>
        <!-- This is a special version of jQuery with RequireJS built-in -->
        <script data-main="main" src="require-jquery.js"></script>
    </head>
    <body>

    </body>
</html>

main.js

require(['jquery','order!libs/underscore-min','order!libs/backbone','order!scripts/app'], 
function($,_,Backbone,app){
    app.init();
});

app.js

define(['jquery','backbone','scripts/home'], function($, Backbone, router){
    var init = function(){
        console.log("Started");
            // In here you can load your routers/views/whatever
    };

    return { init: init};
});

私のファイル構造は
/app/index.htm
/app/require-jquery.js
/app/order.js
/app/main.js
/app/text.js
/app/scripts/app.js
/app/scripts/のようになりますhome.js
/app/lib/underscore-min.js
/app/lib/backbone.js

それが役立つかどうか教えてください。さらに助けが必要な場合は、Twitter @jcreamer898 で連絡してください。私は文字通り同じことに取り組んでいます!

更新最近、Github 2 github プロジェクトを作成しました。1 つは実際のアプリで、もう 1 つは単純なスターターです...

https://github.com/jcreamer898/Savefavs
https://github.com/jcreamer898/RequireJS-Backbone-Starter

于 2011-11-18T03:27:30.797 に答える
7

最新の jQuery、Underscore、Backbone.js、および RequireJS が接着されたModular Backbone.js プロジェクト テンプレートを自由にご覧ください。

于 2011-11-28T16:38:00.393 に答える
5

私も同じ問題を抱えていました。実際、AMD 準拠のバックボーンやアンダースコア、require-jquery など (!order など) は必要ないことがわかりました。あなたがする必要があるのは、アプリをパスで定義し、その依存関係をシムで設定することだけです:)。どういうわけか、過去にはそれがなくても機能していました。

paths: {
    app:'app',
    jquery: '../libs/jquery/jquery.1.9.1.min',
    underscore: '../libs/underscore/underscore.min',
    backbone: '../libs/backbone/backbone.min', 
    // ...
},
shim: {
 "app": {
      deps: ['jquery','underscore','backbone'],
      exports: 'app'  
},
"backbone": {
  deps: ['jquery','underscore'],
  exports: 'Backbone'  
},
"underscore": {
  exports: '_'
}
//...

}

于 2013-03-24T12:49:36.090 に答える
3

以下は、バックボーン、lodash (アンダースコアの置き換え)、jQuery、および Require のセットアップ方法の例です: https://github.com/gfranko/Backbone-Require-Boilerplate

于 2012-05-24T21:09:13.983 に答える
0

optamd3ブランチを使用します。

于 2011-11-19T21:07:38.170 に答える