背景与挑战
在前后端分离开发模式下,前端开发经常面临后端API尚未完成的困境。Mock服务通过模拟后端API响应,使前端开发不依赖后端进度,实现并行开发。本方案使用React + Axios + Mock实现完整前后端联调流程,特别关注用户认证(JWT令牌)场景。
核心优势
- 独立开发:前端无需等待后端完成即可开发
- 快速迭代:Mock服务可即时调整API响应
- 真实模拟:完整实现JWT认证流程
- 无缝切换:前端代码无需修改即可连接真实后端
- 错误处理:完善模拟各种异常场景
解决方案架构
graph TD
A[前端React应用] -->|HTTP请求| B[Mock服务]
B --> C{模拟业务逻辑}
C --> D[登录认证]
C --> E[用户数据]
A -->|Axios拦截器| F[自动添加JWT]
A -->|Zustand| G[全局状态管理]
关键实现
1. Mock服务实现
javascript
// 模拟登录接口
{
url: '/api/login',
method: 'post',
response: ({ body }) => {
// 验证用户名密码
if (body.username !== 'admin' || body.password !== '123456') {
return { code: 1, message: '用户名或密码错误' };
}
// 生成JWT令牌
const token = jwt.sign({ userId: '001' }, 'secret-key', { expiresIn: '24h' });
return {
code: 0,
data: { token, user: { id: '001', username: 'admin' } }
};
}
}
// 模拟获取用户信息接口
{
url: '/api/user',
method: 'get',
response: ({ headers }) => {
// 验证令牌
const token = headers.authorization?.split(' ')[1];
try {
jwt.verify(token, 'secret-key');
return { code: 0, data: { id: '001', username: 'admin' } };
} catch {
return { code: 1, message: '无效令牌' };
}
}
}
2. Axios全局配置
javascript
// 请求拦截器:自动添加令牌
axios.interceptors.request.use(config => {
const token = localStorage.getItem('token');
if (token) config.headers.Authorization = `Bearer ${token}`;
return config;
});
// 响应拦截器:统一处理错误
axios.interceptors.response.use(
response => response.data, // 简化响应结构
error => Promise.reject(error.response?.data || error.message)
);
3. 状态管理(Zustand)
javascript
export const useUserStore = create(set => ({
user: null,
isLogin: false,
// 登录操作
login: async (credentials) => {
const response = await doLogin(credentials);
localStorage.setItem('token', response.data.token);
set({ user: response.data.user, isLogin: true });
},
// 退出操作
logout: () => {
localStorage.removeItem('token');
set({ user: null, isLogin: false });
}
}));
4. 路由守卫组件
javascript
const RequireAuth = ({ children }) => {
const { isLogin } = useUserStore();
const navigate = useNavigate();
const location = useLocation();
useEffect(() => {
if (!isLogin) {
navigate('/login', { state: { from: location.pathname } });
}
}, [isLogin, navigate, location]);
return isLogin ? children : null;
};
开发流程
- 前端开发:基于Mock接口开发前端功能
- 接口定义:前后端共同确认API规范
- Mock实现:根据接口规范实现Mock服务
- 联调测试:验证前端与Mock服务交互
- 切换后端:将Axios baseURL指向真实后端
最佳实践
-
分层管理API:
services/
:API请求封装mocks/
:Mock服务实现stores/
:全局状态管理
-
环境配置:
javascript// .env.development VITE_API_BASE_URL=http://localhost:5173/api // .env.production VITE_API_BASE_URL=https://api.yourdomain.com
-
错误模拟:
- 在Mock服务中模拟401未授权
- 模拟500服务器错误
- 模拟网络延迟
-
文档同步:
- 使用Swagger维护API文档
- Mock服务基于文档实现
效益分析
- 开发效率提升:前后端并行开发,时间缩短30-50%
- 质量保证:前端可在无后端情况下完成测试
- 成本降低:减少前后端联调等待时间
- 团队协作:明确定义的接口规范减少沟通成本
总结
Mock服务是现代化前端开发的关键基础设施,尤其在微服务架构下更为重要。本方案通过:
- 使用Mock服务模拟后端API
- 实现完整的JWT认证流程
- 结合Axios拦截器处理全局逻辑
- 使用状态管理维护用户会话
- 通过路由守卫保护敏感页面
使前端团队能够在后端完成前独立工作,大幅提升开发效率和质量。当后端API准备就绪时,只需简单配置即可切换,实现无缝过渡。