4

和你们中的许多人一样,我已经开始使用只支持 JSON 的后端(在我的例子中是 Django 或 Rails)来编写越来越多的 Web 应用程序。

作为前端,我一直在使用 MVC 客户端,例如 Backbone.js。据我说,这个解决方案非常好,并且适用于许多类型的应用程序。

我发现烦人的是,我发现自己编写了大量的 Javascript 代码,它们几乎做同样的事情。感觉就像我正在为每个新应用程序在 Backbone 之上创建一个新层。我在这里思考的方式一定有问题。

给你举个例子:

假设您有一个提供六个集合的 API,并且您想使用 Twitter Bootstrap 来展示这一点。您将有一个导航菜单,您可以在其中选择要查看的每个集合。

将有大量的 Javascript 代码来设置所有模型、集合、视图以及围绕路由和导航的逻辑。您还必须考虑哪个视图处于活动状态。

如:

获取集合时的错误处理

如果一个集合正在加载,我们希望看到“正在加载”。如果它失败了,我们会看看为什么。创建/保存/删除也是如此。

路由

我发现自己编写了一个复杂的逻辑,最终只是在匹配的 URL:s 上呈现一个特定的视图。它只是一个包含所有实例化视图的数组。有时您甚至不需要视图,只需要与 URL 关联的模板。好吧,如果你有六个菜单,你就可以有六个功能。但是,如果菜单是三层深度,每层有六个选项,您就不能为每个视图设置一个路由功能。

导航栏和面包屑

这将是从我上面的复杂逻辑中调用的视图。如果导航是多层次的深度,这可能真的很复杂。

我的问题是:我在这里有那么独特吗?如果没有,你如何解决这个问题?

Backbone.js 不适合我吗?什么替代品更适合(哦,是的,我已经搜索过)?

谢谢你的时间,我真的很感激你的所有想法。

4

1 回答 1

15

我想说这里有两个因素在起作用:

  1. 骨干应用程序确实很容易变得冗长,因为框架本身是如此的小而简单。对于 Backbone 所没有的每个功能和代码行,您必须编写。这是其基本理念的一部分。引用文档:

    Backbone.js 旨在提供具有雄心勃勃的界面的数据丰富的 Web 应用程序所需的通用基础——同时通过做出任何你更有能力自己做出的决定来刻意避免将你逼入绝境。

    所以这是一个权衡。还有其他更全面的框架,例如Ember.jsAngularJS,它们往往会在您自己的代码库中生成更少的样板代码。它们都是一流的框架,你可能想看看。当然,代价是更大的框架规模、更多的第三方复杂性以及“将自己画在角落里”的风险。

    如果您想继续使用 Backbone,但您觉得需要框架提供更多帮助,请查看Backbone.Marionette。我没有亲自使用过它,但对我来说,它看起来是用更少的代码和可维护的结构解决许多常见问题的好方法。

  2. 仅使用 Backbone 可能会做得更好。Backbone Model- View-Router模式只能让你到目前为止,在谈论复杂、更大的应用程序时,Backbone 并不是特别擅长向你展示正确的方式。

    当你开始重复代码时,你必须重构、概括并保持 DRY。例如:

    • 要在一个地方定义加载图标,请连接到jQuery.ajax事件或覆盖Backbone.sync
    • 对于简单的路由操作,请定义声明性route->view映射,根据需要使用可选的路由参数和自动装配依赖项。使这些分层并基于此地图生成导航视图组件。
    • 在路由更改时自动连接您的面包屑Backbone.history.navigate并将路由片段映射到本地化的 UI 文本。

    .

    通过应用一些通用的软件开发模式,将逻辑封装到基类、服务、实用程序、小部件、装饰器、mixin 和你所拥有的东西中,我已经设法让 Backbone 应用程序从微小的 50 行扩展到 50 000 多个 LOC 野兽. 这实际上与大型 Rails 项目没有什么不同:当应用程序的复杂性和规模增长时,对代码卫生和结构化模式的需求也会增长。

    要在项目之间转移通用解决方案,请从每个项目中创建独立组件。在您提供的示例中,我可以很容易地看到 aBackbone.LoadingIndicator和形成。为了更进一步,用Bower之类的东西打包你的组件,并将它们作为依赖项包含在你的项目中。Backbone.NavigationBackbone.Breadcrumb

您的问题没有正确答案,但可以肯定地说,Backbone 应用程序的扩展性远远超出了您所描述的范围。它只是希望您进行扩展,作为回报,它使您可以自由地按照您的应用程序需要构建的方式构建您的应用程序,而不是按照框架所说的方式构建您的应用程序。选择是你的,一如既往。

于 2013-02-06T09:18:48.220 回答