富Web应用的七项原则

这是一篇关于使用Javascript控制界面遵循的七项原则(点击标题进入),是一篇经验干货,对于前后端开发都值得一读。由于文章相当长,只大概翻译一下。

七项原则是:
1.服务器后端渲染页面并不只是可选项

服务器渲染页面(如JSP ASP 等)并不只是有关SEO,还有关性能,考虑到获得脚本需要多个来回,以及其后的API再次请求,这些都影响性能,可以考虑Http 2.0的资源PUSH。

作者不赞同将服务器Web应用和单页应用(SAP,如AngularJS)对立起来,为了更好用户体验,两者只选一并不是好办法。

其中一个重要理由是互联网基础TCP协议比较缓慢,TCP首先需要握手,如果使用SSL还有安全脚本传输,这些都可能会增加两次前后端来回,然后后端才开始传输数据,会越来越慢。

TCP会有一个叫slow start的拥塞机制,发送数据以不断增加的段segment的数量方式,这对SPA单页应用会造成两个严重影响:
首先,大型脚本会花很长时间下载,为了达到前后端64K的吞吐量,大概花费4次来回,数百毫秒的延迟。如果再考虑城市地理之间实际距离造成的延迟,比如伦敦和纽约,在TCP能够达到传输最大包之前大概还会先耗费225ms。

其次,因为这个规则也适用初始页面下载,因此使得页面初始内容首先被渲染输出变得更重要,在 Delivering the Goods一文中,第一个14kb就非常重要。

因此,使用服务器端渲染整个或部分页面是降低前后来回次数的通用方案。


2.用户输入时立即响应。
Javascript允许我们屏蔽网络延迟,通过这个设计原则使用,可以消除更多"加载中"的提示,PJAX和TurboLinks 可能没有用,因为客户端不能知道下一个页面可能是什么,直到将服务器端整个系统来回浏览一遍。

3.响应数据改变
当后端数据改变时,在不要求客户端自己主动提问的情况下让客户端知道这种改变,页面应该能自我更新,这能够解放用户手工刷新,带来新的挑战是:重新连接的管理和状态合并。


4.在服务器端控制数据交换
可以在服务器端微调数据交换,确保能够处理用户的错误 重试等行为,在后台同步数据和维护离线缓存。

如果因为后端性能问题导致如下:

使用AJAX能够避免这种情况。实现数据自动更新,要做到这点,需要注意连接中断和重连。

当发现连接中断时,将数据存储在内存中甚至localStorage以便以后再次发送,这在ServiceWorker中有介绍,激活JS在后台运行,如果你的应用还没有打开,你能在后台同步用户的数据。

考虑到发送数据时timeout和错误,要让用户可以重试,如果连接再次创建,就能试图再次发送数据,如果有持久数据的错误也需要让用户知道。

另外要防止用户不经意关闭浏览器,使用beforeunload。

5. 不要打断浏览器的历史功能,而要增强它。
如果没有浏览器管理历史记录和URL,问题就会很大,确保不要打破有关来回滚动浏览的相关预期,使用自己的缓存来进行快速反馈。

可以使用JS增强历史记录。返回应该快速的,用户不会期望返回的页面改变太多。缓存之前的页面然后立即渲染,这时可以将该页面的变化数据展现给用户。


6.自动推送代码更新
如果你只是推送数据更新,而不推送更新的代码,会出现API错误和性能问题,使用无态的DOM重新渲染。

7.预期行为
一个Javascript应用应用有预期用户输入事件的能力,如下图能根据鼠标运动提前预知其要下拉菜单:


2014-11-06 10:00 "@banq"的内容
1.服务器后端渲染页面并不只是可选项 ...

我也遇到类似问题,
这个问题看似前端问题,但实际是架构与编程风格一致性的问题,
有时候真不好调和。

2014-11-08 07:12 "@clonalman"的内容
我也遇到类似问题,
这个问题看似前端问题,但实际是架构与编程风格一致性的问题,
有时候真不好调和。 ...

是不是孤陋寡闻,目前还没看过, WEB的服务端绑定或渲染与前端SPA统一起来的框架。。。