转载:前后端分离项目实践

一、前言

对nodejs有了些准备,希望多了解些后端知识,恰逢公司项目调整,分析了前后端分离的优劣,也做了一个完整的demo演示,同事都觉得靠谱,用了两个版本的时间,将公司主站项目用nodejs实现了前后端分离,在此和大家分享下,以求共同进步。案例参见http://www.upopen.cn

二、为何做分离

1、开发体系:架构体系决定了后端重于前端,前端做好静态页后,要转为php或vm等,开发要用eclipce等后端环境工作,一大堆让前端迷糊的配置,一旦java人员更新了错误的文件,会导致所有人的环境启动不了,束手无策,只能等待救援。

2、难维护:页面总是会有php\jsp等非前端代码,相互干扰、无法优化,时间越久问题越突出。

3、前后端职责不清晰。

有人会问,分离为什么不全部走ajax,页面就不需要任何服务端语言了。但实际场景并非如此,首先有些数据总是要生成页面时就已经同步获取的,且全异步对SEO不利、纯html页面没有include功能等。 网上还有其它的理解,大致相同就不列举了。

三、如何做分离

1、产品设计确定后,前后端人员共同制定开发接口,为方便接口的制定、显示、测试,使用nodejs+mongodb开发了接口平台。参见http://www.upopen.cn:8090/interface/index功能:制定接口时就直接在interface平台上新增录入ActionName、description、 method、 param 及 默认值 等并保存到mongodb,当后台开发完成后,直接用在该页面做接口测试,成功后方可交付,避免联调过程中的接口反复。(原本想用interface.upopen.cn 来测试同域名下的项目,但因cookie在不同二级域名下无法共享的问题,暂用了二级目录,不过已有方案,后续优化)

2、从前端角度考虑系统架构图如下:

前后端分离架构图

访问入口 NGINX 代理静态资源到 STATIC 服务器,其它请求则到 NODEJS。

页面请求NODEJS直接render,数据相关NODEJS则做预处理,再发到后台

前端据已定义的接口,通过nodejs+mysql模拟后台完成数据存取,此处会增加些工作量,但只是为了走通业务流程,模拟后台数据表定义及逻辑无需严谨,只要能正常存取即可,如注册用户save to DB,登录验证read from DB,所以提供模式化的工具、写法后,新增表、接口,并不会多耗时间,nginx – nodejs – 模拟后台,即可按实际使用完成所有前端工作。

QA单独测前端时,修改hostIP指向到测试工具。

Java开发完成后接口,在 Interface平台 上验证所有接口,确认无误。QA也可以通过Interface测试Java接口

nodejs修改config里的hostIP配置到java,理想情况下,修改此步配置即完成联调

每个模块的简略部署如下:

