## Mock Server Worker
基於 service worker 驅動起來 mock api 服務,並掛載在現有的 vite 環境下,執行 run dev 時就會起起來
## Verison
```json=
"msw": "^2.3.1",
"vite": "4.5.0",
```
## Install
```bash=
# 0. - yarn install
yarn add msw -D
# 1. - 建置 public/mockServiceWorker.js
# (用於驅動 service worker 如果不下這個 mockServiceWorker.js 空白就無法正常驅動)
npx msw init --save
```
## 新增資料夾
```json=
* mocks
* apis
* demo.js
* browser.js
* handleer.js
* utils.js
```
## apis/demo.js
```javascript=
import { http, HttpResponse } from 'msw';
import { getDomain } from '@/mocks/utils';
export const mockDemoApi = [
http.get(getDomain('/api/v3/users'), () => {
return HttpResponse.json({
users: [
{
id: 1,
name: 'Kanahei'
},
{
id: 2,
name: 'piske'
},
{
id: 2,
name: 'usagi'
}
]
});
}),
http.post(getDomain('/api/v3/user'), async ({ request }) => {
const body = await request.json();
return HttpResponse.json({
status: 'success',
user: body
});
}),
http.put(getDomain('/api/v3/user'), async ({ request }) => {
const body = await request.json();
return HttpResponse.json({
status: 'success',
user: body
});
}),
http.delete(getDomain('/api/v3/user/*'), () => {
return HttpResponse.json({
status: 'success'
});
})
];
export default mockDemoApi;
```
## handlers.js
```javascript=
import { mockDemoApi } from './apis/demo';
export const handlers = [...mockDemoApi];
```
## browser.js
```javascript=
import { setupWorker } from 'msw/browser';
import { handlers } from './handlers';
export const worker = setupWorker(...handlers);
```
## 在 main 或 indedx 進入 entry 中掛上啟動函式
```javascript=
export const useMockServiceWorker = async () => {
// only use in development
if (import.meta.env.VITE_APP_NODE_ENV !== 'dev.local') {
return;
}
const { worker } = await import('./browser.js');
return worker.start({
onUnhandledRequest() {
// pass on unhandled requests
return;
}
});
};
```
### main.js or index.js
```javascript=
useMockServiceWorker().then(() =>
root.render(
<React.StrictMode>
<ThemeProvider theme={theme}>
<Provider store={store}>
<RouterProvider router={rootRouter} />
</Provider>
</ThemeProvider>
</React.StrictMode>
)
);
```
## Running
dev 時打開 Console 顯示 [MSW] Mocking enabled. 及成功
Application 中 service worker 已經順利啟動