RequireJSを使用したバックボーンとアンダースコアの読み込み


172

私はRequireJSでバックボーンとアンダースコア(およびjQuery)をロードしようとしています。BackboneとUnderscoreの最新バージョンでは、それはちょっとトリッキーなようです。1つは、Underscoreがモジュールとして自動的に登録することですが、BackboneはUnderscoreがグローバルに利用可能であると想定しています。また、Backboneはそれ自体をモジュールとして登録していないように見えるため、他のライブラリとの一貫性が失われていることにも注意してください。これは私がその作品を思いつくことができる最高のmain.jsです:

require(
{
    paths: {
        'backbone': 'libs/backbone/backbone-require',
        'templates': '../templates'
    }
},
[
    // jQuery registers itself as a module.
    'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js',

    // Underscore registers itself as a module.
    'http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.2.1/underscore-min.js'
], function() {

    // These nested require() calls are just due to how Backbone is built.  Underscore basically says if require()
    // is available then it will automatically register an "underscore" module, but it won't register underscore
    // as a global "_".  However, Backbone expects Underscore to be a global variable.  To make this work, we require
    // the Underscore module after it's been defined from within Underscore and set it as a global variable for
    // Backbone's sake.  Hopefully Backbone will soon be able to use the Underscore module directly instead of
    // assuming it's global.
    require(['underscore'], function(_) {
        window._ = _;
    });

    require([
        'order!http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.5.3/backbone-min.js',
        'order!app'
    ], function(a, app) {
        app.initialize();
    })
});

私はそれが機能する間、オプティマイザがそれに窒息することを言及しなければなりません。以下を受け取ります:

Tracing dependencies for: main
js: "/home/httpd/aahardy/requirejs/r.js", line 7619: exception from uncaught JavaScript throw: Error: Error: Error evaluating module "undefined" at location "/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js":
JavaException: java.io.FileNotFoundException: /home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js (No such file or directory)
fileName:/home/httpd/aahardy/phoenix/trunk/ui/js/../../ui-build/js/underscore.js
lineNumber: undefined
http://requirejs.org/docs/errors.html#defineerror
In module tree:
    main

これを処理するより良い方法はありますか?ありがとう!


チュートリアルを使用しましたか?
カハ

1
backbonetutorials.com/organizing-backbone-using-modulesのようなさまざまなチュートリアルを調べましたが、最新バージョンのアンダースコアとバックボーンでは現在古くなっているようです。
アーロニウス

また、requirejsは他のライブラリーと一緒に使用するのが難しいと感じました。これが、使いやすく、angularでテストされたライブラリを作成した理由です。下部にデモアプリケーションがあります:gngeorgiev.github.io/Modulerr.jsすべてのスクリプトをModulerr.jsに依存せずに1つに結合することもできます
Georgi-it

btw Synchronous Asynchronous Module Definition is
is a

ハ!いい視点ね。編集。
アーロニウス2014年

回答:


294

RequireJS 2.Xは、Backbone&Underscoreなどの非AMDモジュールに、新しいshim構成するようになりました。

shim構成が使用するのは簡単である:(1)いずれかの依存関係を述べて(depsもしあれば)、(からとすることができるpaths構成、または有効な経路自体であってもよいです)。(2)(オプションで)シミングするファイルからグローバル変数名を指定します。これは、グローバル変数を必要とするモジュール関数にエクスポートする必要があります。(エクスポートを指定しない場合は、グローバルを使用する必要があります。require/ define関数には何も渡されないためです。)

以下は、shimバックボーンをロードするためのの簡単な使用例です。また、依存関係はありませんが、アンダースコアのエクスポートも追加します。

require.config({
  shim: {
    underscore: {
      exports: '_'
    },
    backbone: {
      deps: ["underscore", "jquery"],
      exports: "Backbone"
    }
  }
});

//the "main" function to bootstrap your code
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone) {   // or, you could use these deps in a separate module using define

});

注:この簡略化されたコードは、jquery、backbone、およびunderscoreが、この「メイン」コードと同じディレクトリにある「jquery.js」、「backbone.js」、および「underscore.js」という名前のファイルにあると想定しています(これは、requireのbaseURLになります) )。これが当てはまらない場合は、パスの設定

私は個人的には組み込みのshim機能で考えると、フォークバージョンのBackbone&Underscoreを使用しないことの利点は、他の一般的な回答で推奨されているAMDフォークを使用することの利点よりも優れていますが、どちらの方法でも機能します。


このコードはSample RequireJS 2.0.1 + jQuery 1.7.2 project requirejs.org/docs/download.html#samplejqueryで使用する必要がありますか?
Henry

私があなたを正しく理解しているなら、ヘンリー、あなたは$プラグインにシムが必要かどうか尋ねています。そうではありません。そのサンプルプロジェクトのrequire-jquery.jsファイルを組み合わせて使用​​する場合です。これは、結合されたファイルでは、jqueryがrequireと同期して読み込まれるため、任意のモジュールで$プラグインを使用するときにjqueryが読み込まれることが保証されているためです。この場合、$プラグインを使用する場合、依存関係リストにそれらをAMDであるかのように含めることができます。これは間違いなくルールの例外であり、通常、AMD以外のモジュールにはシムが必要になります。
ベンロバーツ

シム構成はそのサンプルプロジェクトと互換性があり、他の非AMDライブラリを追加するために使用できることに注意してください。
ベンロバーツ

11
これが実際に進むべき道であると私が言及することを考えただけで、私がそれを#1の答えにするために+50の賛成票を与えることができればいいのに。
koblas

