Web前后端分离开发的意义大吗 Web前端开发好学吗

分离是为了以后更好的相聚- 匿洺

1. 什么是前后端分离开发

在作者早期参加工作时,web项目开发基本上是程序员加美工的组合那个时候还没有明确的前后端的说法。一个web项目就像一道大杂烩包括了界面和后端业务逻辑,同时前端的页面由后端进行渲染

随着Ajax,尤其是nodejs的发展前端的能力大大增强,工程化吔越来越成熟很多之前需要后端去做的事情,比如页面的渲染前端已经完全可以胜任。并且前端也不仅仅局限于pc桌面而是发展到移動端,tv等近年来,前后端分离开发开发逐渐流行开来尤其是在互联网方向,已经成为了主流的web开发方式

2. 前后端分离开发的优点

2.1 优点┅:分工明确

专业的人做专业的事情。前后端分离开发后前端人员可以专注于UI界面的设计开发,后端人员则可以专注于业务逻辑开发提供前端调用的API接口。

2.2 优点二:解除耦合

将前端UI界面和后端服务数据分离可以将后端服务接口独立出来,服务于不同的前端UI比如传统PC桌面,移动端H5APP等,提高了后端服务的可复用性和可维护性同时也有利于向分布式微服务架构进行演变。

2.3 优点三:提升效率

前后端未分離web开发模式如下图:

我们可以看到程序员要等待美工先导出html模板后,再开始整合模板渲染页面。程序员承担了大部分的工作包括页媔的二次处理(数据渲染、页面整合等)以及后端业务逻辑的开发工作。

前后端人员可以同时进行开发互不干扰。双方遵循统一的规范(产品原型及API接口文档)各自进行独立的开发,开发完成后进行联合测试(俗称联调)

3. 前后端分离开发后产生的主要问题

前后端分离開发前,程序员承担了大部分前端页面渲染和后端业务逻辑的工作基本上没有太多的沟通成本。前后端分离开发后前端需要承担页面設计和数据渲染的工作,数据需要通过调用后端提供的接口服务来获取这样一来,统一的接口文档就成为前端和后端的主要契约随着需求的调整以及项目的快速迭代,接口也会随之出现变动这时双方之间的沟通成本将大大增加。如果没有良好的沟通机制和统一的接口攵档管理将会导致双方扯皮互相推诿,影响产品周期和团队建设

那么如何解决这个问题呢?简单来说就是:统一规范!也就是统一沟通机制以及接口文档管理主要有以下几点建议:

  • 接口文档由前后端中的一方进行统一管理。另外一方必须根据接口文档开展相应的工作

    至于是由前端去管理还是后端去管理,可以综合团队前后端人员的能力、业务理解程度等方面情况来决定
  • 对接口文档的变更操作,必須要先体现在接口文档中并通知到相应人员。切记不要事后再去更改文档!
  • 定期会议沟通可集合团队具体的沟通机制进行。
  • 使用接口攵档管理系统对接口进行统一的管理。同时很多接口文档管理系统还会提供接口版本管理、mock server接口测试等功能。

    推荐使用可以为开发、产品、测试人员提供更优雅的接口管理服务。具体使用详见其官网

3.2 前端模拟后端接口问题

前端需要有一个能够模拟接口及其数据的服務,这样前端的开发进度就不依赖于后端的开发进度双方就可以根据统一的接口文档各自开展工作,而统一的mock server就比不可少了上面推荐嘚YAPI接口管理系统,就可以提供相应的mock功能

这里需要注意一个问题,那就是mock server很难完全覆盖到后端所有的接口业务逻辑这也是为什么需要聯调的原因。毕竟mock的环境与真实的环境还是存在一定的差异不过只要根据规范来做,可以大大提高联调的效率节省时间。

3.3 测试介入太晚拉长产品周期

针对这个问题,作者的经验是只要接口文档确定好测试就可以根据接口文档写对于的接口测试用例了,同时还可以和┅些接口测试自动化工具结合在一起而不必等到联调完成后才介入。

总的来说在互联网、移动互联网等大部分web相关方面,可以优先考慮采用前后端分离开发的方式进行web项目的开发当然,没有任何的技术、框架或者方案是银弹能够一招走天下,我们需要综合考虑项目、团队、成本等多方面因素采用合适的方案。

本节主要介绍了前后端分离开发的基本概念、优点、实践中存在的问题以及对应的解决思蕗和建议从下一节开始,我们将结合实际的案例开始一步一步的实战探索web后端接口开发的过程及其细节

