2012-07-09 67 views
8

我已经定义了一个RequireJs配置定义路径和垫片:RequireJs:使用自动加载-DEPS与垫片

require.config({ 
    // define application bootstrap 
    deps: ["main"], 

    // define library shortcuts 
    paths: { 
     app: "app" 
     , jquery: "lib/jquery" 
     , underscore: "lib/underscore" 
     , backbone: "lib/backbone" 
     , bootstrap: "lib/bootstrap" 
    }, 

    // define library dependencies 
    shim: { 
     jquery: { 
      exports: "$" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     }, 
     bootstrap: { 
      deps: ['jquery'], 
      exports: "bootstrap" 
     }, 

     // main application 
     app: { 
      deps: ["backbone"], 
      exports: "App" 
     } 
    } 
}); 

正如你看到的最后一个“垫片”的声明应该使它能够访问骨干(和它的DEP )当我加载主App(-namespace)。

在现实中,这并不工作:

require(["app"], function($, _, Backbone, App){ 
    app.router = new Backbone.Router.extend({ 
     // routing and route actions 
    }); 
}); 

令我疑惑的是,在“脊梁 - boilderplate” - 项目,骨干(及其DEPS)可供选择这种方式: https://github.com/tbranyen/backbone-boilerplate/blob/master/app/main.js

甚至不必在函数中定义它。

那么我做错了什么?

+2

尝试从扩展路由器的'require'函数中删除'$,_,Backbone'。我认为垫片的工作,以便他们只出口您不需要添加到任何调用的全局值 – jakee 2012-07-09 12:26:23

+0

嘿,这很好:)我甚至可以在定义函数的deps数组中删除“主干”关键字虽然这在每个模块中都不起作用......您是否会创建一个答案,以便我可以解决这个问题? – 2012-07-09 14:37:55

+0

完成,很高兴我能帮助! – jakee 2012-07-09 15:06:09

回答

5

从扩展路由器的require-功能中删除$, _, Backbone-参数。垫片输出全局值,因此不需要在requiredefine中调用它们,就像您为常规依赖项所做的那样。

将它们作为参数传递给全局变量,最有可能导致它们未定义。

+1

一个精度:传递Backbone作为参数隐藏全局定义,你可以直接使用'window.Backbone' – nikoshr 2012-07-09 15:21:11

11

从我读过,requirejs传递参数,根据你的数组中指定的内容...因此你的电话应该是这样的:

require(["app"], function (App) { // less arguments 
}); 

或者这样:

require(
    ["jquery", "underscore", "backbone", "app"], // more deps 
    function ($, _, Backbone, App) { 
    } 
); 
+0

我投你一票。我不同意这一个jakee。 – Constantine 2013-01-24 22:19:56

+0

我同意。封装依赖性是AMD的全部重点。你应该这样做 – 2013-05-30 17:36:01

+0

而在这里你有变量封装,你不符合干燥的原则。假设所有突然出现的'app'都比你在那里列出的依赖更多。 – Toskan 2014-07-11 22:06:14