On 10月5日, 上午10时40分, 朱涛 Tower Joo <zhutao.is...@gmail.com> wrote:
> 大家好!
> 在做过几个基于web的项目后, 碰到了一个比较难把握的问题: *在实现同一个功能时, 我们应该选择服务器端逻辑还是客户端的逻辑?*
> *
> *
> *举个简单的例子:*
> *功能: 我现在想动态地显示一个页面*
> *方案1: 服务器端的逻辑: 从数据库里取出数据使用服务器端代码(PHP,python)来生成格式化后的页面,返回给客户端,
> 然后客户端直接显示.(所谓的more server side logic, less client side logic)*
> *方案2: 客户端的逻辑: 从数据库里直接取出数据,
> 并不格式化,而是以json或者xml返回给客户端,让客户端的代码(javascript)来格式化,继而显示(所谓的more client side
> logic, less server side logic)*
> *
> *
> *当然上面只是一个简单的例子, 可以推广到各种ajax的动态请求场景.*
> *
> *
> *从用户的角度来看,二者的结果是一致的,但是程序员在处理时却是截然不同的. 所以出现了下面的几个问题:*
>
> 1. 我们应该优先选择哪种?
> 2. 哪种有更好的performance?
> 3. 哪种更user-friendly?
>
> 这个问题, 我同时也在SO上进行了讨论,大家可以参见这里:http://stackoverflow.com/questions/1516852/client-side-logic-or-serve...
>
> 从回答的答案来看, 也没有取得一个统一的结果,主要有下面几个观点
> 支持服务器端逻辑:
>
> 1. 安全性
> 2. 搜索引擎友好
> 3. 有更好的accessibility
> 4. 更好的适应性(无论用户使用的是支持js或者不支持的)
> 5.
> 用户体验的稳定性(由于不知道用户使用的是什么浏览器,也就不能确定js引擎的解析速度,所以可能某些浏览器用户会觉得很友好,而某些会觉得很慢,而使用服务器端则取决于网络)
> 6. 硬件成本的降低(这也是可预期的)
>
> 客户端的逻辑:
>
> 1. 用户友好(不需要refresh,而且通常会有更好的异步处理,所谓的ajax)
> 2. 节省带宽,减少成本(当然传输pure data的json肯定会比格式化好的html节省更多的带宽)
> 3. 扩展性(这点可能比较有争议,但是保持服务器端逻辑的简洁对于扩展性还是很有帮助的)
> 4. 现代浏览器的发展(IE,FF,
> chrome相继宣称自己有更快的js引擎,所以js的解析速度会有大幅度的提升,而且使用老浏览器的用户也是极少的)
>
> 好像是各有道理,那么可能更好的办法是both,于是一个新问题就出来了: *在何种场景下使用何种策略? 在可预期的未来, 哪种方式更要优先考虑呢?*
>
> 我个人的见解是除了下面几种情况外,我都会优先使用客户端的逻辑:
>
> 1. 安全性(如一些验证, 也就是状态更改相关的)
> 2. 特殊人群(可能某些人群具有特殊的属性,如果我们的服务是针对这些人的,可能就要好好权衡)
>
> 希望有经验的朋友能够给出一些比较有说服力并且可操作的方法来(比如应用场景),也请解释下相应的原因.
>
> 谢谢.
> *
> *--
作为服务器的一切输入都需要验证,这个例子不能说明服务器端存在劣势。
逻辑也分UI逻辑和模型逻辑,其实我认为楼主要问的是,MVC中的 Controller 是放在服务器端好还是客户端好。
作为一个程序员,我的观点是放在客户端更好,因为在同一个程序语言(js),同一个环境(js
解释器)中表达状态是最方便的(stack就是最直接的表现程序状态),不需要任何 inversion of control,
或者大量的状态变量。而简洁清晰的服务器端接口,也方便了自动测试和调试。
--
黄 澗石 (Jianshi Huang)
http://huangjs.net/
大家好!
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"> </script>
<script>
CFInstall.check({
node: "placeholder",
destination: "http://www.waikiki.com"
});
</script>
这个例子是说明在同一功能的实现逻辑上(验证表单)可以选择客户端逻辑, 也可以选择服务器端逻辑,譬如email验证, 显然二者都可以达到目的(正常用户), 但是客户端的逻辑是存在安全隐患的, 这也就是例子中提到的绕开客户端验证的逻辑来直接提交给服务器.