背景与价值传统依赖正则与字符串解析的路由匹配可读性差且易错;`URLPattern` 提供更直观的路径模板与参数捕获。前端路由示例const userDetail = new URLPattern({ pathname: '/users/:id' });

const postDetail = new URLPattern({ pathname: '/posts/:id' });

function matchRoute(url: string) {

const u = new URL(url, location.origin);

if (userDetail.test(u)) return { name: 'user', params: userDetail.exec(u)!.pathname.groups };

if (postDetail.test(u)) return { name: 'post', params: postDetail.exec(u)!.pathname.groups };

return { name: 'not-found' };

}

Service Worker 路由与缓存self.addEventListener('fetch', (event: FetchEvent) => {

const u = new URL(event.request.url);

const apiUser = new URLPattern({ pathname: '/api/users/:id' });

const staticAssets = new URLPattern({ pathname: '/assets/*' });

if (apiUser.test(u)) {

event.respondWith(networkFirst(event.request));

return;

}

if (staticAssets.test(u)) {

event.respondWith(cacheFirst(event.request));

return;

}

});

async function cacheFirst(req: Request) {

const cache = await caches.open('static-v1');

const hit = await cache.match(req);

if (hit) return hit;

const res = await fetch(req);

if (res.ok) cache.put(req, res.clone());

return res;

}

async function networkFirst(req: Request) {

const cache = await caches.open('api-v1');

try {

const res = await fetch(req);

if (res.ok) cache.put(req, res.clone());

return res;

} catch {

const hit = await cache.match(req);

if (hit) return hit;

return new Response('offline', { status: 503 });

}

}

指标验证(Chrome 128/Edge 130)路由匹配耗时(P95):较正则与自解析降低 35%–55%。SW 路由可读性与错误率:参数捕获稳定,无路径漏匹配;故障率 ≤ 0.3%。缓存命中率:静态资源命中 ≥ 85%,API 离线回退成功率 ≥ 97%。设计要点模板语义清晰,避免过度通配;对敏感路径加入权限校验。配合 `Cache-Control` 与版本号治理;避免陈旧资源污染。回退策略不支持 `URLPattern`:使用轻量路由库或正则封装,保持模板风格。测试清单多路径覆盖:用户与帖子详情、静态资源与 API 均匹配正确。离线与弱网:API 路由在断网场景离线缓存可用且可恢复。应用场景SPA 路由、SW 请求治理与缓存策略、BFF 层的路径匹配辅助。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部