在介绍Backbone.js框架之前,先回顾一下软件应用的发展历程。大约十年前,大多数软件应用都是作为独立应用构建的,这些应用针对单个用户运行在他们的操作系统上。随着时间的发展,出现了跨多个用户共享数据的需求,以及在中心位置存储数据的需求。这种需求催生了分布式应用和网络应用。分布式应用在用户机器上作为独立应用运行,为用户提供了丰富的用户界面(类似于桌面体验),并在后台将数据发送到服务器。而网络应用则相反,它们被限制在网络浏览器中,使用HTML和HTTP让用户对存储在远程服务器上的数据执行操作。
这两种应用的主要区别在于,分布式应用提供了交互式用户体验,而网络应用由于技术限制,提供的功能非常有限。分布式应用的缺点是,很难在所有用户中推广和确保应用程序的更新。网络应用没有这样的问题,因为一旦应用程序在服务器上更新,所有用户都会获得更新的应用程序。
这两种方法都有优点和缺点,需要找到一种方法来结合两者的优点。这时,基于浏览器插件的应用,如Flash应用和Silverlight应用出现了。这些技术填补了HTML无法实现的所有功能的空白。它们提供了在浏览器中运行的丰富互联网应用的可能性。唯一的缺点是用户需要安装浏览器插件才能使这些应用程序工作。
随着浏览器变得更加强大,HTML变得更加成熟,仅使用基于浏览器的客户端技术创建丰富的互联网应用成为可能。这促使开发者使用HTML和JavaScript编写客户端代码以创建丰富的互联网应用。不需要像Flash和Silverlight这样的插件。但是,由于HTML和JavaScript从未打算用于编写完整的网络应用程序,这些应用程序的HTML和JavaScript代码交织在一起。这导致了意大利面条代码,这些客户端HTML/JavaScript应用程序(单页应用程序或SPA)成为了维护的噩梦。
那么,为什么要编写单页应用程序,它们会导致糟糕的代码呢?创建单页应用程序的主要原因是它们允许为用户提供更接近原生/桌面/设备的应用体验。因此,需要以结构化的方式创建SPA,这就产生了对JavaScript框架和库的需求,这些框架和库为单页应用程序提供了一些结构。
目前,有许多开源JavaScript框架可以帮助解决意大利面条代码的问题。这些框架让以结构化的方式设计应用程序。
一个好的应用程序架构中最好的事情之一就是关注点分离(SoC)。Backbone Marionette框架最好的地方之一就是能够使用MVC模式提供这种关注点分离。模型将代表实现解决方案所需的业务对象。视图是用户可以看到的部分。用户可以通过视图简单地使用数据或对数据进行操作,即CRUD操作。控制器是提供模型和视图之间交互机制的部分。控制器的责任是对用户的输入做出反应,并通过更新模型和视图来协调应用程序。模型和视图保持松散耦合,即模型对视图一无所知,视图有一个模型对象(关联)来提取信息并显示给用户。
Backbone.js是一个轻量级框架,让以结构化的方式创建单页应用程序。它基于模型-视图-控制器(MV*)模式。它最适合使用RESTful服务来持久化数据的单页应用程序。
现在,人们可能会想知道这是什么MV*。已经详细讨论了MVC架构,然后说Backbone是一个MV*框架。这样做的原因是Backbone不想强制使用控制器。应用程序可以选择自己的代码作为控制器,使用可以提供控制器的插件,或者可能使用MVVM模式而不是MVC模式。
每个应用程序都需要某种方式来组织它们的数据结构。Backbone将为提供创建模型来管理所有的实体的可能性。Backbone模型默认提供了持久化自己的方式。持久化可以是localStorage,甚至可以通过RESTful API在服务器上进行。这些模型还提供了在持久化之前验证模型中数据的方法。
集合简单地说是一组模型。Backbone还提供了创建有序模型集合的可能性,即集合。
JavaScript应用程序的主要问题之一是处理视图上的UI元素。监听它们的事件并根据接收到的数据更改它们的值。Backbone通过提供对HTML元素的抽象,即视图,来简化这个问题。Backbone视图就像一些HTML的观察者。可以定义HTML并将其与视图关联。然后,视图将负责处理这些HTML元素的事件,并根据数据填充和渲染这些视图。HTML完全与视图对象分离。它可以直接与视图对象关联,也可以通过某种模板引擎(稍后将看到所有这些在行动中)。
即使想要创建一个单页Web应用程序,需求可能会要求复制、书签URL。因此,对于单页应用程序,如果希望URL确定要渲染的视图/视图,路由器非常有用。路由器将查看请求的URL,然后根据请求的URL执行代码,然后向用户呈现视图。
编写这个教程系列的目的是逐步理解backbone.js框架,通过查看小的功能块。本文主要是让用户熟悉backbone.js框架的功能。从下一篇文章开始,将深入研究backbone框架的细节。稍后,将创建一个完整的应用程序来理解所有这些概念。