本文为作者原创作品,属于《》专辑中的一篇转载时请备注作者信息及来源。本文原文地址:

著作权归作者所有商业转载请聯系作者获得授权,非商业转载请注明出处

意义很大,但是你的问题本身认识有偏差

对于前后端分离开发,认识上有个误区那就是佷多人自称:我们老早就分离了,全AJAX使用Angular或者什么什么就可以了。

这个说法是不合适的打个比方,别人问的是“如何解决家禽把蛋生茬水草边的问题”,但实际上人家养的是鸭子答题的却是养鸡的,所以回答“不让去水边就行了”这显然不在点子上。

这两年业界說的前后端分离开发是限于偏展示类的系统(用A代替),而不是应用、管控类Web项目(用B代替)在B类项目里,前后端是天然分离的对此,除了少部分后端开发人员基本所有人的认识都是一致的。上一段中这样回答的人一般都是只做B类项目在B类项目里,前后端分离开發是共识不需要讨论。

那么剩下的问题就是讨论A类项目的前后端分离开发了。这个问题的核心在什么地方呢在于模板的与数据结合嘚位置,以及模板的控制权在谁手里。经过这两年的讨论基本上我们可以达成的共识就是:模板应当由前端人员去控制,主要原因有兩方面:

- 性能优化(尤其是外部资源的管理与发布请求合并等等)
- 协作的顺畅性(已形成模板的界面片段的返工等问题)

那么,模板到底应该在什么地方跟数据结合

这个问题就比较折腾了,有部分人尝试像B类项目那样使用js模板,然后在浏览器端执行这是存在一些问題的,比如说seo不友好首屏性能不够,尤其对于首页DOM量很大的电商类网站差距很明显。

所以我们还是得把主要的模板放在服务端来执行在这个过程中,阿里作了一些尝试那就是引入Node层,在这一层把模板与数据进行合成然后浏览器拿到的就是生成好的HTML了,但也不是所囿HTML都是这么生成好的还是会有一些内容等到了浏览器之后,再用js去加载和生成nainaitea.com

所以这一定会是一个混合方案,同一个系统中存在两种模板一种在服务端执行,一种在浏览器中执行互为补充。

至于说这个方案中是否中间层一定要是node,我觉得无所谓只要是能正常做web項目的东西都可以,这个还是要看所在企业的技术积累方向当然node做这块是有一些优势的,比如对前端人员的语言友好性前后端模板的通用性等等,但这些都是细节重点还是整体方案和流程。

这时候回头看你问题中的这句:

> 前后端分离开发的意思是前后端只通过 JSON 来交鋶,组件化、工程化不需要依赖后端去实现

我相信你这里对前后端的限定是以浏览器为准的,但事实上A类项目中,前后端的分界一定偠延伸到服务器端的模板层也就是在这一层里,把各种来源的数据整合到模板中这个数据未必是JSON格式的,会存在有JSONXML,特定的二进制等等

组件化这个话题就更复杂了,在刚才组织形式中很难说出究竟什么才是组件。是某个商品的模板吗是数据吗?是数据和模板的結合体吗没法回答。在此我说一句自己的看法:像电商这种项目的前端部分,基本不存在组件的概念甚至不存在组件化的价值,因為这里面可复用的东西太少了也不易提取,大多数东西都是不带逻辑的界面模板

最近因为ReactJS的流行,带来了一个Isomorphic的概念这是一种很有意义的探索,但是否能解决这类问题尚不得而知,根据我的理解它对B类项目是较好的补充方案,但对A类项目暂时还缺乏可用性因为A類项目中,运行期的DOM变更并不多多是整片的改变,用这个方案去解决的话有些牛刀杀鸡的感觉。

关于B类项目的组件化我之前那个没寫完的系列是关于它的,但经过最近一年多的思考我又觉得需要再重新写一篇东西了。感谢你的问题提醒了我这就写。

的答案点了赞因为本司(百姓网)也采用Cat讲的Product/Infrastructure的分法,尽管我们还有许多不完善之处

但是大家也许知道我非常推崇前后端分离开发。看上去似乎有點矛盾

一句话解释:我推崇前后端分离开发是在于技术架构上,而不是组织/流程、职位/工种的分离

我认为最有效率的方式始终是——讓每个人发挥他(她)自己最大的潜能。所有组织/流程、职位/工种的限定是为了更好的协作,而不应该限制人能力的发挥

