type SetupMiddlewaresContext = {
sockWrite: (
type: string,
data?: string | boolean | Record<string, any>,
) => void;
environments: EnvironmentAPI;
};
type SetupMiddlewaresFn = (
middlewares: {
unshift: (...handlers: RequestHandler[]) => void;
push: (...handlers: RequestHandler[]) => void;
},
context: SetupMiddlewaresContext,
) => void;
type SetupMiddlewares = SetupMiddlewaresFn | SetupMiddlewaresFn[];
undefined
>= 1.4.0
用于在开发服务器中添加自定义的中间件。
查看 开发服务器 - 中间件 了解更多。
setupMiddlewares
函数接收一个 middlewares
数组,你可以通过 unshift
和 push
方法来添加自定义的中间件:
unshift
在数组开头添加中间件,早于内置中间件执行。push
在数组末尾添加中间件,晚于内置中间件执行。export default {
dev: {
setupMiddlewares: (middlewares) => {
middlewares.unshift((req, res, next) => {
console.log('first');
next();
});
middlewares.push((req, res, next) => {
console.log('last');
next();
});
},
},
};
中间件可以是一个异步函数:
export default {
dev: {
setupMiddlewares: (middlewares) => {
middlewares.unshift(async (req, res, next) => {
await someAsyncOperation();
next();
});
},
},
};
setupMiddlewares
也支持传入一个数组,数组中的每一项都是一个用于配置中间件的函数:
export default {
dev: {
setupMiddlewares: [
(middlewares) => {
// ...
},
(middlewares) => {
// ...
},
],
},
};
在 Rsbuild 1.4.0 之前的版本中,setupMiddlewares
必须传入一个数组。
setupMiddlewares
函数的第二个参数是 context
对象,该对象提供了一些服务器上下文和 API。
提供 Rsbuild 的 environment API,详见 Dev server API - environments。
export default {
dev: {
setupMiddlewares: (middlewares, { environments }) => {
middlewares.unshift(async (req, _res, next) => {
const webStats = await environments.web.getStats();
console.log(webStats.toJson({ all: false }));
next();
});
},
},
};
向 HMR 客户端传递一些消息,详见 Dev server API - sockWrite。
例如,如果你发送一个 'static-changed'
的消息,页面将会重新加载。
export default {
dev: {
setupMiddlewares: (middlewares, { sockWrite }) => {
if (someCondition) {
sockWrite('static-changed');
}
},
},
};