最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone形成的,也就是Backbone的好和坏都在其中尽显无遗。前端
说说本身对Backbone优缺点的见解。android
Backbone确实是优秀的单页MVC框架,Events自定义事件机制,为Model/View/Colllection提供基础模块通讯,Aync模块封装了CRUD的ajax操做,Router/History为开发者提供了路由机制,从很大程度上解决了开发者本身写路由跳转的逻辑。web
固然也存在缺陷,面对大型webapp项目,以page为单位的view数量增多时,一方面路由过于集中,路由逻辑变得复杂,甚至有大量对"职责分离"原则缺少认识的同窗会在router中写入大量的业务逻辑,另外一方面缺乏对view的统一管理,如view的建立、切换、销毁、跳转回退等。ajax
为了弥补Backbone在webapp中的缺陷,能够为其提供页面生命周期管理和路由管理机制。app
先来讲webapp生命周期管理。框架
别被生命周期这种大概念吓住了,生命周期就是页面从建立到销毁的一个抽象过程,若是能抽象的好,能够为页面内部的业务逻辑提供良好的管理。dom
熟悉android activity的同窗能够看到在android framework为activity提供至关完美的生命周期,从onCreate到onShow到onHide到onDestroy,开发者只须要在生命周期回调函数中填写相应的业务代码便可。webapp
(注:能够把android的activity当作一个page)ide
那么咱们学习activity是否能够为page(把一个全屏view当成一个page,view即page)提供这种机制,在page被插入到dom节点(viewport)时提供onCreate回调,在page被显示出来时提供onShow回调,以此类推,page还能提供onHide/onDestroy回调。这样前端写业务的同窗是否是能更好的专一业务逻辑,无须考虑页面是如何建立销毁,不会致使框架级代码和业务代码混合在一块儿。函数
除了对page提供生命周期,咱们还能够学习android framework中activity的管理对整个webapp进行管理。
在android应用启动时,会启动全局application,并为activity准备好运行环境,虽然这在基础的android demo上并未可见,是由于android提供了默认的application。
咱们在建立webapp的时候,也能提供一个全局的application,为application也提供生命周期,如onCreate/onDestroy等。如webapp在启动时初始化application,等到依赖的框架资源加载完成时,触发onCreate回调,这时默认的第一个page则能够开始建立并显示。
在application的环境下,咱们还能提供对view的管理,创建相似activity task/stack的机制。
在android第一个activity启动时,会创建一个默认的stack,将该activity放入其中,每个activity在stack中被称为一个task,这样在用户回退时可根据stack中的task来自动选择回退,而不须要指定跳转的目标activity。
有了task/stack管理机制,针对webapp也能提供对view的管理。在建立application的时候提供一个stack,当显示一个view的时候将该view做为一个task压入stack中,在页面返回管理时则变得与android activity同样简单。
除此以外,咱们还能挖掘activity的高级特性,如standard,singleTop,singleTask,singleInstance,这样能够为view提供不少丰富的特性。
默认standard即建立一个view,将其压入stack,返回时弹出stack;singleTop方式可指定view显示时在stack顶层不能出现两个一样的view;
singleTask模式则不容许一个stack中出现两个一样的view,好比某些特殊的公共页面可指定这种方式;singleInstance则是单独为该view建立一个stack,这种模式在webapp中暂时少见。
有了以上对view生命周期的管理、application生命周期的管理、application对view stack的管理,咱们就能解决Backbone对view管理的不足。
接着说webapp的路由与返回管理。
Backbone提供的路由机制适用于小型的单页应用,若是不对其进行管理则会变得混乱。
咱们根据以上application对view的管理,为view封装一个生命周期基类Page,其中包括forward/back等方法,并提供一个对应的PageManager,屏蔽业务开发者对router的直接访问。
根据用户配置的hash:view映射,在用户跳转view的时候直接调用forward指定目标viewname(hash),Page则可调用底层Backbone的router实现url切换,负责view的建立,而且能够经过PageManager将view进行入栈管理,保存view的状态。
而webapp中页面的返回管理,则能够在back中根据PageManager中的stack信息实现页面的默认跳转、指定页面跳转等。
默认跳转则是按照stack出栈顺序返回,指定跳转则能够回到栈中的某一view,并能够指定是将view新建一个置顶到stack top,仍是将该view以上的其余view所有销毁。
这只是其中的两个简单返回机制,更多的返回能够经过抽象业务场景来设计。
以上的两点能够解决在构建webapp时遇到的通用问题,无论view/router是否使用Backbone,都能创建一个良好的webapp框架。