最近两周开始想做一个比较酷的东西,想在各个方面做得比较高大全什么的,然后想要比较酷又好维护,响应式设计啊+尽可能的异步+合适动态效果啊+各种洁癖等等。
问题1:
大家平时会经常用到浏览器的前进后退吗?
》关于前进后退这个问题几乎不会被注意到,在没有ajax的时代的浏览器前进后退是不用特意去支持的事情,所以几乎成了不被注意到细节问题。只不过我想应该还有很大一部分用户会去用这个功能吧?特别是考虑到通过响应式设计的方式去支持移动设备,现在android设备都有一个用来后退的独立按键。但是例如像XX微博web手机版(OO微博我没试过)的异步,居然是不支持后退的,一按返回键不会回到上一屏而是跳到别的地方去了。
问题2:
你会怎么处理异步发起http请求的前进后退?
》最常见的做法是通过改变hashbang或者pushState的方式去使浏览器记录下状态的改变(下简称pushState),然后浏览器再回调到对应的绑定事件上,然后发起xhr请求,并且渲染结果。这方面的例子就是jquery.pjax了。这样的有一个问题就是每次后退前进,都会造成网络请求。另外还有一个问题,就是所有的xhr请求事实上都从一个地方发起,如果根据不同的请求内容想要加入不同的动态效果,代码会集中在一起,没办法根据不同页面分开管理。
》然后我自己在去年这个时候做法,类似于上面那种反过来的方式:在发起xhr请求的同时,向浏览器pushState,同时把xhr的success闭包对象存入到一个Stack里。日后在前进后退时,回调函数就去执行一次对应的success,因为success把xhr的结果都缓存起来了,所以不会有多余的请求(虽然没办法得到最新的数据,但是后退的话不一定想到最新数据不是吗?)。同时可从不同的地方发起请求,并且在success按照自然习惯的使用方式加入各种扩展功能。我去年做的东西(jquery.barca)在http://
vivo-dev.aligo.me/ (应该还能用吧)。但是现在觉得这种其实也不太好。
》然后是各种js mvc框架。其实它们的做法和第一种方法有点像,只不过在浏览器状态变更地方加入了router,然后把代码分散到mvc结构里,方便管理(不过最后我还是得把它们打包到一个文件里并且要求客户端缓存的)。同时在model层也可以做暂时的数据缓存不请求。因为我是一个人包办前端后端,后端上一直会采用restful的规划方式,所以js mvc其实是挺适合我的胃口的。只不过为了bot抓取,或者不支持js的用户访问(洁癖原因我一直坚持例如链接的地方href照写再单独绑定click事件)。当然用了前端mvc框架确实也可以做到这个,只不过例如模版之类的东西,前后端得做两份了。所以一直感觉js mvc比较适合像evernote那样单屏界面的东西,不太适合做比较多内容模式的东西。(主要还是工程量和是否容易维护的问题)
》所以目前我也没想到太好的方式。感觉还是差点什么东西-A-
问题3:
大家觉得这方面做得比较好的是?
》我自己觉得例如gmail用起来挺舒服的,采用方式1,只不过一看代码,全部inline的js啊css,一大坨东西,而且gmail也算是只有单屏界面。然后中间数据是一种类似S-表达式的奇怪东西,google的geek都是怪物吗?我有洁癖觉得这样的东西不好也难以维护。
》然后考虑到要响应式设计啊之类时髦的东西啊同时尽可能地好维护我就。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/34474
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.