Backbone Marionette,RequireJS和`lib`中的依赖项

时间:2012-07-17 03:21:09

标签: backbone.js requirejs marionette

我一直在使用Backbone / RequireJS应用程序,现在正在更新它以使用Marionette。它首先打破Marionette AMD试图在根/中搜索jquery,骨干和下划线,但是,我在/lib中有这些库,我可以修改代码。什么是解决这个问题的正确方法? (如果可能的话,不要将库移出/lib)。

我现在所做的是使用非AMD版本。但有时,我在某些视图中得到CollectionView未定义的错误,这让我想知道它是否与使用非AMD构建的RequireJS相关

2 个答案:

答案 0 :(得分:2)

您不能(或至少不应该)修改每个库的源代码,以告诉它依赖的位置。但是,您可以控制 代码的位置。

我使用的方法(我从Volo's default project template复制)是将RequireJS的baseUrl设置为/lib文件夹,以便您的库代码可以轻松找到其依赖项,然后使用{ {3}}将“app”别名为 my 代码所在的位置,如下所示:

目录布局

/www 
  /js
    main.js
    /lib
      backbone.js
      backbone.marionette.js
      (etc)
    /app
      my-code.js
      view.js

main.js(或您配置RequireJS的任何地方)

requirejs.config({
    baseUrl: 'www/js/lib',
    paths: {
        app: '../app'
    }
});
// Go on to load another module that contains the actual app. Example:
requirejs(['app/my-code']);

paths个配置中的所有路径都与baseUrl相关。如上所述定义app的映射意味着当RequireJS加载名为 app / foo 的模块时,它将使用(baseUrl)/../ app / foo.js

MY-code.js

define(['backbone', 'app/view'], (Backbone, MyView) {/*...*/}

答案 1 :(得分:2)

这是一个常见问题,我知道有两种解决方案:

1)为您的项目修改Marionette的AMD版本。

指定这两个库的正确路径,你会很高兴。这是Marionette依赖列表中的一个简单更改,不会影响其余功能。

但这是一个坏主意。这意味着您必须更改代码,并且每当您获得新版本时,您都必须再次更改它。

2)在requirejs中使用命名模块/路径

我已将依赖项指定为“jquery”,“underscore”,“backbone”字符串,这意味着您可以使用命名路径来配置这些依赖项所在的位置。

在requirejs配置中包含此内容:


require.config({
  paths: {
    "jquery": "/your/path-to/jquery"
  }
});

现在Marionette

会找到“jquery”依赖关系

这是两个解决方案中较好的一个,因为它不需要您更改牵线木偶文件。它只需要您配置RequireJS来提供这些命名路径。