面向webpack的本地mock方案

424 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

一、前言

后端接口迟迟不来,前端该怎么mock?我之前写过一篇文章 如何自建前端mock体系,是基于浏览器IndexedDB的解决方案,可以参考一下。

我们可以将自建Mock体系理解为,前端可以直接操作数据库里的数据,比如CRUD操作,经过基于IndexedDB数据库封装好的接口会返回一个promise对象,我们就像使用Axios请求后端接口一样去请求Mock接口。

本文侧重介绍面向webpack的本地mock方案。

截止目前,前端开源领域提供了许多基于webpack的本地mock方案,这些方案多数是封装好的npm包,比如webpack-api-mockerwebpack-mock-server,本文不会去讲解这些npm包的使用,而是手写一个mock插件/中间件,实现前端工程本地mock。

二、原理

mock方案核心流程原理

image.png

mock中间件核心原理

image.png

三、实现代码

//mock.config.js

coonst fs=require('fs')
const path=require('path')

//response函数:对接口进行响应
function response(res,content,type='json'){
    res.type(type) //设置响应类型
    res.write(content) //设置响应内容
    res.end()
}

//mock函数
function mock(res,file){
    //读取本地json文件
    fs.readFile(file,'utf8',(error,content)=>{
        if(error){
            response(res,error.message,'html')
        }
        response(res,content)
    })
}

//编写中间件
const mockMiddleware=(config)=>(req,res,next)=>{
    const {projectDir,mockDir}=config
    
    const filePath=path.resolve(projectDir,`./${mockDir+req.path}.json`)
    
    //检查当前文件是否能被正常解析
    return fs.stat(filePath,(error)=>{
        if(error){
            next()
        }else{
            mock(res,filePath)
        }
    })
}

module.exports=mockMiddleware

以上就是我们编写的mock中间件,下面我们在webpack.dev.config.js中使用我们编写的中间件

......
const mockMiddleware =require('./mock.config.js')
module.exports={
    ......
    devServer:{
        contentBase:path.join(__dirname,'.'),
        historyApiFallback:false,
        hot:false,
        host:'0.0.0.0',
        port:8080,
        before(app){//before钩子函数
            const projectDir=path.resolve()
            const mockDir='./mock'
            app.use(mockMiddleware({projectDir, mockDir}))
        }
    }
}

打开浏览器输入访问localhost:8080/ad/index/gray,可以看到成功返回数据

image.png