离线页面生成器 - 当无网络时展示
创建当用户离线时展示的简单HTML页面,结合Service Worker使用。
UD5工具箱
// handlers.js - 定义请求处理器
import { http, HttpResponse } from 'msw'
export const handlers = [
// 拦截 GET /api/users
http.get('/api/users', () => {
return HttpResponse.json([
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' }
])
}),
// 带路径参数的处理器
http.get('/api/users/:id', ({ params }) => {
const { id } = params
return HttpResponse.json({
id: Number(id),
name: `User ${id}`,
email: `user${id}@example.com`
})
}),
// 模拟登录
http.post('/api/login', async ({ request }) => {
const body = await request.json()
if (body.username === 'admin') {
return HttpResponse.json({ token: 'mock-jwt-token', role: 'admin' })
}
return HttpResponse.json(
{ error: 'Invalid credentials' },
{ status: 401 }
)
})
]
// browser.js - 浏览器端Service Worker设置
import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
// 创建Service Worker实例
export const worker = setupWorker(...handlers)
// 启动worker(在开发环境中)
// worker.start({
// onUnhandledRequest: 'bypass', // 未匹配的请求放行
// quiet: false, // 显示详细日志
// })
// main.js 或 index.js - 应用入口
import { worker } from './mocks/browser'
async function bootstrap() {
// 开发环境中启动MSW
if (import.meta.env.DEV) {
await worker.start({
onUnhandledRequest: 'bypass',
serviceWorker: {
url: '/mockServiceWorker.js'
}
})
console.log('🚀 MSW started - mocking enabled')
}
// 启动应用
const app = createApp()
app.mount('#app')
}
bootstrap()
// 测试中使用MSW (Vitest/Jest)
import { setupServer } from 'msw/node'
import { handlers } from './handlers'
const server = setupServer(...handlers)
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
afterEach(() => server.resetHandlers())
afterAll(() => server.close())
test('fetches users successfully', async () => {
const response = await fetch('/api/users')
const users = await response.json()
expect(response.status).toBe(200)
expect(users).toHaveLength(2)
expect(users[0].name).toBe('Alice')
})
test('handles login failure', async () => {
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ username: 'wrong' })
})
expect(response.status).toBe(401)
})
| 特性 | MSW | json-server | axios拦截器 |
|---|---|---|---|
| 拦截层级 | 网络层(Service Worker) | 独立服务器 | 库级别 |
| 支持请求库 | 所有(fetch/XHR/GraphQL) | 所有 | 仅axios |
| DevTools可见 | ✅ 是 | ✅ 是 | ❌ 否 |
| 代码侵入 | 零侵入 | 需配置baseURL | 需修改拦截器 |
| 测试复用 | ✅ 完美复用 | 需启动服务 | 部分复用 |
| 离线开发 | ✅ 支持 | 需本地服务 | ✅ 支持 |
if (process.env.NODE_ENV === 'development') { await worker.start() }mockServiceWorker.js 不应部署到生产服务器start() 方法在调用前会检查环境,但最佳实践是在代码层面做好隔离graphql.link() 和 graphql.query() 处理器fetch()、axios、XMLHttpRequest、@apollo/client 还是 react-query,MSW 都能在底层统一拦截。
npm install msw@latest --save-devnpx msw init ./public --savesrc/mocks/handlers.js,使用 http.get/post/put/delete 定义拦截规则if (dev) { await worker.start() }window.fetch,替换为自定义函数,在函数中检查mock规则并返回模拟的 Response 对象XMLHttpRequest.prototype 的 open 和 send 方法创建当用户离线时展示的简单HTML页面,结合Service Worker使用。
在散点图上拖拽数据点,实时更新最小二乘回归线,显示斜率和截距。
展示各种 HTML5 验证属性(required, pattern, min, max 等)和自定义验证消息的效果。
粘贴Link rel=preload头字段,解析展示服务器计划推送的资源列表。
在单页内模拟MPA过渡效果,自定义进场/出场动画,体验View Transitions API丝滑切换。
发起请求获取当前URL或任意允许CORS的URL的Response Headers,展示详情。
定义端点、JSON响应体和延迟毫秒,模拟后端API供前端本地开发调试。
定义字段名称和类型(姓名、邮箱、数字范围等),批量生成符合规则的 JSON 模拟数据。
使用原生HTML Popover属性创建提示、菜单与对话框,展示四种触发方式及样式定制。
输入常见的报错片段,基于静态库返回常见的解释和可能的修复方案。
设置不同验证属性和自定义消息,测试HTML5表单验证触发效果。
创建活动链接,分享后收集参与者出席回应,实时显示参与、婉拒与未回复名单。
展示一些常用内置HTML元素和自定义元素例子,提供代码复制。
选择平台和分享参数,生成分享到Twitter、Facebook、WhatsApp等的URL链接及按钮。
生成带有动画的点赞/点踩或表情反馈组件,包含选中状态和计数。
选择各种数据类型演示structuredClone的深拷贝能力,对比JSON.parse的限制。
对简单混淆的JS进行格式化,并尝试将短变量名替换为更具描述性的名称,提高可读性。
打开一个始终置顶的小窗口,在其中显示自定义内容(例如笔记/时钟),实验新API。
生成点击导航平滑滚动到对应Section并高亮当前菜单项的完整代码。
常用HTML实体编码(如© ©)的图形化速查表,点击即可复制实体名称或数字代码。
将普通CSS代码转换为Styled Components的模板字符串格式。
逐步展示SW从注册、安装到激活的完整流程,并模拟更新与跳过等待的场景。
注册Periodic Background Sync,让应用在后台定期获取最新数据并更新缓存。
利用 `:target` 伪类创建无需JavaScript的弹窗组件,支持关闭按钮和遮罩层。
记录页面交互触发的所有DOM事件及其目标、冒泡阶段,以日志和瀑布形式展示。
从眉毛、眼睛、嘴巴等部件中拖拽组合,生成独一无二的日式颜文字表情,一键复制。
向任意输入URL发送请求,清晰显示响应状态码、头信息和体,类似轻量级Postman。
对比 ES Module 和经典脚本的变量作用域、严格模式以及执行时机。
构建或随机生成二叉树,逐步动画展示前序、中序、后序和层序遍历的路径。
解析标准Cron表达式,显示未来多次执行的具体日期时间,辅助验证定时任务配置。