前后端分离开发应该已经是很多公司的标配了,然而,在前端工程化的体系下,开发环境代码和生产环境代码往往是平级的,不再是整个文件夹往服务器上一扔就了事,这让每次的部署过程相当繁琐。
如下是常见的项目目录:
Project
└──javaSrc
└──app
└──src
└──main
└──web // 这里面是我们前端的世界
├──src // 开发环境
└──dist // 生产环境
如果能实现分离部署,整个项目的层级关系可以变成这样:
Project
└──javaSrc
└──web
前端后端平级,一目了然的同时,少敲几次cd
命令,可以减少对键盘的损耗。当然,目录层级和分离部署之间没有必然关联,并非合在一起就无法实现分离部署,但尽量层级关系尽量分得清晰一些,无论做什么操作都可以少些顾忌。
既然前段工程化是基于NodeJS,那么选择NodeJs做前后端分离部署也是理所应当的。其实只需要实现静态资源和代理的话,用nginx才是最好的选择,用NodeJS是为了日后能进一步在服务端上实现自动构建或服务端渲染。
第一步:安装环境
在前端工程的外层新建一个文件夹,比如就叫web吧,随后在里面搭建我们的前端工程。
web
└── app // 这是完整的前端工程
├── README.md
├── build/
├── dist/ // 生产环境代码
├── config/
├── index.html
├── package.json
├── src/ // 开发环境代码
├── node_modules/
└── static/
随后,我们在终端打开web目录,执行这样的语句:
npm init -y
npm i koa koa-static http-proxy-middleware -S
第一个koa
是基于NodeJS的服务器框架,koa-static
是基于Koa的插件,我们需要用它建立静态资源服务器,最后一个http-proxy-middleware
是用于做代理的插件。有了这三个东西,我们就可以搭建出最简单的前端服务器了。
第二步:配置
时候web文件夹下会多出一个package.json
和一个node_modules
,我们不用管这两个,而是在web/下建立一个js文件,比如叫server.js
吧!
// server.js
const Koa = require('koa')
const path = require('path')
const proxy = require('http-proxy-middleware')
const static = require('koa-static')
const fs = require('fs')
const app = new Koa()
const url = 'http://www.foo.com' // 后端服务器地址
app.use(async (ctx, next) => {
if(ctx.url.startsWith('/api')) { // 以api开头的异步请求接口都会被转发
ctx.respond = false
return proxy({
target: url, // 服务器地址
changeOrigin: true,
secure: false,
pathRewrite: {
'^/api' : '/webapp/api'
}
/* ^^^
上面这个pathRewrite字段不是必须的,
你的开发环境和生产环境接口路径不一致的话,才需要加这个。
*/
})(ctx.req, ctx.res, next)
}
// ...这里省略N个接口
return next()
})
// 指定静态资源文件夹
app.use(static(path.join(__dirname, './app/dist')))
// 指定首页
app.use(async (ctx) => {
ctx.body = fs.readFile('./app/dist/index.html')
})
// 监听
app.listen(3000, () => {
console.log('Listening 3000...')
});
这时候项目的层级关系就成了这样:
web
├── server.js
├── node_modules/
├── package.json
└── app // 这是完整的前端工程
├── README.md
├── build/
├── dist/ // 生产环境代码
├── config/
├── index.html
├── package.json
├── src/ // 开发环境代码
├── node_modules/
└── static/
第三步:运行
现在可以在服务器上跑了,运行命令:
node server.js
运行起来后,直接关掉终端即可,切不可Ctrl + C退出,否则服务又会停掉。觉得这种方式太粗暴的话,也有其他办法可以运行得更优雅一些,由于本文只阐述最简单的实现方式,因此不再赘述。
可以在后端服务器上随便找个目录搭建前端服务器,代理url写成http://localhost:8000
之类的,也可以另外找个服务器,但要记得不要将app/
下的node_modules/
一并扔上服务器,前端服务器上只需要以下几样东西就够了。
web
├── server.js
├── node_modules/
├── package.json
└── app
└── dist/
此后,只要接口没有变动,几乎不需要再改server.js
文件,以后每次部署只需要在本地构建好,一个scp
命令扔上去替换app/dist
文件夹即可。
这是最懒的实现方式,如果你愿意写几句脚本的话,可以让整个流程变得更加自动化,在这里就不做探讨了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。