根据自己的需要适度使用Web开发框架

时间:2021-10-26 20:10:19

软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。Web开发框架能够帮我们大大减少工作量,但是我们应该如何正确看待Web开发框架,并且如何去使用他们呢?

对框架的依赖

从做网站到现在做Web端的应用,我度过了三个时期:

一、使用框架来搭建自己需要的系统。一开始是大框架如drupal(这里我更倾向于称drupal是框架而不是cms),后来觉得过于笨重。于是改用codeignitor等小框架。

二、不再完全使用框架的MVC。而是用框架做服务端数据接口,只提供纯数据,由前端进行逻辑处理和渲染。

三、前端从简单的“分模块,渲染与逻辑混合”,到“分模块,面向页面元素的MVC”,再到“分模块,事件驱动的,面向切面的MVC”(稍后详述)。

为什么会有这三个时期的转变,实际上很大程度是由我对开发过程的希望驱使的。这些希望是这样的:

  1. 当需求确定好以后,首先我希望在前后台单独开发,只要约定好数据接口就行,这样如果有人来帮我,可以很快的互不打扰地进行。而且可以很灵活的各自用虚拟数据测试。
  2. 当我开发前端时,我想要渲染和逻辑完全分离,这样我就可以写逻辑的时候专心于逻辑。保持代码整洁。最重要的是随便页面怎么改,只要业务大体不变,逻辑就可以写好了不用再管。这就引进了前端MVC,实际上就是简单的数据集和渲染的关系。
  3. 我希望逻辑事件的触发是由页面来决定的,并且怎么变都不用再动写好的逻辑层(本质意义上的不动,连文件都不用打开)。这就引入了事件驱动,逻辑层只用监听感兴趣的事件(包括和服务器端的通信也可以用事件驱动),只用触发自己完成后的事件,什么都不用管。渲染层也是如此。
  4. 我希望页面的事件如click, dblclick等能和逻辑事件分离,最好我在这些元素上指定一个特定的属性,它就能给我自动转换并去触发逻辑事件。这样我写js的时候就只用管特效就够了。这就引入了页面事件代理(详见关于ace-engine)。这样可以随便采用什么页面模板就没关系。

以上四点的希望就是我目前开发的理想状态,重点是“简单、重用”,这里的重用实际上指的是“容易加新功能”,“容易应对需求修改”,“容易找bug”。心有余力的话才是“下次还能用”。我想这也是很多和我同样的程序员所迫切需求的吧,虽然我觉得这个层次很低啊,哈哈。下面简单讲如何实现。

  1. 前后分离很容易,做好约定就行了。
  2. 前端mvc可以采用backbone,也可以采用简单的数据集和模板来做。
  3. 对于spa来说,通过定义一个全局事件,各个模块用自己的模块名作命名空间就行了。建议全部事件都通过这个全局的来驱动。使用了backbone的话,不建议直接使用backbone的模型的事件。
  4. 建议采用ace-engine的ace-template,也可以自己写。

ace-engine

ace-engine是百度的王集鹄开发的。我用了一下ace-event和ace-template。非常好用,这里介绍一下。

ace-event实际上是一个浏览器事件的代理。

我们首先来看一个简单例子。你的页面上有一个登陆按钮,按下去以后按钮演示要变,同时弹出登陆对话框。还有一个普通的链接,不需要变化样式,点击同样要出现对话框。我们在实现功能的时候可能会这样做:

  1. 声明弹出对话框的函数。
  2. 给按钮的绑定click事件,先改变样式,再调用对话框函数。
  3. 阻止链接的默认行为,调用对话框函数。

这种做法的缺点是:

  • 逻辑与样式混合,当页面效果复杂了以后代码会混乱。
  • 页面元素如果出现id之类用作选择器的属性变化,代码也需要变动。当新增时,代码中也需要再次绑定。

ace-event能做的就是将显示与业务逻辑分离。具体的方法如下:(以下步骤中的Event对象并不是ace-event的一部分,需要自己另外实现。)

1. 约定好整个系统中的事件名称,通过一个全局的Event对象来注册和触发事件,各个模块之间监听自己的感兴趣的事件。如用户模块监听login事件。并执行回调。

1 Event.on("login",
module_user.login);

2.在页面元素上使用"cmd='login'"来表示点击会要触发的事件。

3.在表示层中使用ace-event来监听cmd指向的事件,进行页面的渲染,然后再抛出逻辑层事件。如

1 AceEvent.on(selector_id, function(command,
target){
2     //这里的target就是被点击的元素
3     //command就是该元素上绑定的命令
4  
5     //在这里进行页面的渲染
6     //同时抛出逻辑层事件,如:
7     Event.fire("login");
8 });

这种做法相对于backbone等大的mvc来说优点在于简洁,性能高。ace-template就不详述了,相对于其他前端模板它的有点在于js和html可以随意混合编写,不需要类似于"<%"的语法分隔符。很强大。

http://www.cnblogs.com/dekins/archive/2012/03/27/2418886.html