Backbone.js 使用requirejs的主干应用程序模式

Backbone.js 使用requirejs的主干应用程序模式,backbone.js,requirejs,Backbone.js,Requirejs,我偶然发现了一些带有requirejs的主干应用程序。有一件事看起来很奇怪。无论何时他们需要在我的模块中引用主干、下划线或jquery,我都必须要求他们: define([ 'jQuery', 'Underscore', 'Backbone', 'collections/projects', ], function($, _, Backbone, ProjectsCollection, projectsListTemplate){ var projectListView =

我偶然发现了一些带有requirejs的主干应用程序。有一件事看起来很奇怪。无论何时他们需要在我的模块中引用主干、下划线或jquery,我都必须要求他们:

define([
  'jQuery',
  'Underscore',
  'Backbone',
  'collections/projects',
], function($, _, Backbone, ProjectsCollection, projectsListTemplate){
  var projectListView = Backbone.View.extend({
    el: $("#container"),
...

那么,真的有必要这样做吗?是不是有点过度设计了?难道我不能在启动应用程序之前加载主干网及其依赖项,并将它们用作全局对象,就像在没有requirejs的情况下那样吗?还是我错过了什么

这两种方法都有优点/缺点

优点:

依赖关系管理完全由require.js控制,而不是依赖于同步加载的全局范围库。它优雅、模块化,可能是正确的做事方式

优点:

在库的版本中交换更容易,尤其是每个模块。老实说,我从来没有在实践中见过这种情况——这似乎是一种假设情况,而不是实际情况。如果你这样做了,那么你很可能是在把一些东西拼凑在一起,牺牲了你最初将它们作为模块使用所获得的代码优雅

缺点:

你有很多样板进口货

define(['jQuery', 'underscore', 'backbone', 'raphael', ...],
在一个大型应用程序中,可能需要六个库依赖项才能找到依赖项。在每个模块中

对于主干网密集型应用程序来说,冗余感觉尤其不必要,因为每个模块可能都定义了一个主干网模型/控制器/视图-几乎每个模块都需要主干网

您可以将它们全部封装到一个单独的Lib模块中,您可以像Lib一样引用它。$。。。或者Lib.……,但这只是将样板文件从导入中移到代码中。它也否定了优势2

那是哪一个呢

我想说的是单独查看每个库,并决定它是全局的还是自己导入的模块

如果您打算在几乎所有地方使用这个库,例如jQuery、主干网,那么就让它保持全局性


对于其他库,您可能只在几个视图中使用它们,例如Raphael.js。在这种情况下,请将其作为一个模块导入。

无论哪种方法都有优点/缺点

优点:

依赖关系管理完全由require.js控制,而不是依赖于同步加载的全局范围库。它优雅、模块化,可能是正确的做事方式

优点:

在库的版本中交换更容易,尤其是每个模块。老实说,我从来没有在实践中见过这种情况——这似乎是一种假设情况,而不是实际情况。如果你这样做了,那么你很可能是在把一些东西拼凑在一起,牺牲了你最初将它们作为模块使用所获得的代码优雅

缺点:

你有很多样板进口货

define(['jQuery', 'underscore', 'backbone', 'raphael', ...],
在一个大型应用程序中,可能需要六个库依赖项才能找到依赖项。在每个模块中

对于主干网密集型应用程序来说,冗余感觉尤其不必要,因为每个模块可能都定义了一个主干网模型/控制器/视图-几乎每个模块都需要主干网

您可以将它们全部封装到一个单独的Lib模块中,您可以像Lib一样引用它。$。。。或者Lib.……,但这只是将样板文件从导入中移到代码中。它也否定了优势2

那是哪一个呢

我想说的是单独查看每个库,并决定它是全局的还是自己导入的模块

如果您打算在几乎所有地方使用这个库,例如jQuery、主干网,那么就让它保持全局性


对于其他库,您可能只在几个视图中使用它们,例如Raphael.js。在这种情况下,将其作为一个模块导入。

是否建议通过扩展当前模块来假装导入整个包,而不在所有内容前加前缀?比如说?这将限制对每个代码的修改量…@phtrivier-可能取决于你的情况-我从未真正尝试过。我自己可能会避免这样做,因为它增加了似乎不必要的复杂性。拥有一个长长的导入列表并不是世界末日,至少其他人都清楚发生了什么。通过扩展当前模块,在不添加任何前缀的情况下冒充导入整个包是否明智?比如说?这将限制对每个代码的修改量…@phtrivier-可能取决于你的情况-我从未真正尝试过。我自己可能会避免这样做,因为它增加了似乎不必要的复杂性。拥有一份长长的进口清单并不是世界末日,至少对其他人来说,发生了什么事情是清楚的。