在制定网站的总体框架时候,很是强调架构的上的先后端分离。这种分离意味着数据层、复杂业务逻辑与前端展示和交互的层次分离。html
清晰的结构。先后端的融合是经过一套中间层的协议来完成的,实现上是后端对前端只露出API接口。在软件设计层面,流动的数据,让先后端能够独立的专一的作本身,而不是被对方所绑架。前端
同步开发。不被对方所绑架,就意味着,在开发时,经过事先的约定,前端和后端能够同步进行。而交接层经过单元测试保证交付。能够缩短项目进度node
在作此次设计以前,着重参考了淘宝大牛们的中途岛方案。感谢他们让我走出了一套代码吃遍先后端的理想回归了现实。git
在作url
设计的时候,提出了这样一个概念:github
当浏览以服务端渲染页面为主时,
url
的path
部分由服务端负责解析、渲染最后输出页面,当到达浏览器端,js
负责渲染hash
部分的数据和视图web当页面的形式以webaap为主时,
url
的path
和hash
部分都由js
负责渲染express
在这样的过程当中,力图解决两个问题:npm
webapp的seo问题后端
url追溯问题浏览器
与淘宝Midway
的思想一致,在浏览器端和服务端,共享是模板,基于此也参考低版本浏览器的一些性能问题,前端选型上,使用了CanJS,由于其模板引擎是ejs
能够被expressjs
兼容,同时CanJS
在低版本浏览器上的新能是非突出,因此选型用了CanJS
CanJS
中View
的生命周期扩展
如上图所示,默认的生命周期只有start
和end
两个阶段,咱们显示的加入了render
和supplement
两个阶段。
render
定义为主渲染阶段,这部分能够在浏览器端进行渲染,也能够在服务端端进行渲染,服务端渲染完成以后,会在根节点上加入data-status="ready"
的属性,来标示渲染完毕,当浏览器检测到这个属性时,就不会重复渲染。
supplement
定义为补充渲染阶段,这部分在浏览器端进行渲染,其数据参数经过hash
被传入
sf-haitao-webapp-seo
这个项目的代码就是具体的案例,因为在实践初期,代码变更会很是快。
启动代码以后,分别访问两个连接:
由服务端进行渲染: http://127.0.0.1:3000/paint/2023013
由浏览器负责渲染: http://127.0.0.1:3000/render/2023013
注:这里的2023013是豆瓣里面惟一能够随意访问的,请不要用其余的id吧,见谅
两个连接访问以后,在尾巴后加入以下hash,看看会有什么结果
#!case/29
须要安装NodeJS环境和Bower加载器
Clone代码到本,默认目录为sf-haitao-webapp-seo
进入目录,安装依赖库
npm install
bower install
在根目录上运行
node bin\www
项目地址: https://github.com/leewind/sf-haitao-webapp-seo
思考这样一个问题:既然不纠结于服务端和浏览器端代码一致,那么是否是有可能用其余的替代Nodejs来作服务端渲染的工做,好比:Sprint MVC、.Net MVC、Python Tornado?
在CanJS
中默认推荐两种模板:ejs
和mustache
。我没有找到其余语言对于ejs
模板的支持,可是mustache
在其余语言上的应用作的很是的好,具体能够参考mustache官方站点
那反过来想,有没有其余的语言模板能够在Nodejs环境下可使用的,而后我找到了Velocity.js,我想若是前端CanJS能够兼容Velocity.js
的模板,那么在作渲染的时候,可能我有第二套方案:用Java Velocity去作render
逻辑的渲染!
对于mustache
用于多语言平台的拓展和Velocity
对CanJS
的扩展是我下一步的实践目标