Skip to content

Commit 7a69bab

Browse files
Copilothotlong
andcommitted
Add demo app, quickstart guide, and update dependencies for React support
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 76b5de6 commit 7a69bab

5 files changed

Lines changed: 521 additions & 1 deletion

File tree

examples/msw-demo/QUICKSTART.md

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# Quick Start Guide - MSW Frontend Components
2+
3+
## 快速开始指南
4+
5+
本指南将帮助你在 5 分钟内开始使用 MSW 模拟 API 进行前端数据操作。
6+
7+
## 📦 安装
8+
9+
```bash
10+
# 安装依赖
11+
pnpm add msw @objectstack/plugin-msw react
12+
13+
# 或使用 npm
14+
npm install msw @objectstack/plugin-msw react
15+
```
16+
17+
## 🚀 三步集成
18+
19+
### 第一步:初始化 MSW Worker
20+
21+
创建 `src/mocks/setup.ts`:
22+
23+
```typescript
24+
import { setupWorker } from 'msw/browser';
25+
import { http, HttpResponse } from 'msw';
26+
import { ObjectStackServer } from '@objectstack/plugin-msw';
27+
28+
// 初始化 Mock Server
29+
const mockProtocol = {
30+
async findData(object: string) {
31+
return [/* 模拟数据 */];
32+
},
33+
async createData(object: string, data: any) {
34+
return { id: '123', ...data };
35+
},
36+
// ... 其他方法
37+
};
38+
39+
ObjectStackServer.init(mockProtocol);
40+
41+
// 定义处理器
42+
const handlers = [
43+
http.get('/api/v1/data/:object', async ({ params }) => {
44+
const result = await ObjectStackServer.findData(params.object as string);
45+
return HttpResponse.json(result.data);
46+
}),
47+
// ... 其他端点
48+
];
49+
50+
// 启动 Worker
51+
export const worker = setupWorker(...handlers);
52+
```
53+
54+
### 第二步:在应用入口启动 MSW
55+
56+
`src/main.tsx``src/index.tsx`:
57+
58+
```typescript
59+
import { worker } from './mocks/setup';
60+
61+
async function main() {
62+
// 仅在开发环境启动 MSW
63+
if (process.env.NODE_ENV === 'development') {
64+
await worker.start({ onUnhandledRequest: 'bypass' });
65+
console.log('MSW started');
66+
}
67+
68+
// 启动你的 React 应用
69+
// ...
70+
}
71+
72+
main();
73+
```
74+
75+
### 第三步:在组件中使用
76+
77+
#### 方式 A:使用自定义 Hooks(推荐)
78+
79+
```tsx
80+
import { useObjectData, useCreateData } from './hooks/useObjectData';
81+
82+
function UserList() {
83+
const { data: users, loading, error } = useObjectData('user');
84+
const { execute: createUser } = useCreateData('user');
85+
86+
if (loading) return <div>Loading...</div>;
87+
if (error) return <div>Error: {error}</div>;
88+
89+
return (
90+
<div>
91+
{users?.map(user => (
92+
<div key={user.id}>{user.name}</div>
93+
))}
94+
<button onClick={() => createUser({ name: 'New User' })}>
95+
Add User
96+
</button>
97+
</div>
98+
);
99+
}
100+
```
101+
102+
#### 方式 B:直接使用 Fetch API
103+
104+
```tsx
105+
import { useState, useEffect } from 'react';
106+
107+
function UserList() {
108+
const [users, setUsers] = useState([]);
109+
110+
useEffect(() => {
111+
fetch('/api/v1/data/user')
112+
.then(res => res.json())
113+
.then(setUsers);
114+
}, []);
115+
116+
return (
117+
<div>
118+
{users.map(user => (
119+
<div key={user.id}>{user.name}</div>
120+
))}
121+
</div>
122+
);
123+
}
124+
```
125+
126+
## 📚 完整示例
127+
128+
查看以下文件获取完整示例:
129+
130+
- `src/demo.tsx` - 完整的演示应用
131+
- `src/components/UserManagement.tsx` - 完整 CRUD 组件
132+
- `src/components/UserList.tsx` - 使用 Hooks 的简化组件
133+
- `src/hooks/useObjectData.ts` - 自定义 Hooks
134+
135+
## 🎯 支持的操作
136+
137+
### 数据操作
138+
139+
```typescript
140+
// 获取列表
141+
GET /api/v1/data/user
142+
143+
// 获取单个
144+
GET /api/v1/data/user/123
145+
146+
// 创建
147+
POST /api/v1/data/user
148+
Body: { name: "John", email: "john@example.com" }
149+
150+
// 更新
151+
PATCH /api/v1/data/user/123
152+
Body: { name: "John Updated" }
153+
154+
// 删除
155+
DELETE /api/v1/data/user/123
156+
```
157+
158+
### 使用 Hooks
159+
160+
```typescript
161+
// 获取数据
162+
const { data, loading, error, refetch } = useObjectData('user');
163+
164+
// 创建数据
165+
const { execute: create } = useCreateData('user', {
166+
onSuccess: () => console.log('Created!'),
167+
});
168+
await create({ name: 'John' });
169+
170+
// 更新数据
171+
const { execute: update } = useUpdateData('user');
172+
await update({ id: '123', data: { name: 'Updated' } });
173+
174+
// 删除数据
175+
const { execute: remove } = useDeleteData('user');
176+
await remove('123');
177+
```
178+
179+
## 🐛 故障排除
180+
181+
### MSW Worker 无法启动
182+
183+
确保在浏览器环境中启动:
184+
185+
```typescript
186+
if (typeof window !== 'undefined') {
187+
await worker.start();
188+
}
189+
```
190+
191+
### 请求未被拦截
192+
193+
检查 baseUrl 是否匹配:
194+
195+
```typescript
196+
// 如果你的 API 是 /api/data/user
197+
// 确保 handler 路径匹配
198+
http.get('/api/data/:object', ...)
199+
```
200+
201+
### TypeScript 错误
202+
203+
确保安装了类型定义:
204+
205+
```bash
206+
pnpm add -D @types/react
207+
```
208+
209+
并在 `tsconfig.json` 中启用 JSX:
210+
211+
```json
212+
{
213+
"compilerOptions": {
214+
"jsx": "react",
215+
// ...
216+
}
217+
}
218+
```
219+
220+
## 📖 更多文档
221+
222+
- [完整中文指南](./GUIDE_CN.md)
223+
- [README](./README.md)
224+
- [MSW 官方文档](https://mswjs.io/)
225+
226+
## 💡 提示
227+
228+
1. **仅开发环境使用**: MSW 应该只在开发和测试环境使用
229+
2. **代码分割**: 将 MSW 相关代码放在单独的 chunk 中
230+
3. **类型安全**: 为你的数据定义 TypeScript 接口
231+
4. **错误处理**: 始终处理加载和错误状态
232+
5. **性能**: 使用 React.memo 和 useCallback 优化组件
233+
234+
## ⚡ 下一步
235+
236+
- 查看 [完整示例](./src/demo.tsx)
237+
- 阅读 [自定义 Hooks 文档](./src/hooks/useObjectData.ts)
238+
- 探索 [完整组件实现](./src/components/)
239+
240+
---
241+
242+
**需要帮助?** 查看 [Issues](https://github.com/objectstack-ai/spec/issues) 或阅读完整文档。

examples/msw-demo/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
"@objectstack/objectql": "workspace:*",
1515
"@objectstack/plugin-msw": "workspace:*",
1616
"@objectstack/runtime": "workspace:*",
17-
"msw": "^2.0.0"
17+
"msw": "^2.0.0",
18+
"react": "^18.0.0"
1819
},
1920
"devDependencies": {
2021
"@types/node": "^20.0.0",
22+
"@types/react": "^18.0.0",
2123
"ts-node": "^10.9.1",
2224
"typescript": "^5.0.0"
2325
}

0 commit comments

Comments
 (0)