// 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 已重置'); }