76 lines
2.3 KiB
JavaScript
76 lines
2.3 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 已启用 🎭', 'color: #4CAF50; font-weight: bold;');
|
||
} 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 已重置');
|
||
}
|