网站技术选型之痛
对于网站开发的技术选型,我们听到最多的就是: 网站是基于xxx(如java,php,ruby)上的某某框架构建的。
一门主要开发语言、一个独立项目,好处是结构简单,不好的地方也显而易见:
- 不利于前后端独立开发。前端等后端完成后台业务,后端等前端写完页面模板,时间就是这么等走的。
- 前后端经常需要介入对方领域,不利于专业分工。后端时不时改个html模板,有时候还要改css,前端需要理解整个网站的原理,甚至后端语言,调试页面需要启动整个网站所有功能,而不能单独运行页面前端代码,费时费力。
- 如果网站需要个后台,单独开发个会造成业务逻辑重复书写;直接集成进网站项目会造成网站代码更难组织。
- 如果再需要加上某某移动平台定制app,不用响应式页面,这不又得开发个。。。
团队技术背景
几个月前,在接到进行几个类似小电商网站开发任务之前,我们的团队已经在java平台上开发了好几个网站和企业应用。经过了几次演进(纯jsp到freemarker,struts到spring mvc,管理后台使用extjs+java单独项目),但总体上还是纠结于网站项目前后端过度耦合问题。
对于nodejs,我虽然接触时间不短,但大部分做过的东西还属于玩票性质,还停留在nodejs适合做api输出这个简单层面。
目标及思路
当时面对的是:几个类似的网站结构,都要后台管理功能,可能以后会有定制移动app需求,团队人员有限,时间周期有限。
按照以前那套前后端各搞一个项目的套路继续开发下去,铁定完不成,就算复制项目完成了,后期维护代价也非常大。所以问题的核心是:
- 如何最大化复用我们的代码(1)
- 如何尽量提高我们的开发效率(2)
除了核心目标,还有几点我们必须满足:
- 数据保存操作需要事务支持(3)
- 网站搜索功能需要尽量强大,比如支持模糊搜索,分组统计(4)
- 开发语言优先选择我们会的,或者熟悉的,如果其他语言确实有比较大的优势,也可以考虑(5)
- 我们的服务器资源有限(6)
以上几个约束分别考虑下,其实我们的选择已经不多:
- 要达到3的要求,spring + hibernate声明式事务我们最熟悉,并且很方便;要解决4的要求,内嵌solr是我们想到的最现实方案。所以基本上我们的业务处理无法离开java。
-
问题1其实是所有软件开发人员一直在考虑的问题。包含很多,放在当下,可以分成几部分:
-
前后端能否一起整体复用?
这种想法优先否定,会回到之前单项目的老路 -
后端如何复用?
因为已经订下后端使用java,java的项目的整体复用形式就是jar依赖或者远程service调用 -
前端如何复用?
功能/组件级别的复用形式听起来很好,但是开源的方案如(java)wicket使用起来还是相当不便,会加重前端的困扰
微观的复用形式很多,如requirejs/seajs对js的复用优化,各种html模板复用
-
前后端能否一起整体复用?
- 对于问题2,以上几个方面的合理选择肯定会大幅度改善开发效率。其他促进项目还有:
-
采用熟悉的语言
开发团队最熟悉的语言当然是java和javascript -
成熟的依赖管理框架
如java的maven,前端的bower.js,nodejs的npm
-
采用熟悉的语言
- 问题6对我们的选择也有很大影响。基于以前的经验,要开发的几个网站(全都带有后台)如果全部采用java,并且做前后端项目分离,由于java是出了名的内存大户,那服务器压力会很大,甚至无法承受。
最终方案
在理性和感性的双重推动下,我们最终使用了以下方案:
- 网站:nodejs + express + jade + less,采用q.js的promise方案, gruntjs用于开发及打包优化
- 管理后台:extjs静态网站,gruntjs用于开发及打包优化
- 统一的service api输出restful json: java + spring mvc + hibernate(没用jersey)
实现效果
- 前后端分离,开发人员都是用最擅长的语言,没有太多学习负担
- 后端java api服务是无状态的,便于性能扩展
- 企业用户需要的事务支持得到了保证
- jade模板和less简洁易懂的语法保证了html和css的书写效率和质量
- 网站的总体资源占用不多(nodejs 100M左右,extjs静态托管,忽略),适当优化后整体响应速度还不错
- 要开发新的网站/app可以最大化复用后端api逻辑,只管书写表现页面
- 在保证service 程序对应数据库模型一致和api设计合理的前提下,我们只维护一份service代码,但完成了几个同类型网站的开发(使用maven profile配置)
最终网站开发时间节省明显,第二个网站的开发时间是第一个的不到1/3。
后话:前阵子偶尔发现sea.js的作者淘宝玉伯分享说他们的团队也是这么做前后端分离的~ 链接
此文同时发布于我的个人博客
相关推荐
《基于Express+Node.js的网上书城系统源码解析》 在互联网技术日新月异的今天,构建一个网上书城...对于学习者而言,深入理解并实践这个系统源码,不仅能提升对Node.js和Express的理解,还能掌握Web开发的全栈技能。
提供一套Java EE相关主流开源技术架构整合及企业级Web应用的设计实现的最佳实践和原型参考。 项目托管同步更新GIT资源库: 框架特色 面向主流企业级WEB应用系统的界面和常用基础功能设计实现 主体基于主流的(Java 8...
第六阶段:NodeJS全栈开发 最后,接触Node.js,学习WebApp后端系统的开发。理解服务器端JavaScript的概念,搭建Express或Koa等框架,实现数据处理和API接口,从而具备全栈开发能力。 在学习过程中,选择一个优质的...
这是一个基于Java技术栈,特别是JSP(JavaServer Pages)、Servlet和JavaBeans的毕业设计项目——企业合同管理系统。...通过学习和理解这个项目,开发者可以深入掌握Java Web开发的相关技术和实践。
**第六阶段:NodeJS全栈开发** 学习使用Node.js进行WebApp后端系统开发,包括Express框架、MongoDB数据库连接和API接口设计,实现前后端分离的全栈应用。 **第七阶段:大数据可视化** 随着大数据的崛起,数据可视化...
5. 混合开发:学习微信小程序、React Native等混合应用开发技术。 6. NodeJS全栈开发:掌握NodeJS基础、核心模块和Express框架,学习数据库知识。 7. 大数据可视化:了解数据可视化基础,学习D3.js和其他JavaScript...
**Django**是一个高级框架,能够帮助开发者快速开发安全且维护性强的网站。它包含了众多的功能,如认证、管理界面等。**Flask**则更加轻量级,适合小型项目或对灵活性有更高要求的场景。学习资源: - [Django官方...
这不仅包括基础设施层面的变化(如OpenStack到Mesos再到Kubernetes),也涉及开发语言的多样化(如从.Net转向Java/NodeJS/Golang/Python)。 - DevOps不仅仅是工具的堆砌,而是涵盖开发、运维、质量保证等多个部门...
网络编程实例 该项目包含在服务器端使用Java的Web应用程序的代码示例。技术清单这些示例涉及的主要技术是: Spring:Java框架。 这些示例基于Spring Boot,... Ionic:混合应用程序开发的框架。 Angular:Web应用程
它允许开发者使用JavaScript、Java、Ruby、Python、C#等语言编写测试脚本,对原生、混合及移动Web应用进行自动化测试。Appium通过WebDriver协议提供了一个统一的接口,使得测试代码可以在不同的平台上运行。 3. **...
《构建集成Node.js与Groovy on Grails的...这种混合式开发能够充分利用两种语言的优势,为开发者提供更广阔的设计空间,同时提高系统的可扩展性和性能。对于学习和实践多技术栈的开发者而言,这是一个极好的实践案例。
- **Express.js** 是 Node.js 生态中最受欢迎的 Web 开发框架之一,提供了丰富的中间件支持和路由机制,适用于构建单页面、多页面或混合型 Web 应用。 - **灵活性高**:Express.js 的核心设计思想在于其极简主义风格...
我们在高影响力项目的前端和后端方面的设计和开发以及为其他开发人员之间更好地协作而制定最佳实践的标准方面具有丰富的经验。 编程语言: HTML | CSS | JavaScript | 打字稿| PHP | C#| Python | Java | Kotlin| ...
"JSP-Servlet"是Java Web开发的一部分,JSP用于创建动态网页,Servlet则是Java服务器端程序。Comgon可能讲解了JSP和Servlet的交互,比如请求处理、会话管理以及MVC设计模式在Web开发中的应用。 最后,"SCSS"(Sass...