webpack配置mockjs,开发阶段对接口进行mock

发布时间 2023-05-23 11:11:23作者: 破男孩

1、先准备项目

运行 npx create-app-react projectName创建一个 react 项目,为了不暴露 webpack 的配置,我们不运行 npm run eject命令暴露配置,因此我们还需要安装 react-app-rewired 和 customize-cra 来进行对项目的 webpack 配置文件进行覆盖。 

在根目录下创建 config-overrides.js 配置文件。

 

 

2、接下来就是开始配置打包设置和相关代码

先配置webpack打包配置文件 config-overrides.js,config-overrides.js 内容如下,mock配置在最后使用 setupMiddlewaresd 进行mock配置,其他的配置无需关心

const Cra = require('customize-cra');
const {override, fixBabelImports, addWebpackPlugin, addLessLoader, addWebpackAlias, overrideDevServer, watchAll} = Cra;
const UglifyjsWebpack = require('uglifyjs-webpack-plugin');
const path = require('path');
const config = {
    webpack: override(
        // 按需引入antd组件(引入 antd 样式文件,需要下载 babel-plugin-import)
        // fixBabelImports("import", {
        //     libraryName: "antd",
        //     libraryDirectory: "es",
        //     style: true,
        // }),

        // 别名
        addWebpackAlias({
            "@": path.resolve(__dirname, 'src')
        }),

        // 添加less支持,默认支持sass,因此只需要安装 sass包就可以了,不需要对sass进行配置
        addLessLoader({
            lessOptions: {
                strictMath: true,
                javascriptEnabled: true,
                // Optionally adjust URLs to be relative. When false, URLs are already relative to the entry less file.
                relativeUrls: false,
                modifyVars: { '@primary-color': '#A80000' },
                // cssModules: {
                //   // if you use CSS Modules, and custom `localIdentName`, default is '[local]--[hash:base64:5]'.
                //   localIdentName: "[path][name]__[local]--[hash:base64:5]",
                // }
            }
        }),

        // 删除 console和debugger
        // 注意是production环境才启动该插件用于删除 console和debugger
        process.env.NODE_ENV === 'production' && addWebpackPlugin(
            new UglifyjsWebpack({
                // 打包缓存开启
                cache: true,
                // 开启多线程打包
                parallel: true,

                uglifyOptions: {
                    // 删除警告
                    warnings: true,

                    // 压缩
                    compress: {
                        // 删除console
                        drop_console: true,

                        // 删除debugger
                        drop_debugger: true
                    }
                }
            })
        ),
    )
}


if(process.env.NODE_ENV === 'development'){
    config.devServer = overrideDevServer((config)=>{
        return {
            ...config,

            // 配置mock
            setupMiddlewares: require('./src/mocks/index.js'),
        }
    }, watchAll());
}
module.exports = config;

 

3、在src目录下创建mocks目录,并在mocks目录下创建index.js文件 mocks/index.js 文件内容如下:

const Test= require('./apis/test')

const obj = {
  ...Test,
}

module.exports = function (middlewares, devServer) {
  Object.keys(obj).forEach((v) => {
    obj[v](devServer)
  })

  return middlewares
}

4、在mocks目录下创建apis目录,并创建具体的mock数据文件test.js, mocks/apis/test.js 文件内容如下:

const { handleReq } = require('../utils')

module.exports = {
  getUser: (devServer) => {
    handleReq(devServer, {
      url: '/users',
      method: 'get',
      json: {
        "name": "张三"
      },
    })
  },
}

5、在mocks目录下创建utils.js文件,用于处理数据返回值的公共逻辑,mocks/utils.js 内容如下:

const Mock = require('better-mock');

Mock.setup({
  timeout: 1000,
});

module.exports = {
  handleReq: (devServer, config) => {
    const { method, url, json } = config
    devServer.app[method]('/mock/api' + url, function (_, res) {
      res.json(Mock.mock(json))
    })
  },
}

 

6、在项目业务代码中使用mock数据,注意请求链接 /mock/api ,utils.js 里面的链接需要和业务代码中的进行匹配,不然没办法进行接口请求代理。

axios.get('/mock/api/users').then((res)=>{
            console.log('res', res)
        })

 

注意:

因为是在webpack的配置文件中引入的mock带,因此,目前不支持修改mock实时获取,每次修改mock数据后,需要重新启动服务才能获取到最新的mock数据。