Nginx.conf:Location~\.(jpg|png|css|js){//静态资源代理Root/root/static/;}Location\{//其它接口转发Proxy_passhttp://upopen.cn;}…Upsteamupopen.cn{Serverhttp://node.upopen.cn;}

STATIC 结构如下:使用require.js做模块化加载工具,有朋友问为什么不用seajs,还问这两个优劣,其实前两年的项目用的都是seajs,此处想试试amd vs cmd,所以就用了require.js ,以目前的使用来看,相互可替代

Core:[核心模块,主要是引入第三方必用、稳定模块]Base.js[自定义通用函数]Require.jsJquery.jsBootstrap.jsBackgone.jsSocket.io.js

I18n.js…Public:[业务级公共模块]Validate.js[表单验证模块]All.js[所有页面需要执行的业务js,如登录验证]Zhdoc.js[国际化文本定义]Reset.css[样式初始化]common.css…Widget:[自定义组件]Dialog:[弹框组件]Dialog.jsDislog.cssImgs:[弹框组件图片]Calendar:[日志组件]Calendar.jsCalendar.cssImgs:[日历组件图片]…Module:[业务模块]Issue:[静态模块]Index:[首页]Index.jsIndex.cssImgs:news:[新闻]news.js

news.css

imgs:…User:[用户模块]Register:[注册]Register.jsRegister.cssImgs:findPwd:[找回密码]findPwd.js

findPwd.css

imgs:…Nodejs结构主要如下:express框架App.jsPackage.jsonNode_modules:Routes:Index.js–路由入口,接收所有请求做转发,并做权限过滤、404等Issue.js–接收来自index.js的静态请求User.js-接收来自index.js的用户请求,页面请求render,数据请求转发…Views:[使用ejs框架,接收来自routes里的页面请求]Common:[公用模块页]Header.ejsFooter.ejs…Issue:[静态模块页]Index.ejsNews.ejs…User:[用户模块页]Register.ejs

findPwd.ejs…Controls:[业务逻辑模块]Config.js–公共配置模块,如hostIP、basePath等,切换环境修改此配置User.js-接收来自route/user.js的数据请求,向外转发做逻辑准备Tool.js-封装常用函数如http.request/mailer/md5等Redis.js-redis封装,对于单体封装内容比较多的模块,单独成立一个文件…Log:[日志,采用Log4js,日志是必须的,页面开发者常欠缺日志理念]Assets:结构、使用同STATIC,不配置nginx时,调用此处资源,意义不大…Nodejs+MySql:[模拟后台模块,相对上面的模块,主要多了DB]Db:[数据处理模块]Mysql.js–封装模式化数据存储接口,提供最便捷的新增表、接口的方法

按此结构完成前端所有功能,因目前项目较小,部分模块还有细分空间。

四、分离结果如何

1、开发效率更高,在联调之前,互不干扰,前端开发完成后就是实际可用的代码,不需要再转换成后台编译环境,永远不会被java / php 启动不成功所困扰。

2、部分需要前后端共同开发的功能,如文件上传,通常需要页面端与接收端都进行相关的开发配置,之前较难定位是谁配置错误,现在全部由前端完成,开发、测试都容易定位,上传成功后,只要向java发送文件保存的路径即可。

3、完全分清了前后端开发人员的职责,任一方开发完成后都可以提测,实现同步开发、测试。

4、联调非常简单,若双方接口一致,正常情况下只要修改要接口请求IP即可完成切换。

5、问题责任清晰,联调、测试、预发、上线,每个过程都难免会产生问题,前端、后端、运维三方责任边界清晰,日志中记录nodejs的请求发出,nginx请求接收与转发、java端请求接收与返回,三处任何一处断点,都能马上定位是哪方的问题。

6、前端人员有更高的权限,页面端的展示几乎全由前端实现,但之前一些配置却受制于后台,比如常见的模板功能,纯html页面虽可以通过angularjs实现模板,但实际效果却并不理想,网速差时经常会出现include部分显示后置、甚至加载不成功的情况,nodejs的ejs框架可以很好的实现这个功能。

另外,据浏览器加载不同的css以便实现浏览器兼容,之前处理通常是页面加载后,通过js判断浏览器类型,再去加载不同的css文件,影响渲染效率,并且js判断浏览器类型本身就存在兼容问题,用nodejs则可以在render前就完成该判断,直接用相应的浏览器样式做渲染

7、代码复用,验证模块,页面端与nodejs端可以直接复用

五、注意事项:

1、前端开发人员不仅需要有扎实的nodejs知识,还要有一定的服务端、运维知识,对http通信有更深层次的理解,nginx、redis、socket、buffer等技术也要掌握,多多益善。

2、开发之初对功能充分、宽裕的评估,使用初期不要用nodejs过多开发新功能。初次使用,难免会遇到很多意想不同的问题,前端开发人员本身对服务端知识有限,java人员又对nodejs语法不熟,若处理不好会导致项目延期。我原本认为redis同memcached一样就是connect + set + get,但实际开发时遇到一些考虑不周而产生的怪异问题,延长该部分开发时间,最终导致项目delay。

3、前端开发人员可尝试用linux系统开发,第一版用win7开发时,npm部分模块的安装会不顺利,如node-canvas在win7上安装需要6步,而原本在32上已配置成功了,在64位上的系统上又不成功,后来该接口暂由java实现。实际上即使配置成功了,该模块在发布服务器的linux系统上也无法使用,需要重新安装。第二版开发时,我使用了ubuntu,虽然有一定的学习成本,但对后期的效率提升十分有益,多学习一种系统操作,和运维调试时也更加主动。不过ubuntu下没有找到做PSD切图的工具,所以安装双系统更合适切换使用。

六、总结:

目前用分离方式做了两版项目,开发效率提升、协作沟通便捷上有明显优势,作为前端也学习了很多新知识、扩大影响范围,是共赢的。目前使用还较初级,要继续学习、探索。在此贴出以便和同仁共进步之。


w3ctech

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 旧时金陵旧时景,风雨秦淮风雨情。魏晋风骨已无在,夫子后生多伶仃。 人入乌衣巷难进,愿逐雨花台上青。人生得意不尽欢,...
    馨馨阅读 279评论 3 3
  • 坍圮的围墙下,散落了一地的潮湿的泥土。透过薄膜抵封着窗户,一朵小小的火光从屋中穿了出来。淡淡的硫磺的味道弥漫着整个...
    日头三人行阅读 160评论 0 0
  • 去幼儿园接小崽,正碰上轮到他们班孩子在园门口当礼仪小天使。一眼就认出我家孩子,站在门口,姿势端正,招着手,大声说:...
    降魔杖阅读 243评论 0 0