基于NodeJS的前后端分离的思考与实践(二)模版探索


Posted in NodeJs onSeptember 26, 2014

前言

在做前后端分离时,第一个关注到的问题就是 渲染,也就是 View 这个层面的工作。

在传统的开发模式中,浏览器端与服务器端是由不同的前后端两个团队开发,但是模版却又在这两者中间的模糊地带。因此模版上面总不可避免的越来越多复杂逻辑,最终难以维护。

而我们选择了NodeJS,作为一个前后端的中间层。试图藉由NodeJS,来疏理 View 层面的工作。

使得前后端分工更明确,让专案更好维护,达成更好的用户体验。

本文

渲染这块工作,对于前端开发者的日常工作来说,?琢朔浅4蟮谋壤??彩亲钊菀子牒蠖丝?⒕澜岵磺宓牡胤健?/p>

回首过去前端技术发展的这几年, View 这个层面的工作,经过了许多次的变革,像是:

Form Submit 全页刷新 => AJAX局部刷新
服务端续染 + MVC => 客户端渲染 + MVC
传统换页跳转 => 单页面应用
可以观察到在这几年,大家都倾向将 渲染 这件事,从服务器端端移向了浏览器端。

而服务器端则专注于 服务化 ,提供数据接口。

浏览器端渲染的好处

浏览器端渲染的好处,我们都很清楚,像是

1.摆脱业务逻辑与呈现逻辑在Java模版引擎中的耦合与混乱。
2.针对多终端应用,更容易以接口化的形式。在浏览器端搭配不同的模版,呈现不同的应用。
3.页面呈现本来就不仅是html,在前端的渲染可以更轻易的以组件化形式 (html + js + css)提供功能,使得前端组件不需依赖于服务端产生的html结构。
4.脱离对于后端开发、发?蚜鞒痰囊览怠?br /> 5.方便联调。

浏览器端渲染造成的坏处

但是在享受好处的同时,我们同样的也面临了 浏览器端渲染 所带来的坏处,像是:

1.模版分离在不同的库。有的模版放在服务端 (JAVA),而有的放在浏览器端 (JS)。前后端模版语言不相通。
2.需要等待所有模版与组件在浏览器端载入完成后才能开始渲染,无法即开即看。
3.首次进入会有白屏等待渲染的时间,不利于用户体验
4.开发单页面应用时,前端Route与服务器端Route不匹配,处理起来很麻烦。
5.重要内容都在前端组装,不利于SEO

反思前后端的定义

其实回头想想,在我们把渲染的工作从 服务端(Java) 抽出来到 浏览器端(JS) 的时候,我们的目的只是 明确的前后端职责划分,并不是非浏览器渲染不可 。

只是因为在传统的开发模式中,出了服务器就到了浏览器,所以前端的工作内容只能被限制在浏览器端。

也因此很多人认定了 后端 = 服务端 前端 = 浏览器端 ,就像下面这张图。

基于NodeJS的前后端分离的思考与实践(二)模版探索

而在淘宝UED目前进行的 中途岛Midway 项目中,藉由在 JAVA ? Browser中间搭建一个NodeJS中间层,试图把这个前后端的分割线,重新针对 工作职责 去区分,而非针对硬体环境去区分(服务器 & 浏览器)。

因此我们有机会做到模版与路由的共享,也是一个前后端分工中最理想的状态。

淘宝中途岛 Midway

在中途岛项目中,我们把前后端分界的那条线,从浏览器端移回到了服务器端。

基于NodeJS的前后端分离的思考与实践(二)模版探索

藉由一个由前端 轻松掌控 且 与浏览器共通 的Nodejs层,可以更清晰的完成了前后端分离。

也可以让前端开发针对不同的情况,自行决定 最适当的解决方案 。而不是所有事情 都在浏览器端来处理 。

职责划分

中途岛并不是前端试图抢后端饭碗的项目,目的只是把 模版 这个模糊地带切割清楚,取得更明确的职责划分。

后端 (JAVA),专注于
1.服务层
2.数据格式、数据稳定
3.业务逻辑
 
前端,专注于
1.UI层
2.控制逻辑、渲染逻辑
3.交互、用户体验
 
而不再拘泥于服务端或浏览器端的差异。

模版共享

在传统的开发模式中,浏览器端与服务器端是由不同的前后端两个团队开发,但是模版却又在这两者中间的模糊地带。因此模版上面总不可避免的越来越多复杂逻辑,最终难以维护。

有了NodeJS,后端同学可以在JAVA层专注于业务逻辑与数据的开发。而前端同学则专注于控制逻辑与渲染的开发。并且自行选择这些模版是要在 服务端 (NodeJS) 或是 浏览器端 做渲染。

