在开始讨论这个话题之前我们先来认识一下传统的开发模式
传统开发模式
相信很多做过Web开发的程序员应该都会经历这样一种开发模式,利用服务器端程序提供的HTML模版引擎编写HTML页面,比如
PHP
开发有Smarty模板引擎Java
Web工程有jsp页面Python
如Django自带的templateNodeJS
Express自带的模板
都有一个共同的特点,服务器端渲染HTML返回浏览器。
Ajax过渡
Ajax是把服务器端渲染剥离的推进者,当时网页局部更新就是未来的趋势,那什么是前端独立开发模式呢?简单来说就是前端开发阶段使用开发WebServer做服务,使用类似http-proxy之类的包做API代理转发,完全与服务器工程剥离,服务器端只管暴露各种API接口提供数据的增删改查,不负责渲染HTML页面,前端有一套自己的规则去渲染HTML。
前端构建
相对于服务器端来说,前端项目构建有点复杂。服务器端项目通常都带自己的WebServer,除了PHP以外,所以服务器端做PHP开发的还需要一个WebServer,Apache就是经典配合,最近被抛弃换做Nginx了。
前端项目需要有一个WebServer服务HTML/CSS/JavaScript的访问,最笨的直接使用Nginx也可以,但这样开发还是很痛苦。可以利用npm包即可,npm包非常多,比如我非常喜欢用的BrowserSync。
# 使用一条命令即可安装
npm install browsersync
解决API代理问题
前端独立部署后,我们只需要服务器端告诉我们服务器端部署IP即可,那么这会产生一个问题: Ajax跨域。这里就不能使用一般的跨域解决方法去解决,比如jsonp等等,因为我们还有POST请求。
于是http-proxy类工具就有用了,比如我就会在BrowserSync加入中间件判断每一个请求,如果是/api
前缀就会代理到API Server端,API Server端收到数据后再返回给BrowserSync,BrowserSync再返回给浏览器端。这样就解决跨域请求的问题
生产环境有两种部署:
- 一种是放到服务器端的项目里一块启动,这就没啥说的
- 另外一种就是前端独立部署,那就在前端WebServer处理端写点转发规则就好,如Nginx,Apache都支持。
静态资源路径问题
如果你的项目有上传资源功能,那自然就会产生用户资源,那前端独立开发部署后如何来处理这个问题呢?得先看模式。
资源与服务器端项目放一起,服务器端处理完后需要返回前端一个相对路径,如果资源是一台单独的服务器,那就需要返回资源的绝对URL即可。
会话
Web项目最头疼的就是无状态导致会话问题,传统的Web项目都使用Session&Cookie,但在服务器端分离,集群部署模式下这Session明显缺陷太多。Token方式已经是当前Web端解决会话的主流,并且有henduo开源好用的Token生成管理程序,基本上拿来就能用。
最后总结几点
- 使用Token的话Web端就像手机端的App一样,不需要Cookie/Session,易于维护、扩展
- AngularJS用过了以后,你应该会感觉未来的Web开发模式
- 前端独立部署之后,不会因为服务器端进程被异常终止而打不开页面
- 开发上与服务器端几乎同步,互相不影响,特别是基于RESTFul API风格,更是减少了沟通的成本
- 方便各自Debug,Java开发人员不需要跑到前端开发人员机器上看Tomcat控制台的报错