ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

wp-calypso 路由工具库详解:normalize 中间件与 addQueryArgs 的参数化实现

wp-calypso 路由工具库详解:normalize 中间件与 addQueryArgs 的参数化实现 前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载在 WordPress.com 的前端仓库 wp-calypso 中URL 的规范化与查询参数拼装是贯穿路由系统的底层能力。本文以client/lib/route模块的文档为主线逐条拆解其对外导出的工具函数如何把带尾斜杠的路径重定向到规范 URLnormalize中间件以及如何向任意 URL 安全地追加查询参数addQueryArgs并结合 源码实现 与 测试用例 说明每个函数的边界条件与底层调用链帮助你读懂并复用这套路由工具。模块总览calypso/lib/route导出了什么模块文档见 client/lib/route/README.md。从 client/lib/route/index.ts 的导出声明可以确认代码中import ... from calypso/lib/route实际指向client/lib/route目录该入口共暴露五组能力导出项来源作用normalizenormalize.ts路由中间件把以/结尾的路径重定向到无尾斜杠的规范路径trailingslashittrailingslashit.ts确保路径以单个/结尾untrailingslashituntrailingslashit.ts去掉路径末尾的/addQueryArgsclient/lib/url/add-query-args.ts向 URL 追加查询参数* from ./pathpath.ts站点片段site fragment解析、section 路径计算等辅助函数下面按文档的两个核心章节展开。normalize把/foo/重定向到/foo文档给出的用法文档client/lib/route/README.md指出当你希望强制某个资源的规范 URL 时可以把normalize作为中间件挂到路由上让任何以/结尾的路径名被重定向到去掉/之后的同一路径。例如把/foo/重定向到/fooimport { normalize } from calypso/lib/route; page( /foo/?, normalize, displayFoo );如果希望对所有路由统一执行该行为可以用通配路由import { normalize } from calypso/lib/route; page( *, normalize );文档还提到如果你想要不同的行为、或者希望对重定向过程有更多控制可以单独使用untrailingslashit和redirect自行组合。源码中的实现细节client/lib/route/normalize.ts 只有十几行但有两个关键设计值得注意const normalize: Callback ( context, next ) { const normalizedPathName untrailingslashit( context.pathname ); if ( normalizedPathName ! context.pathname ) { page.redirect( appendQueryString( normalizedPathName, context.querystring ) ); } else { next(); } };只对 pathname 做判断不碰 query 与 hash中间件从context.pathname读取路径用untrailingslashit去除尾斜杠后再与原始pathname比较仅在两者不一致时才触发page.redirect否则调用next()放行。重定向时保留查询串内部的appendQueryStringnormalize.ts会把context.querystring以?xxx形式拼回新路径。也就是说/foo/?a1会被重定向为/foo?a1而不是/foo避免重定向丢失搜索条件。page来自automattic/calypso-router见 normalize.ts 的 import它是本仓库对页面路由page.js 风格 API的封装所以normalize是一个标准的( context, next )中间件签名可以直接插在任意page()路由的中间件链中。底层的两个字符串原语normalize依赖的untrailingslashit实现非常克制untrailingslashit.tsexport default ( path: string ): string ( path / ? path : path.replace( /\/$/, ) );根路径/被显式保留不会被去尾斜杠变成空字符串——这是规范 URL 语义下唯一必须保留斜杠的位置其余路径仅匹配末尾一个/并移除/foo/bar原样返回。与之对称的 trailingslashit.ts 则是export default ( path: string ): string path.replace( /(\/)?$/, / );(?:/)?$匹配末尾的零个或一个斜杠统一替换成/因此无论输入是/foo、/foo/还是/foo//之外的形态输出都以恰好一个/结尾。两者构成 Calypso 中路径规范化的最小工具对path.ts 中的sectionify、getStatsDefaultSitePage等函数也大量复用了它们。addQueryArgs向 URL 追加查询参数文档给出的参数与示例文档client/lib/route/README.md将该函数定位为简化向 URL 添加查询参数的工作参数约定如下argsobject必填——要添加到 URL 上的查询参数对象urlstring必填——待追加参数的原始 URL。示例import { addQueryArgs } from calypso/lib/route; addQueryArgs( { foo: bar }, https://wordpress.com ); // https://wordpress.com?foobar addQueryArgs( { foo: bar }, https://wordpress.com?searchtest ); // https://wordpress.com/?searchtestfoobar源码中的健壮性设计addQueryArgs并不在client/lib/route目录内实现而是从 client/lib/url/add-query-args.ts 转出见 client/lib/route/index.ts。阅读实现可以发现它比简单拼?kv多了三层防护入参校验add-query-args.tsargs必须是对象、url必须是字符串且通过determineUrlType来自automattic/calypso-url包判定为合法 URL否则直接抛出带明确信息的Error。这比静默返回坏 URL 更利于在开发期暴露调用错误。过滤空值参数args pickBy( args, ( arg ) arg ! null )L28会剔除undefined/null的参数键避免生成?fooundefined这类噪音。按 URL 类型格式化输出绝对 URL、协议相对 URL 等不同形态会经format( parsed, urlType )还原为与输入一致的样式查询参数通过URLSearchParams的set写入因此同名参数是覆盖而非追加。一个容易踩坑的分支是路径相对 URL的特殊处理add-query-args.ts源码注释解释了../foo?barbaz这类带路径穿越的相对 URL 若交给new URL(url, base)解析穿越段会丢失因此对URL_TYPE.PATH_RELATIVE不走 URL 对象改写而是直接在原字符串上做search/hash的替换拼接。这一分支保证了即使传入../foo#anchor这样的 URL父目录信息与锚点都能保留。相关行为有专项测试覆盖可参考 client/lib/url/test/add-query-args.js整个client/lib/route模块的测试包括getSiteFragment对各编辑器/列表/结算路径的解析断言位于 client/lib/route/test/index.js。同一模块里的路径辅助函数文档主线是normalize与addQueryArgs但 index.ts 的export * from ./path还向外暴露了一组围绕站点片段的路径辅助函数实际调用方编辑器、统计页等经常与normalize配合使用了解它们有助于理解整个模块的职责边界getSiteFragment( path )path.ts从路径中解析出站点 slug 或站点 ID。它只在 URL 的倒数第一、二位编辑器场景下末位是文章 ID以及/me/purchases/、/checkout/thank-you/等例外路径的特定位置查找并且区分了两种标识含.的片段按 slug 处理Jetpack 站点 slug 允许以::结尾并会被剥掉纯数字片段按站点 ID 处理且必须通过Number.isSafeInteger校验——测试中/edit/jetpack-portfolio/1000000000000000000000/new返回false正是对超安全整数上限的断言见 test/index.js。addSiteFragment( path, site )path.ts按路由风格插入站点片段——/post、/page、/edit前缀的路径分别插到第 2 或第 3 段编辑器风格/edit/:cpt/:site其余路径直接追加到末尾。sectionify( path, siteFragment? )path.ts从路径中剥掉站点片段、还原出section 路径。第二个参数允许调用方显式传入已知的片段例如从context.params.site拿到的值仅在未提供时才回退到getSiteFragment推断。统计页路径getStatsDefaultSitePage与getStatsPathForTabpath.ts基于模块内部的statsLocationsByTab映射day/week/month/year/insights/googleMyBusiness生成/stats/tab/:site形式的规范路径且同样用untrailingslashit收尾与normalize的规范 URL 语义保持一致。此外同目录的 legacy-routes.ts 提供了isLegacyRoute用match/noMatch正则加可选谓词判定一条路径是否属于Calypso 应忽略、交由浏览器整页重载的遗留路由如*.php、/manage、/plans等。它不属于本文档 README 的讲解范围但同属处理路由变化的工具集排查路由 404 或意外重载时值得查阅。小结与延伸阅读规范化 URL 用normalize中间件挂到具体路由或page( * )通配路由上需要自定义重定向逻辑时用untrailingslashit/trailingslashit与redirect自行组合。拼接查询参数统一走addQueryArgs它自带参数校验、空值过滤与路径相对 URL 的安全处理避免手写字符串拼接。站点相关路径slug/ID 提取、插入、section 还原由path.ts中的getSiteFragment/addSiteFragment/sectionify承担测试覆盖了编辑器、列表与结算等典型路径形态。关键文件索引模块文档client/lib/route/README.md模块入口与导出client/lib/route/index.tsnormalize 中间件client/lib/route/normalize.ts斜杠原语trailingslashit.ts、untrailingslashit.tsaddQueryArgs 实现与测试client/lib/url/add-query-args.ts、client/lib/url/test/add-query-args.js路径辅助函数client/lib/route/path.ts、测试 client/lib/route/test/index.js赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐wp-calypso 的 BackButton 组件设计、使用与源码实现详解wp calypso 的 BackButton 组件设计、使用与源码实现详解 导读 本文聚焦 wp calypso 中一个轻量但高频使用的 UI 组件—— B前端CMSwp-calypso 数据查询组件详解QueryJetpackScanHistory 与 Jetpack Scan History 请求链路wp calypso 数据查询组件详解QueryJetpackScanHistory 与 Jetpack Scan History 请求链路 QueryJet前端CMSwp-calypso同构路由实战一套路由定义前后端通用的完整实现教程wp calypso同构路由实战一套路由定义前后端通用的完整实现教程 wp calypso 是 WordPress.com 的 JavaScript 前端与前端CMS上一篇tsParticles Destroy 外部交互插件配置、源码实现与集成实战下一篇IDE Eval Resetter管理开发工具评估周期的开源学习助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表