この回答の方法は有望に見えましたが、私にはうまくいきませんでした。代わりにgist.github.com/2517531を使用しましたが、問題なく動作しました。
Rob W

171

更新:バージョン1.3.0以降、アンダースコアはAMD(RequireJS)サポートを削除しました

amdjs / Backbone 0.9.1およびamdjs / Underscore 1.3.1フォークを、James Burke(RequireJSのメンテナー)によるAMDサポートで使用できます。

AMDによるUnderscoreおよびBackboneのサポートの詳細。

// main.js using RequireJS 1.0.7
require.config({
    paths: {
        'jquery': 'libs/jquery/1.7.1/jquery',
        'underscore': 'libs/underscore/1.3.1-amdjs/underscore', // AMD support
        'backbone': 'libs/backbone/0.9.1-amdjs/backbone', // AMD support
        'templates': '../templates'
    }
});

require([
    'domReady', // optional, using RequireJS domReady plugin
    'app'
], function(domReady, app){
    domReady(function () {
        app.initialize();
    });
});

モジュールは適切に登録されており、注文プラグインは必要ありません。

// app.js
define([
    'jquery', 
    'underscore',
    'backbone'
], function($, _, Backbone){
    return {
        initialize: function(){
            // you can use $, _ or Backbone here
        }
    };
});

アンダースコアは実際にはオプションです。これは、Backboneが独自に依存関係を取得するためです。

// app.js
define(['jquery', 'backbone'], function($, Backbone){
    return {
        initialize: function(){
            // you can use $ and Backbone here with
            // dependencies loaded i.e. Underscore
        }
    };
});

一部ではAMD糖あなたも、このようにそれを書くことができます:

define(function(require) {
    var Backbone = require('backbone'),
        $ = require('jquery');

    return {
        initialize: function(){
            // you can use $ and Backbone here with
            // dependencies loaded i.e. Underscore
        }
    };
});

オプティマイザエラーについて:ビルド構成を再確認してください。パス設定がオフになっていると思います。RequireJSドキュメントに似ディレクトリ設定がある場合は、次を使用できます。

// app.build.js
({
    appDir: "../",
    baseUrl: "js",
    dir: "../../ui-build",
    paths: {
        'jquery': 'libs/jquery/1.7.1/jquery',
        'underscore': 'libs/underscore/1.3.1-amdjs/underscore',
        'backbone': 'libs/backbone/0.9.1-amdjs/backbone',
        'templates': '../templates'
    }, 
    modules: [
        {
            name: "main"
        }
    ]
})

4
それがまさに私が探していたものです。ありがとうございました!非常に詳細な回答も。あなたが説明したように、それは今実行されています。
Aaronius

2
正確で実用的な+1の回答と例を更新します。素晴らしい仕事Riebel、あなたは私を助けてくれた。
Ken

22
元の投稿後ずっとこれを更新し続けることのスーパーボーナス。
Aaronius、2012年

素晴らしい答え@Riebel!それは私にとって本当に役に立ちました。ところで、私はvoloを見ることをお勧めします。これは、githubから依存関係を取得するためにjrburke(requirejsの作成者)が作成したライブラリです。たとえば、amdバージョンのアンダースコアを取得するには、次のように入力するだけ
です。volo


4

良いニュース、アンダースコア1.6.0がrequirejs defineをサポートするようになりました!!!

これより下のバージョンはshimを必要とするか、またはunderscore.jsを必要とし、 "_"グローバル変数がスマッシュされていないことを盲目的に期待します(公正であることは公正な賭けです)

単にそれをロードする

  requirejs.config({
    paths: {
        "underscore": "PATH/underscore-1.6.0.min",
    }
  });

4

直接書き留めます。requirejs.orgで説明を読むことができます。以下のコードを日常の使用のためのスニペットとして使用できます。(ps i use yeoman)(多くのものが更新されたため、2014年2月の時点でこれを投稿しています)

index.htmlにスクリプトが含まれていることを確認してください

<!-- build:js({app,.tmp}) scripts/main.js -->
<script data-main="scripts/main" src="bower_components/requirejs/require.js"></script>
<!-- endbuild -->

次に、main.js

require.config({
    shim: {
        'backbone': {
            deps: ['../bower_components/underscore/underscore.js', 'jquery'],
            exports: 'Backbone'
        }
    },

    paths: {
        jquery: '../bower_components/jquery/jquery',
        backbone: '../bower_components/backbone/backbone'
    }
});

require(['views/app'], function(AppView){
    new AppView();
});

app.js

/**
 * App View
 */
define(['backbone', 'router'], function(Backbone, MainRouter) {
    var AppView = Backbone.View.extend({
        el: 'body',

        initialize: function() {
            App.Router = new MainRouter();
            Backbone.history.start();
        }
    });

    return AppView;
});

お役に立てれば幸いです。


1
あなたが知っているよりも便利です。これは、私のプロジェクト、bower_components、その他すべてのプロジェクトに基づいて構築しようとしたものです。ありがとう@STEEL
ドワイト・スペンサー、

0
require.config({
  waitSeconds: 500,
  paths: {
    jquery: "libs/jquery/jquery",
    jqueryCookie: "libs/jquery/jquery.cookie",
    .....
  },

  shim: {
    jqxcore: {
      export: "$",
      deps: ["jquery"]
    },
    jqxbuttons: {
      export: "$",
      deps: ["jquery", "jqxcore"]
    }
    ............
  }
});

require([
 <i> // Load our app module and pass it to our definition function</i>
  "app"
], function(App) {
  // The "app" dependency is passed in as "App"
  // Again, the other dependencies passed in are not "AMD" therefore don't pass a parameter to this function
  App.initialize();
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.