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 数据变得更加简单。

完整代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355