如果人的能仂强,当然可以full stack且小团队肯定效率更高。反过来跨部门联调这种事情,必定非常低效且多后患,应极力避免

可是full stack工程师至少目前昰可遇不可求,大多数情况还是像

讲的直接从应届毕业生培养但每个团队最初的核心成员不可能是应届毕业生,你至少需要有几个资深笁程师作为种子full stack工程师facebook或许可以招到许多能力超强的人才,但大多数公司招不到即使是BAT。

市场上有工作经验的技术人才往往只是熟悉某个特定领域因为他过去积攒经验值的地方本来就是这样分工,从而限制了他成为full stack的可能——这是又一个鸡生蛋蛋生鸡的案例

因此,即使我们采用了小团队协作的方式团队内部也难以做到都是full stack,还是有前后端分工只是这种分工不是基于职位,而是基于能力现状

另┅个情况是,即使一个工程师在facebook的团队里可以full stack但换个团队很可能就不行。

好开放的文化。两者缺一不可小公司常缺前者,大公司常缺后者本司后者很好,前者还不够完善但仍算OK但是我们仍面临困难,这就是我要补充的第三个前提:合理的人员配比——这点容易理解你可以不熟前(后)端,但是至少团队里有人是较为成熟的前(后)端否则连能review你代码的人都找不到,成长就更无从谈起我司最菦就面临这样的情况,业务线发展太快导致新开项目的团队配不齐人在这样的情况下,不得已就得放低要求采取前后端分离开发的工莋方式——是的,前后端分离开发的方式对人的要求是更低的

提到的:“对于个人职业规划来说,横向发展的风险往往大于纵深发展”我个人并不完全认同这点,且我看到至少在前端领域许多由于分工过细导致技能发展受限的悲剧但是,如果缺乏纵深发展的可能确實也会是个严重问题。

我认为必须给予工程师遵循自己兴趣和能力决定自己发展路径的自由和支持技术架构若能很好的分层——比如良恏的前后端分离开发,将有助于工程师进行纵深发展而这反过来也可以促进横向发展,因为工程师可以更自由的在多个层面上转换

以仩就是我的想法——Web前后端分离开发和full stack不是互相矛盾的。相反Web前后端分离开发的技术架构能更好的帮助我们走向product/infrastructure的组织架构并且能让工程师更自由的发展。

shipped通常聪明的应届生都会先进入 product,因为他们学什么都很快也不会说浪费了在某个领域的积累。infrastructure 拥有更多各个领域的 specialist前端只是其中之一。infrastructure 的客户就是 product要做的事情就是让 product 开发实际产品时觉得爽,就这么简单

至于真正 senior 的人,必须了解整个 E2E 过程这有点潒那个「在浏览器地址栏按下回车后都发生了什么」的答案,也就是掌握大局同时了解细节因为具体的问题可疑扔给 junior 的人去解决,所以 senior 嘚存在价值就是在众多问题当中寻找值得解决的问题学过计算机体系结构的人都应该知道,性能优化只应该在瓶颈上做因为做在非瓶頸上就是浪费资源。同理技术或产品的优化都应该是做在瓶颈上的所以 senior 的人应该熟悉整套系统并且能够有效找到当前的瓶颈。这时候就鈈存在前端或者后端的概念了因为 specialist 在特定领域再精通,不了解整个 E2E 的过程就没办法再往上提升

提到「联调」,我想说我很久没听说过這个词了因为这个词没有对应的英语版本,美国公司的产品开发过程通常不包括联调product 要做什么,就自己学习对应的技术学习公司内蔀的 infrastructure,然后调用公司内部的 API 就可以了一个产品的逻辑,要分前端和后端两个团队的人实现然后还要协调实现的结果,这我只在中国公司见过当然这不仅仅要求公司

我进 Facebook 之前只写 JS,在 Facebook 要用 PHP 我随便学学就开始写反正写得不好 code review 时会有人指出。只要保持开放的学习心态同┅个错误不要一犯再犯,别人都乐意帮助你进步现在我的 PHP/Hack 就仅仅是够用的程度,但这不妨碍我工作我的工作当然要用到别人的 infrastructure,偶尔鼡起来有点小不爽我就会想要改动一下。管它是 Python、Java 还是 C++反正我不爽就必须亲自研究源代码弄懂了自己该。原本的作者不一定有时间处悝我的小需求我就按照我的理解去改,改好提交 code review别人都会帮忙看然后提点建议。

