不说废话,直接开始。我使用 webpack 5.90.3,以下是我的配置。
- 文件结构
text
project_root/
|-- webpack.config.js
|-- mockserver.js
|-- mock/
|-- user.js - webpack.config.js
{{< admonition tip >}}
因为 express 现在不再附带 body-parser,现在需要执行 npm i -D body-parser。如果你希望读取 request 里面的内容,你会需要这个插件。
{{< /admonition >}}
“`javascript
const webpack = require(“webpack”);
var bodyParser = require(‘body-parser’)
const mockServer = require(“./mockserver.js”)
module.exports = (env, argv) => {
// … some code
return {
devServer: {
setupMiddlewares: (middlewares, devServer) => {
if (!devServer) {
throw new Error(‘webpack-dev-server is not defined’);
}
devServer.app.use(bodyParser.json())
devServer.app.use(mockServer());
// don't forget this line
return middlewares;
}
},
//... and so on
“`
- mockserver.js
mockserver.js 返回给 express dev server 需要的一个中间件(其实在java开发看来,这个东西习惯称为切面或过滤器)。
“`javascript
const fs = require(“fs”);
const path = require(“path”);
module.exports = function () {
let mockDataPath = path.resolve(__dirname, “./mock/”);
let existsMockDir = fs.existsSync(mockDataPath);
let getMockData = () => {
if (existsMockDir) {
let modules = fs.readdirSync(mockDataPath);
return modules.reduce((pre, module) => {
return {
…pre,
…require(path.join(mockDataPath, “./” + module)),
};
}, {});
} else {
console.log(“please create a mock directory under your project root!”);
return {};
}
};
let splitApiPath = (mockData) => {
let data = {};
for (let path in mockData) {
let [method, apiPath, sleep] = path.split(" ");
let newApiPath = method.toLocaleUpperCase() + apiPath;
data[newApiPath] = {
path: newApiPath,
method,
sleep,
callback: mockData[path],
};
}
return data;
};
let delayFn = (sleep) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, sleep);
});
};
async function ret(req, res, next) {
let { path, method } = req;
console.log("mock server received request: %s %s", method, path);
if (path.indexOf("api") === -1 || !existsMockDir) {
return next();
}
let mockData = splitApiPath(getMockData());
let pathKey = method.toLocaleUpperCase() + path;
let { sleep, callback } = mockData[pathKey];
let isFuntion = callback.__proto__ === Function.prototype;
if (sleep && sleep > 0) {
await delayFn(sleep);
}
if (isFuntion) {
callback(req, res);
} else {
res.json({
...callback,
});
}
next();
}
return async (req, res, next) => {
// next();
return ret(req, res, next);
};
};
“`
- mock/user.js
user.js 里面定义 mock 的数据以及如何返回。
可以按模块多写几个js, 都会自动加载。
javascript
module.exports = {
"GET /api/v0/user/list": {
success: true,
code: 200,
data: {
list: [
{
name: "anyone",
age: 18,
},
],
},
},
// method path delay(ms)
"POST /api/v0/reset 1000": (req, res) => {
res.json({
success: true,
code: 200,
data: { username: req.body.username },
});
},
};
本文参考了掘金文章,我做了些改动以便让它能够在 webpack5 上运行。