mock的3个层次和自动启动mock server

前后端分离的架构下,前端开发不全部依赖于后端的接口,当后端服务器不可用时,可以自己mock数据。

主要针对异步的ajax请求,通过把对后端服务器的请求换成对mock server的请求来实现。这个操作可以在3个层次来做。

1. 项目中的httpProxy

前端项目一般都会封装一个httpProxy,进行一些ajax的通用配置和请求、响应的通用处理。我们可以通过切换请求域名的配置来实现mock server 和真实后端服务器的切换。

比如axios里,通过修改baseUrl的配置:

  axios.config({
      baseUrl: 'http://xxxxx.com/' 
  })
复制代码

手动切换成

axios.config({
  baseUrl: 'http://localhost:3000/'
})
复制代码

就可以把所有的请求都换成对mock server的请求了。

2.构建时的环境变量

手动切换的方式太过繁琐,我们可以结合构建时的环境变量来实现自动切换。

比如,在axios的配置中这样写:

axios.config({
   baseUrl: process.env.USE_MOCK ? 'http://xxxx.com' : ''
})
复制代码

然后在启动的时候通过判断命令行参数,或者通过选择的方式来切换,

       inquirer.prompt({
            type: 'list',
            name: 'isMock',
            message: '是否使用mock数据?',
            choices: [
                '是',
                '否'
            ],
            filter(val) {
                return val === '是' ? 1 : 0;
            }
        }).then(answer => {
            if (answer.isMock === 1) {
                console.log(chalk.green('使用mock数据'));
                process.env.USE_MOCK = true;
            } else {
                console.log(chalk.green('不使用mock数据'));
            }
        });
复制代码

这种通过命令行参数或者手动选择的方式,比手动修改代码方便了很多,也是比较常用的方式。

3.修改hosts

除了可以修改请求的域名外,还可以通过hosts来修改域名和ip的对应关系,不改动代码,只要把域名切换成后端服务器的ip或者mock server的ip就可以了。这种方式也很常用。

# localhost   http://xxx.com
59.151.115.115 http://xxx.com
复制代码

项目级别、工程级别、系统级别的方案都可以实现目标服务器的切换。除了直接请求目标服务器,也可以通过webpack的devServer来做转发,它支持一些url的重写之类的功能。

如把 /aaa/bbb 转向 /api/xxx的配置

devServer: {
  proxy:{
       '/aaa/bbb/': {
         target: 'http://localhost:3000',
         changeOrigin: true,
         pathRewrite: {
            '^/api/xxx': ''
        }
      }
  }
}
复制代码

以上是3种mock数据的方式,最常用的还是在工程级别也就是构建的时候做处理,而且还可以做到检测mock server状态并且自动启动mock server。

自动启动mock server

检测mock server状态可以通过 检测端口占用情况

    exec('netstat -ano | findstr "3000"', (err, result) => {        
        if(result.indexOf('LISTENING') != -1){
            console.log(chalk.green('检测到mock服务器已经启动'));
        }else{
            console.log(chalk.blue('未启动mock服务器,正在启动中'));
            startMockServer( () => {
                console.log(chalk.green('mock服务器启动成功'));
            });
        }
    });
复制代码

而启动MockServer只需要执行对应的命令。不过MockServer启动后就一直阻塞在哪里,没有返回的信息,只能通过主动去请求的方式来判断是否启动成功。

function startMockServer(callback) {
    exec('npm run mock', (err, stdout) => {
        if (err) {
            console.log(chalk.red('mock服务器启动失败'));
        }
    });
    setTimeout(() => {
        http.get({
            hostname: 'localhost',
            port: 3000,
            path: '/'
        }, (res) => {
            callback();
        });
    }, 3000);
}
复制代码

最终效果如下:

上面的文字是用的cfonts和随机生成的配置

function generateRandomCFontsConfig() {
    const fontArr = ['console', 'block', 'simpleBlock', 'simple', '3d', 'simple3d', 'chrome', 'huge'];
    const font = fontArr[_.random(0,fontArr.length)];
    const colorArr = ['system','black','red','green','yellow','blue','magenta','cyan','white','gray','redBright','greenBright','yellowBright','blueBright','magentaBright','cyanBright','whiteBright','candy']
    const color1 = colorArr[_.random(0,colorArr.length-1)]
    const color2 = colorArr[_.random(0,colorArr.length-1)]
    const color3 = colorArr[_.random(0,colorArr.length-1)]

    return {
        colors: [color1,color2,color3],
        font: font
    }
}
    say('ITS',{
        ...generateRandomCFontsConfig(),
        space: false
    })
复制代码

##总结

切换mock 服务器和真实的后端服务器,可以通过修改请求的域名或者通过修改hosts修改域名对应的ip的方式,修改域名的方式可以结合工程构建过程中的环境变量来实现自动切换,同时webpackDevServer也支持一些请求的转发。

工程构建过程中可以通过检测端口占用请求和http请求的方式 做到检测mock server状态和自动启动mock server,使得mock 数据变得更加简单。

完整代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值