简体   繁体   English

使用RequireJS加载Backbone和Underscore

[英]Loading Backbone and Underscore using RequireJS

I'm trying to load Backbone and Underscore (as well as jQuery) with RequireJS. 我正在尝试使用RequireJS加载Backbone和Underscore(以及jQuery)。 With the latest versions of Backbone and Underscore, it seems kind of tricky. 使用最新版本的Backbone和Underscore,看起来有点棘手。 For one, Underscore automatically registers itself as a module, but Backbone assumes Underscore is available globally. 例如,Underscore自动将自己注册为模块,但Backbone假设Underscore在全球范围内可用。 I should also note that Backbone doesn't seem to register itself as a module which makes it kind of inconsistent with the other libs. 我还应该注意,Backbone似乎并没有将自己注册为一个模块,这使得它与其他库不一致。 This is the best main.js I could come up with that works: 这是我能想到的最好的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();
    })
});

I should mention that, while it works, the optimizer chokes on it. 我应该提一下,虽然它有效,但优化器会对它产生影响。 I receive the following: 我收到以下内容:

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

Is there a better way of handling this? 有没有更好的方法来处理这个? Thanks! 谢谢!

RequireJS 2.X now organically addresses non-AMD modules such as Backbone & Underscore much better, using the new shim configuration. 现在, RequireJS 2.X使用新的shim配置,更好地有效地解决了Backbone和Underscore等非AMD模块。

The shim configuration is simple to use: (1) one states the dependencies ( deps ), if any, (which may be from the paths configuration, or may be valid paths themselves). shim配置易于使用:(1)一个表示依赖项( deps ),如果有的话(可能来自paths配置,或者可能是有效路径本身)。 (2) (optionally) specify the global variable name from the file you're shimming, which should be exported to your module functions that require it. (2)(可选)从正在填充的文件中指定全局变量名称,该文件应导出到需要它的模块函数中。 (If you don't specify the exports, then you'll need to just use the global, as nothing will get passed into your require/define functions.) (如果你没有指定导出,那么你只需要使用全局,因为什么都不会传递到你的require / define函数。)

Here is a simple example usage of shim to load Backbone. 下面是一个简单的shim加载Backbone的示例用法。 It also adds an export for underscore, even though it doesn't have any dependencies. 它还为下划线添加了导出,即使它没有任何依赖项。

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

});

Note: this simplified code assumes that jquery, backbone and underscore are in files named "jquery.js", "backbone.js" and "underscore.js" in the same directory as this "main" code (which becomes the baseURL for require). 注意:这个简化的代码假定jquery,backbone和underscore在名为“jquery.js”,“backbone.js”和“underscore.js”的文件中与此“main”代码在同一目录中(它成为require的baseURL) )。 If this isn't the case, you'll need to use a paths config . 如果不是这种情况,则需要使用路径配置

I personally think with the built-in shim functionality, the advantages of not using a forked version of Backbone & Underscore outweigh the benefits of using the AMD fork recommended in the other popular answer, but either way works. 我个人认为使用内置的shim功能,不使用分叉版Backbone和Underscore的优势超过了使用其他流行答案推荐的AMD分叉的好处,但两种方式都有效。

Update : As of version 1.3.0 Underscore removed AMD (RequireJS) support . 更新 :从版本1.3.0开始, Underscore删除了AMD(RequireJS)支持

You can use the amdjs/Backbone 0.9.1 and the amdjs/Underscore 1.3.1 fork with AMD support from James Burke (the maintainer of RequireJS). 您可以使用amdjs / Backbone 0.9.1amdjs / Underscore 1.3.1 fork以及James Burke(RequireJS的维护者)的AMD支持。

More info about AMD support for Underscore and Backbone . 有关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();
    });
});

The modules are properly registered and there is no need for the order plugin: 模块已正确注册,无需订购插件:

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

Underscore is actually optional, because Backbone now gets its dependencies on its own: Underscore实际上是可选的,因为Backbone现在可以自己获取它的依赖:

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

With some AMD sugar you could also write it like this: 有了一些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
        }
    };
});

Regarding the optimizer error: doublecheck your build configuration. 关于优化程序错误:双击您的构建配置。 I assume your path configuration is off. 我假设您的路径配置已关闭。 If you have a directory setup similar to the RequireJS Docs you can use: 如果您有一个类似于RequireJS Docs目录设置,您可以使用:

// 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"
        }
    ]
})

For reference, as of version 1.1.1 (~Feb '13), Backbone also registers itself as an AMD module . 作为参考,从版本1.1.1(〜2013年2月)开始,Backbone还将自己注册为AMD模块 It will work with requirejs without the need to use its shim config. 它将与requirejs一起使用,而无需使用其shim配置。 ( James Burke's amdjs fork also hasn't been updated since 1.1.0) James Burke的amdjs fork自1.1.0以来也没有更新)

Good news, Underscore 1.6.0 now supports requirejs define !!! 好消息,Underscore 1.6.0现在支持requirejs定义!

versions below this require shims, or requiring underscore.js then blindly hoping that the "_" global variable hasn;t been smashed (which to be fair is a fair bet) 下面这个版本需要垫片,或者需要使用underscore.js然后盲目地希望“_”全局变量没有被破坏(这是公平的赌注)

simply load it in by 只需加载它

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

I will write down directly, you can read the explaination on requirejs.org, you could use below code as a snippet for your everyday use; 我会直接写下来,你可以阅读requirejs.org上的解释,你可以使用下面的代码作为你日常使用的片段; (ps i use yeoman) (since many things updated, im posting this as of Feb 2014.) (ps我使用自耕农)(因为很多事情已经更新,我发布截至2014年2月。)

Make sure you included script in your index.html 确保在index.html中包含脚本

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

Then, in main.js 然后,在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.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;
});

I hope I was useful.! 我希望我很有用。

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();
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM