`lib` 中的骨干木偶、RequireJS 和依赖项

Posted

技术标签:

【中文标题】`lib` 中的骨干木偶、RequireJS 和依赖项【英文标题】:Backbone Marionette, RequireJS and dependencies in `lib` 【发布时间】:2012-07-15 23:11:21 【问题描述】:

我一直在开发 Backbone/RequireJS 应用程序,现在正在更新它以使用 Marionette。当 Marionette AMD 尝试在根 / 中搜索 jquery、主干和下划线时,它一开始就中断了,但是,我在 /lib 中有这些库,我可以修改代码。解决这个问题的正确方法是什么? (如果可能,不要将库移出/lib)。

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

【问题讨论】:

【参考方案1】:

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

我使用的方法是从 Volo's default project template 复制的,将 RequireJS 的 baseUrl 设置为 /lib 文件夹,这样您的库代码就可以轻松找到它的依赖项,然后使用 paths config 别名 '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

我的代码.js

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

【讨论】:

【参考方案2】:

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

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

指定这两个库的正确路径,您就可以开始了。这是 Marionette 依赖列表中的一个简单更改,不会影响其余功能。

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

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

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

在你的 requirejs 配置中包含这个:


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

现在 Marionette 将找到“jquery”依赖项

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

【讨论】:

以上是关于`lib` 中的骨干木偶、RequireJS 和依赖项的主要内容,如果未能解决你的问题,请参考以下文章

骨干木偶和 Webpack - 未捕获的类型错误:无法读取未定义的属性“收音机”

带有requirejs的骨干 - 传递给视图时“模型未定义”

RequireJS:如何将变量从一个文件传递到另一个文件?

如何在 zepto 中使用 requirejs

论AMD,CMD,CommonJs 和 ES6对比

如何在基于模块的文件夹结构上使用 marionettejs