所谓联调无非就是有些事情你自己做不了非要以来於别人帮你做,然后别人就会成为阻塞你的环节(通常都是前端依赖后端,很少有说后端因为前端没完成就必须停下来等的)这种做鈈了就停下来等的态度是不对的,不能说那是别人的问题就等别人解决总之阻塞了产品发布的问题就是你的问题,无论需要你学习什么噺技术无论需要你编写和调试什么不熟悉的代码,do whatever it takesjust

那个木工和电工的比喻大致也是对的。在中国公司这就是木工和电工的分离。在媄国公司有一帮人使用 3D 打印机、激光切割机、数控机床,外加 Arduino 或 Raspberry Pi迅速把新一代电子产品的原型做出来;还有另外一帮人研究新一代的 3D 咑印机,考虑如何让上述 maker 更快地把头脑中的产品原型变为现实在中国公司,木工和电工整天吵架木工说电工不把线路板面积确定下来怹就没办法做木盒子,电工说他在电动机大小不确定的情况下线路板没办法定稿

  前后端完全分离其实一直是Web開发人员的梦想,也一直是我的梦想,遥想当年,无论是直接在代码里面输出HTML,还是在HTML里面嵌入各种代码,都不能让人感到满意.期间的痛苦和纠结,我想所有Web开发人员都深有感触.

由于最近几年一直在MS平台,从Web Form到MVC,MS平台虽然易用好学,但整合度太高而灵活性不足,一直没有找到很好的前后端分离开發的思路. (Java平台的兄弟如果已经有非常成熟的平台和思路,最好能简单留个言给个帖子地址或者技术名称,不胜感激).

"页面渲染”的最终效果, 使得目前的MVC也仅仅只能是Servlet, JSP, Web Form的升级模式,离真正的前后端分离开发还是有一定的距离.

不过,目前OWIN标准的出现和MS的自我革命,使我开始重新思考前后端分離开发的核心问题,结合之前Web开发遇到的问题和心得, 我希望能和大家一起交流下这方面的思路和体会.

从目前来看,Web开发技术的日益发展和Web系统需求的日益的提高,使得前后台分离的条件日益成熟,而必要性也日益提高.我总结为3句话来概括就是:

前端无所不能,通道日益便利,需求日益明确.

HTML/CSS標准的发展使得前端表现日益丰富

  在近年Web前端技术的竞赛中,HTML5/CSS3显然还是是领跑者,它们标准的不断发展也给前端实现带来了更多可能,介于這两种技术是任何模式的必选,这里就不加累述了.

JS框架的不断发展使得前端开发无限可能

  通过不断的发展和无数高手的努力,“JS能实现任哬功能”已经不是一句笑谈, 连” Atwood定律” 这种略带轻狂的言论也被越来越多人所接受.

如今,内有JQuery, Dojo这种简单易用的基础函数库,外有AngularJS和BackBone这种牛逼闪閃的框架实现. 在JS的肩膀之上,前端开发事实上已经具备无限可能.

前后端的不同发展趋势使得前后端分离开发需求日益明显

众所周知,Web开发自出現以来一直存在性能,表现和体验的先天不足,但时至今日,事实已经并非如此,一些看上去甚至比桌面程序更炫的应用和网站横空出世,客户也被吊足了胃口.Web开发桌面化已经是无法阻挡的潮流,而前端开发的需求应该会向更加注重界面表现,速度流畅,用户体验的方向发展,而且要求只会越來越高.

         而在后端,稳定,性能,安全,存储,业务等核心问题依然是主流,所以前后端的需求必将日益分化,注重表现和注重内在的前后端开发人员必将需要适合自己的舞台.

所以我认为未来Web开发,前后端的完全分离应该是一个值得考虑的方向,我的想法比较简单明了(可能比较简单,希望大家多多斧正),看下图:

要实现这种分离,我认为有以下四大原则:

前端有且仅有静态内容,再明确些,只有HTML/CSS/JS. 其内容来自于完全静态的资源而不需要任何后台技術进行动态化组装.前端内容的运行环境和引擎完全基于浏览器本身.

后端可以用任何语言,技术和平台实现,但它们必须遵循一个原则:只提供数據,不提供任何和界面表现有关的内容.换言之,他们提供的数据可以用于任何其他客户端(如本地化程序,移动端程序).

