86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
// src/mocks/browser.js
|
||
// 浏览器环境的 MSW Worker
|
||
|
||
import { setupWorker } from 'msw/browser';
|
||
import { handlers } from './handlers';
|
||
|
||
// 创建 Service Worker 实例
|
||
export const worker = setupWorker(...handlers);
|
||
|
||
// 启动状态管理(防止重复启动)
|
||
let isStarting = false;
|
||
let isStarted = false;
|
||
|
||
// 启动 Mock Service Worker
|
||
export async function startMockServiceWorker() {
|
||
// 防止重复启动
|
||
if (isStarting || isStarted) {
|
||
console.log('[MSW] Mock Service Worker 已启动或正在启动中,跳过重复调用');
|
||
return;
|
||
}
|
||
|
||
// 只在开发环境且 REACT_APP_ENABLE_MOCK=true 时启动
|
||
const shouldEnableMock = process.env.REACT_APP_ENABLE_MOCK === 'true';
|
||
|
||
if (!shouldEnableMock) {
|
||
console.log('[MSW] Mock 已禁用 (REACT_APP_ENABLE_MOCK=false)');
|
||
return;
|
||
}
|
||
|
||
isStarting = true;
|
||
|
||
try {
|
||
await worker.start({
|
||
// 🎯 警告模式(关键配置)
|
||
// 'bypass': 未定义 Mock 的请求自动转发到真实后端
|
||
// 'warn': 未定义的请求会显示警告(调试用)✅ 当前使用(允许 passthrough)
|
||
// 'error': 未定义的请求会抛出错误(严格模式,不允许 passthrough)
|
||
onUnhandledRequest: 'warn',
|
||
|
||
// 自定义 Service Worker URL(如果需要)
|
||
serviceWorker: {
|
||
url: '/mockServiceWorker.js',
|
||
},
|
||
|
||
// 是否在控制台显示启动日志和拦截日志 静默模式(不在控制台打印启动消息)
|
||
quiet: false,
|
||
});
|
||
|
||
isStarted = true;
|
||
console.log(
|
||
'%c[MSW] Mock Service Worker 已启动 🎭 (警告模式)',
|
||
'color: #4CAF50; font-weight: bold; font-size: 14px;'
|
||
);
|
||
console.log(
|
||
'%c警告模式:已定义 Mock → 返回假数据 | 未定义 Mock → 显示警告 ⚠️ | 允许 passthrough',
|
||
'color: #FF9800; font-weight: bold; font-size: 12px;'
|
||
);
|
||
console.log(
|
||
'%c查看 src/mocks/handlers/ 目录管理 Mock 接口',
|
||
'color: #2196F3; font-size: 12px;'
|
||
);
|
||
} catch (error) {
|
||
console.error('[MSW] 启动失败:', error);
|
||
} finally {
|
||
isStarting = false;
|
||
}
|
||
}
|
||
|
||
// 停止 Mock Service Worker
|
||
export function stopMockServiceWorker() {
|
||
if (!isStarted) {
|
||
console.log('[MSW] Mock Service Worker 未启动,无需停止');
|
||
return;
|
||
}
|
||
|
||
worker.stop();
|
||
isStarted = false;
|
||
console.log('[MSW] Mock Service Worker 已停止');
|
||
}
|
||
|
||
// 重置所有 Handlers
|
||
export function resetMockHandlers() {
|
||
worker.resetHandlers();
|
||
console.log('[MSW] Handlers 已重置');
|
||
}
|