用著一样的模版语言 XTemplate ,一样的渲染引擎 JavaScript

在 不同的渲染环境 (Server-side、PC Browser、Mobile Browser、Web View、etc.) 渲染出 一样的结果 。

路由共享

也因为有了NodeJS这一层,可以更细致的控制路由。

假如需要在前端做浏览器端路由时,可以同时配置服务器端的路由,使其在 浏览器端换页 或是 服务端换页 ,都可以得到一致的渲染效果。

同时也处理了SEO的问题。

模版共享的实践

通常我们在浏览器端渲染一份模版时,流程不外乎是

在浏览器端?入模版引擎 (xtmpleate, juicer, handlerbar, etc.)
在浏览器端载入模版档案,方法可能有
使用 <script type="js/tpl"> ... </script> 印在页面上
使用模块载入工具,载入模版档案 (KISSY, requireJS, etc.)
其他
取得数据,使用模版引擎产生html
将html插入到指定位置。
?囊陨系牧鞒炭梢杂^察到,要想要做到模版的跨端共享,重点其实在 一致的模块选型 这件事。

市面上流行很多种模块标准,例如 KMD、AMD、CommonJS,只要能将NodeJS的模版档案透过一致模块规范输出到NodeJS端,就可以做基本的模版共享了。

而后续的系列文章会针对Model的proxy与共享,做进一步的探讨。

案例探讨

因为有了中途岛这中间层,针对过往的一些问题都有了更好的解答,例如说

案例一 复杂交互应用 (如购物车、下单页面)

状况:全部的HTML都是在前端渲染完成,服务端仅提供接口。
问题:进入页面时,会有短暂白屏。
解答:
首次进入页面,在NodeJS端进行 全页渲染 ,并在背景下载相关的模版。
后续交互操作,在浏览器端完成 局部刷新
用的是 同一份模版 , 产生 一样的结果

案例二 单页面应用

状况:使用Client Side MVC框架,在浏览器换页。
问题:渲染与换页都在浏览器端完成,直接输入网址进入或f5刷新时,无法直接呈现同样的内容。
解答:
在浏览器端与NodeJS端共享 同样的Route 设定
浏览器端换页时,在浏览器端进行Route变更与 页面内容渲染
直接输入同样的网址时,在NodeJS端进行 页面框架 + 页面内容渲染
不管是浏览器端换页,或直接输入同样的网址,看到的内容都是 一样的 。
除了增加体验、减少逻辑?杂度外。更解决了 SEO 的问题

案例三 纯浏览型页面

状况:页面仅提供资讯,较少或没有交互
问题:html在服务端产生,css与js放在另外一个位置,彼此间有依赖。
解答:
透过NodeJS,统一管理html + css + js
日后若需要扩展成复杂应用或是单页面应用,也可以轻易转移。

案例四 跨终端页面

状况:同样的应用要在不同端点呈现不同的介面与交互
问题:html管理不易,常常会在服务端产生不一样的html,浏览器端又要做不一样的处理
解答:
跨终端的页面是渲染的问题,统一由前端来处理。
透过NodeJS层与后端服务化,可以针对这类型复杂应用,设计最佳的解决方案。

总结

过去的AJAX、Client-side MVC、SPA、Two-way Data Binding 等技术的出现,都是试图要解决当时的前端开发遇到的瓶颈。

而NodeJS中间层的出现,也是在试图解决现今前端被?I限在浏览器端的一个限制。

这边文章专注于前后端模版共享,也希望能抛砖引玉,与大家一起讨论如何在NodeJS中间层这个架构下,我们可以怎样的改善我们的工作流程,怎样的跟 后端配合,来把 前端 这个工作做得更好。

NodeJs 相关文章推荐
初始Nodejs
Nov 08 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 #NodeJs
Nodejs Post请求报socket hang up错误的解决办法
Sep 25 #NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 #NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 #NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 #NodeJs
nodejs npm package.json中文文档
Sep 04 #NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 #NodeJs
You might like
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
JS实现小星星特效
2019/12/24 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
python用post访问restful服务接口的方法
2018/12/07 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
Pyqt5自适应布局实例
2019/12/13 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
毕业生造价工程师求职信
2013/10/17 职场文书
高级工程师岗位职责
2013/12/15 职场文书
高一地理教学反思
2014/01/18 职场文书
工作态度检讨书
2014/02/11 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
关于环保的活动方案
2014/08/25 职场文书
党性观念心得体会
2014/09/03 职场文书
初中教师个人总结
2015/02/10 职场文书
2015年科普工作总结
2015/07/23 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL