前后端分离的思考与实践(二)

原文出处: 淘宝UED - Herman   

基于前后端分离的模版探索

前言

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

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

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

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

本文

渲染这块工作,对于前端开发者的日常工作来说,佔了非常大的比例,也是最容易与后端开发纠结不清的地方。

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

  1. Form Submit 全页刷新 => AJAX局部刷新
  2. 服务端续染 + MVC => 客户端渲染 + MVC
  3. 传统换页跳转 => 单页面应用

可以观察到在这几年,大家都倾向将 渲染 这件事,从服务器端端移向了浏览器端。

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

浏览器端渲染的好处

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

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

浏览器端渲染造成的坏处

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

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

反思前后端的定义

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

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

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

120140418124348

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

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


淘宝中途岛 Midway

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

220140418124408

藉由一个由前端 轻松掌控 且 与浏览器共通 的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的问题。


模版共享的实践

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

  1. 在浏览器端載入模版引擎 (xtmpleate, juicer, handlerbar, etc.)
  2. 在浏览器端载入模版档案,方法可能有
    • 使用 <script type="js/tpl"> ... </script> 印在页面上
    • 使用模块载入工具,载入模版档案 (KISSY, requireJS, etc.)
    • 其他
  3. 取得数据,使用模版引擎产生html
  4. 将html插入到指定位置。

從以上的流程可以觀察到,要想要做到模版的跨端共享,重点其实在 一致的模块选型 这件事。

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

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


案例探讨

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

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

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

案例二 单页面应用

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

案例三 纯浏览型页面

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

案例四 跨终端页面

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

总结

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

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

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

转载于:https://www.cnblogs.com/yuluoxingkong/p/9006906.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql对大量数据查询花费时间_对于Mysql大量数据查询速度慢的问题

1.如果mysql数据量过大&#xff0c;当查询的时候耗时比较长&#xff0c;则会影响页面数据展示。给客户的直观反应的&#xff1a;点击了某个查询功能&#xff0c;结果等了差不多十几秒才反应出来&#xff0c;这样的体验感太差了。2.为了增加反应速度。一般来是建立索引&#xff…

推自己的镜像到网易云

推送本地镜像 本文介绍如何将本地镜像推送至你的网易云私有镜像仓库&#xff0c;以便在网易云上部署容器或集群。 注&#xff1a;Docker 客户端版本要求 1.7 及以上。 1. 列出本地镜像 docker images 2. 后台启动容器&#xff0c;验证配置是否正确 docker run -d {镜像名或ID} …

-js中json数组 以表格形式_为什么js类数组加上splice方法就是数组形式,不加就是对象形式?...

var array_like {};array_like[0] "test 0";array_like[1] "test 1";array_like[2] "test 2";array_like[3] "test 3";//关键点array_like.length 4;//为对象设置length属性array_like.splice [].splice;//同时设置splice属性为…

BYZ原创天语w806测评--入手2天,总结优点、缺点.

原帖地址&#xff1a;BYZ原创天语w806测评--入手2天,总结优点、缺点.楼下附上图片哦&#xff01;billyzhou033邀请您访问锋动网http://flydong.com/?fromuid989昨天刚入手的大黄蜂w806&#xff0c;使用了1天&#xff0c;阿里云系统&#xff0c;由于第一次使用此系统&#xff0…

mysql 5.6 gtid 主从_MySQL5.6基于GTID的主从复制

一、GTID简介MySQL 5.6 的新特性之一&#xff0c;是加入了全局事务 ID (GTID) 来强化数据库的主备一致性&#xff0c;故障恢复&#xff0c;以及容错能力。什么是GTID&#xff1f;官方文档&#xff1a;http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档…

Spring Boot之HelloWorld

视频网址&#xff1a;http://www.iqiyi.com/w_19ruksbpf1.html <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.a…

防止黑客入侵的五大技巧

2019独角兽企业重金招聘Python工程师标准>>> 防止黑客入的方法有很多&#xff0c;但是世界上没有绝对安全的系统。我们只可以尽量避免被入侵&#xff0c;最大的程度上减少伤亡。那么&#xff0c;接下来天下数据将为您详细介绍防止黑客入侵的五大技巧。(本文为天下数…

mysql js 命令行登录_mysqlsh 命令行模式与密码保存-爱可生

原标题&#xff1a;mysqlsh 命令行模式与密码保存-爱可生命令行模式mysql shell 如何实现类似 mysql -e "show processlist;" 的效果&#xff1f;即执行完就退出登录&#xff0c;不需要交互&#xff0c;我们经常在脚本中这样使用。那么同样的&#xff0c;在维护 Inno…

