客户端逻辑还是服务器端逻辑?

Zhu*_*Tao 57 performance

我已经完成了一些基于网络的项目,我遇到的大多数困难(问题,混淆)都可以在帮助下找到.但是我仍然有一个重要的问题,即使在询问了一些有经验的开发人员之后:当使用服务器端代码和客户端脚本(JavaScript)实现功能时,应该首选哪一个?

一个简单的例子:

要渲染一个动态HTML页面,我能格式化服务器端代码(PHP,Python)的页面,并(在客户端更多的逻辑在服务器端,以下)使用Ajax来获取格式化的页面直接呈现它.

我还可以使用Ajax来获取数据(未格式化,JSON),并使用客户端脚本来格式化页面,并与更多的处理使得它(服务器从一个数据库或其他来源的数据,并将其返回给客户端使用JSON或XML.客户端更多逻辑,服务器更少逻辑.

那么我怎样才能决定哪一个更好?哪一个提供更好的性能?为什么?哪一个更方便用户?

随着浏览器的JS引擎的发展,JS可以在更短的时间内解释,所以我更喜欢客户端脚本吗?

另一方面,随着硬件的发展,服务器性能不断提高,服务器端逻辑的成本也会降低,所以我更喜欢服务器端脚本?

编辑:

有了答案,我想简要总结一下.

客户端逻辑的优点:

  1. 更好的用户体验(更快).
  2. 减少网络带宽(降低成本).
  3. 提高可扩展性(减少服务器负载).

服务器端逻辑的优点:

  1. 安全问题.
  2. 更好的可用性和可访问性(移动设备和旧浏览器).
  3. 更好的SEO.
  4. 易于扩展(可以添加更多服务器,但无法使浏览器更快).

在面对特定情况时,我们似乎需要平衡这两种方法.但是怎么样?什么是最佳做法?

除以下条件外,我将使用客户端逻辑:

  1. 安全关键.
  2. 特殊群组(禁用JavaScript,移动设备等).

Eri*_* J. 23

在许多情况下,我担心最好的答案都是.

正如Ricebowl所说,永远不要相信客户.但是,如果你信任客户,我觉得这几乎总是一个问题.如果您的申请值得写,那么值得妥善保管.如果有人可以通过编写自己的客户端并传递你不期望的数据来打破它,这是一件坏事.因此,您需要在服务器上进行验证.

不幸的是,如果您验证服务器上的所有内容,通常会给用户带来糟糕的用户体验.他们可能只填写表格,发现他们输入的许多内容都不正确.这可能适用于"Internet 1.0",但人们对今天互联网的期望更高.

这可能会让您编写相当多的冗余代码,并将其保存在两个或更多位置(某些定义(如最大长度)也需要在数据层中维护).对于相当大的应用程序,我倾向于使用代码生成来解决此问题.我个人使用UML建模工具(Sparx系统的Enterprise Architect)来模拟系统的"输入规则",然后利用部分类(我通常在.NET中工作)来生成验证逻辑.您可以通过以XML格式编写规则并在客户端和服务器层上从该XML文件(输入长度​​,输入掩码等)派生大量检查来实现类似的功能.

可能不是你想听到的,但如果你想做得对,你需要在两个层面上执行规则.

  • +1始终两者:您*希望*cliet-side的UX和性能优势,但*需要*服务器端的安全性和控制权. (3认同)
  • +1; 我从未想过在OP的问题中批评错误的二分法(这个**或**). (2认同)

Dav*_*mas 14

我更倾向于服务器端逻辑.我的理由很简单:

  1. 我不相信客户; 这可能是或不是一个真正的问题,但它是习惯性的
  2. 服务器端减少了每个事务的数量(尽管它确实增加了事务的数量)
  3. 服务器端意味着我可以相当确定正在发生的逻辑(我不必担心客户端浏览器可用的Javascript引擎)

可能有更多 - 更好的理由,但这些是我现在最重要的原因.如果我想到更多,我会添加它们,或者在我做之前对那些提出它们的人进行投票.


编辑,valya评论说使用客户端逻辑(使用Ajax/JSON)允许(更容易)创建API.这可能是真的,但我只能半同意(这就是为什么我还没有对这个答案进行投票).

我的服务器端逻辑概念是检索数据并组织数据的概念; 如果我做对了,逻辑就是'控制器'(MVC中的C).然后将其传递给"视图".我倾向于使用控制器来获取数据,然后"视图"处理将其呈现给用户/客户端.所以我没有看到客户端/服务器的区别必然与创建API的论点有关,基本上是:马匹用于课程.:)

...另外,作为一个业余爱好者,我认识到我可能会略微扭曲使用MVC,所以我愿意在这一点上做出纠正.但我仍然将演示文稿与逻辑分开.到目前为止,这种分离是API的优点.


Jam*_*nes 5

我通常实现尽可能合理的客户端.使我成为服务器端的唯一例外是解决以下问题:

信任问题

任何人都能够调试JavaScript和读取密码等.这里不用脑子.

性能问题

JavaScript引擎正在快速发展,因此这已成为一个问题,但我们仍处于IE主导的世界,因此当您处理大量数据时,事情变慢.

语言问题

JavaScript是弱类型语言,它对您的代码做了很多假设.这可能会导致您使用怪异的变通办法,以便在某些浏览器上按照应有的方式工作.我避免像瘟疫这样的事情.


从您的问题来看,听起来您只是想将值加载到表单中.除非上述任何问题,您有3个选择:

纯客户端

缺点是用户的加载时间会加倍(空白表单加载一次,数据加载另一次加载).但是,对表单的后续更新不需要刷新页面.如果从服务器加载到同一表单中的大量数据,用户会喜欢这样.

纯服务器端

优点是您的页面将加载数据.但是,对数据的后续更新将需要刷新页面的所有/重要部分.

服务器 - 客户端混合

你可以拥有两全其美,但是你需要创建两个数据提取点,导致你的代码略微膨胀.

每个选项都需要权衡,因此您必须权衡它们并决定哪一个为您提供最大的好处.