gulp-webserver搭建本地服务
2019-08-22
前情提要
这个是三年前的老项目了,换了运营换了后端又换了前端。但是最近老板对这个项目很重视,所以改动非常之频繁。前端代码混在后端项目里,每次部署还得麻烦后端,而且最致命的是:必须依赖后端部署了接口之后,再代理本地资源,在测试环境测试,根本没法本地mock数据。综上所述,前后端分离势必要做了。
前端项目是gulp打包的,最初考虑推倒然后用webpack重新搭一套(现有项目基本都是webpack)。但是再一思索:gulp还不至于那么不堪到恨不得赶紧甩掉,而且这样的做法实在有些舍近求远了。因而怀着学习gulp扩展技能树的念头,网上搜索一番,找到官方文档。自己摸索摸索,倒也配置成功了。走了些弯路,有了些经验,记录在此,以供参考。
安装gulp-webserver
> npm install -D gulp-webserver
json配置
在根目录下,创建json文件夹及proxies.json文件。
proxies.json文件,将接口对应到本地json文件。
// proxies.json
{
"/abc": "abc.json",
"/123": "123.json"
}
json文件夹,用于存放每个接口对应的mock数据。
|-json
|-abc.json
|-123.json
编写gulpfile.js
var fs = require('fs');
var gulp = require('gulp');
var proxies = require('./proxies.json');
var webserver = require('gulp-webserver');
// 本地静态资源服务
gulp.task('webserver', function () {
return gulp.src('.')
.pipe(webserver({
// 自动打开网页
open: true,
// 热加载
livereload: true,
// 运行端口号
port: 8089,
// 默认访问的html地址,若请求不被处理则返回此html
fallback: './public/admin.html',
// ⚠️关键代码
middleware: function (req, res, next) {
// 将请求的path提取出来
let path = req.originalUrl.split('?')[0];
// 若请求在我们记录的json对象中,则处理
if (path in proxies) {
// 拼接json文件路径
let filename = `./json/${proxies[path]}`;
try {
// 尝试打开json文件
fs.accessSync(filename, fs.constants.R_OK);
// 构造返回对象HTTP头
res.setHeader('Content-Type', 'application/json');
// 读取json文件内容即mock数据
var data = fs.readFileSync(filename, 'utf-8');
// 将mock数据装入返回对象
res.end(data);
} catch (err) {
// 构造错误时的返回内容
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({
"status": "没有找到文件",
"notFound": filename
}));
}
} else {
// 对当前请求不做处理,继续下一个
next();
}
}
}));
});
// 运行gulp dev即可
gulp.task('dev', ['webserver'], function () {});