AngularJS学习笔记(1)——MVC模式的清单列表效果

MVC模式的清单列表效果 使用WebStorm新建todo.html并链入bootstrap.css、bootstrap-theme.css、angular.js。要链入的相关css和js文件预先准备好&#xff0c;文件目录如下&#xff1a; 使用MVC模式前的代码&#xff1a; <!DOCTYPE html> <html ng-app> <head&g…

C#多线程学习(六) 互斥对象

C#多线程学习(六) 互斥对象 原文链接&#xff1a;http://kb.cnblogs.com/page/42533/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多…

什么是mysql事物定义_Mysql事务原理

1. 什么是数据库事务1.1 事务的应用场景电商平台中例如常见的下单流程&#xff0c;会同时操作订单表&#xff0c;库存表等&#xff0c;有时候这些操作要在一个事务里面完成。还有金融系统业务的银行转账&#xff0c;需要保证一个账户增加另一个账户减少&#xff0c;这两个动作 …

学习jvm,关于MAT an internal error occurred during:Parsing heap dump from问题

写了一个死循环不断的创建对象&#xff0c;模拟内存溢出 1 package com.zuo.test1;2 3 import java.util.ArrayList;4 import java.util.List;5 6 public class Main {7 8 public static void main(String[] args) {9 List<Demo> demosnew ArrayList<…

mysql报错5_mysql5.5 启动报错:ERROR!_MySQL

bitsCN.com在FreeBSD中启动mysql时报错&#xff0c;ERROR! The server quit without updating PID file&#xff0c;通常这是可以查看数据库目录下的.err日志&#xff0c;里面会记录一些具体的错误信息&#xff0c;对排错相当有用&#xff0c;内容如下&#xff1a;110805 17:30…

MySQL安装总结

安装MySQL&#xff1a;&#xff08;以安装5.1版本为例&#xff09; 1. 双击你下载的安装程序&#xff0c;然后会进入一个‘Welecom to the Setup Wizard for MySQL Server 5.1’的图形界面&#xff01;在这里不用做任何操作&#xff0c;点击next&#xff0c;进入下一步&a…

java swing事件_第四节 Java Swing事件处理

第四节&#xff1a;事件处理一个图形界面完的成只是程序开发中起步的工作&#xff0c;因为要想让每一个组件都发挥其作用&#xff0c;就必须对所有的组件进行事件处理。那么什么是事件处理&#xff0c;所谓事件就表示一个对象发生状态变化。例如&#xff0c;每当按下一个按钮时…

jedate-开始使用一款好用的时间插件

jeDate日期控件 -&#xff08;原生JS版&#xff09;jeDate V6.5.0 是一款原生JS开发的 不依赖任何第三方库 大众化的日期控件&#xff0c;包含 多语言、设定年月&#xff08;YYYY-MM&#xff09;、日期范围限制、开始日期设定、自定义日期格式、根据不同的日期格式&#xff0c;…

zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽

一、Linux下开源监控系统简单介绍1&#xff09;cacti&#xff1a;存储数据能力强&#xff0c;报警性能差2&#xff09;nagios&#xff1a;报警性能差&#xff0c;存储数据仅有简单的一段可以判断是否在合理范围内的数据长度&#xff0c;储存在内存中。比如&#xff0c;连续采样…

linux下rpm方式安装mysql(2012-5-12)

由于感觉前几篇博客中关于linux下rpm方式安装mysql的方法问题太多&#xff0c;今天抽时间重新实践和整理了一下&#xff0c;现在拿出来和大家分享&#xff0c;希望对家有用。 系统环境&#xff1a;Rat had enterprise linux server 6.1MySQL-5.5.22-1.linux2.6.i386VMware Work…

list java语法_java基础语法 List

List的用法List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口&#xff0c;所以List接口拥有Collection接口提供的所有常用方法&#xff0c;又因为List是列表类型&#xff0c;所以List接口还提供了一些适合于自身的常用方法&#xff0c;如表1所示。表…

基础练习

口述题1.分别解释"","",""的含义。 是赋值语句 把一个值赋值给另一个值 是判断语句 判断两个值是否相等 是赋值语句 a1 等价于 aa1 2.两个变量的关系&#xff1f;n1123456n2n1 把123456赋值给变量n1,把n2赋值给n1,n1,n2共同指向123456这个地址 …