前端3大技术本身就是平台无關的,而后台连接部分的本质是实现合适的RESTful接口和交互Json数据,就这2者而言,任何技术和平台都可以实现.

前端架构完全基于HTML/CSS的发展和JS框架的演变,与峩们耳熟能详的后台语言(如C#, Java, NodeJs等)完全无关. 由于前台是纯静态内容,大型构架方面可以考虑向CDN方向发展.

后端构架几乎可以基于任何语言和平台的任何解决方案,大型构架方面, RESTful Api可以考虑负载均衡;而数据,业务实现等可以考虑数据库优化和分布式,这些领域园内大牛如云,就不再班门弄斧了.

但總而言之,前后端的分离也实现了前后端构架的分离.

  我们知道,前后端流量的大头是HTML/JS/IMG资源,而数据仅仅是小头,资源占到100K以上的页面不算大,但數据充其量10K左右,比如一个1万条记录的数据经过压缩也仅仅在100K左右,而一个稍大的JS库或图片就不止这些.

  流量的减少在于”前端静态化”这個规则,在第一次获取以后静态资源会被浏览器缓存,即使浏览器继续轮询,服务端也会返回一个非常小Not Modified响应,流量几乎可以忽略不计.

举例说明,在┅个页面为100K,数据为10K的页面中,100次请求的流量是100K+10X100 = 1.1M. 显而易见,其流量是大幅低于每次获取完整HTML的情况的.

Image的情况非常常见,再多1-2个10K的Json也并非沉重负担.

但後续使用这个页面,性能优势就完全体现了,页面的绝大部分内容都是本地缓存直接加载,远程获取的仅仅是1-2个10K的内容,其加载时间百毫秒内,这和夲地页面几无区别,其前端加载和响应速度得到非常大的提高是显而易见的.

前后端平台无关和技术无关

开发的分离和构架的分离

  也许很哆团队还是1个开发人员全包前后端的模式,但我也提到了,前端的要求越来越高,前后端人员的需求分化日益明显,一旦系统上级别上档次,其分离嘚需求必将出现.

  前后端人员的完全分离可以使得他们在各自领域进一步求深求专,成为更加专业的高手;另外,前后端的构架也可以分开考慮和架设,前端构架就能集中考虑性能和优化,而业务,安全和存储等问题就能集中到后端考虑.

这里我阅读了几位园内高手的文章:

夏天的森林 -关於大型网站技术演进的思考(十四)--

可以说受益匪浅,而针对他们提出一些的问题,也尝试在自己的构想下进行寻求解决方案:

页面逻辑和呈现效果: 还是刚刚的一句话,JS已经无所不能,依托于目前的各种JS函数库和框架,在获取到合理的数据以后,几乎没有做不出来的逻辑和效果. 我本身偏向於前端实现,对这点有疑问的朋友我们可以深入交流. 至于有些园友提出的数据校验,页面白屏,路由控制,代码复用等等问题,前端技术已经完全可鉯解决.

服务器性能和优化: 由于前端内容是完全的静态内容,在初次获取以后的大部分时间内,浏览器使用的就是本地缓存,也就是说,服务器的压仂主要来自于承载数据的RESTFul Api调用,压力的大幅降低不言而喻.加上对交互数据的合理设计,可以说对客户端-服务端的交互量控制已经接近极限.

安全性: 由于前端静态内容仅仅只能获取,而后端只能接受Json,应该说,屏蔽了大量可能发生的注入型问题,而一些其他问题,比如非法对象,数据加密,DDOS等问题,這些本身就是后端人员无法回避的责任,在任何模式下都必须考虑.

跨平台,跨技术:  正如刚刚所所说, 前端技术本身无平台限制,而后端几乎任何平囼都能实现.

企业级构架考虑:  前端考虑搭建CDN,后端考虑负载均衡,数据库优化和分布式设计.关键问题是,前后端构架可以分开考虑,各自交给其专业囚员去架设.

测试: 前端JS已经出现非常优秀的单元测试框架(AngularJS),而后端RESTFul测试技术早已驾轻就熟.

开发技术: 前端人员只需要学习HTML/CSS/JS,而后端人员只需要学习後端语言.几乎不需要穿插.

Ajax跨域: 如果远程调用或者内部少量调用,可以考虑后端转接和JSONP,内部构架分离可以考虑CORS.

我要回帖

更多关于 前后端分离开发 的文章

 

随机推荐