[{"data":1,"prerenderedAt":394},["ShallowReactive",2],{"blog-font-display-swap-vs-optional":3,"blog-prev-font-display-swap-vs-optional":106,"blog-next-font-display-swap-vs-optional":283},{"id":4,"title":5,"author":6,"body":7,"canonical":90,"category":91,"cover":90,"date":92,"description":93,"draft":94,"extension":95,"keywords":90,"meta":96,"navigation":97,"noindex":94,"ogImage":90,"path":98,"seo":99,"seoDescription":90,"seoTitle":90,"stem":100,"tags":101,"updated":90,"__hash__":105},"blog\u002Fblog\u002Ffont-display-swap-vs-optional.md","font-display 选 swap 还是 optional，两周实测的数据","元析智能",{"type":8,"value":9,"toc":80},"minimark",[10,19,23,26,29,32,35,38,41,44,47,53,56,59,62,65,68,71,74,77],[11,12,13,14,18],"p",{},"font-display 选 swap 还是 optional，这事没有标准答案，但可以测。今年 2 月我们给两个站各跑了两周，结论是内容站选 optional，营销站选 swap 加 ",[15,16,17],"code",{},"size-adjust","，两者对留存的差别看不出来。",[20,21,22],"h2",{"id":22},"三种取值的实际差别",[11,24,25],{},"swap：文字立刻用回退字体渲染，自定义字体到了再换。好处是内容不会空白，坏处是切换时有一次视觉跳动，中文站比英文站明显。",[11,27,28],{},"optional：字体在极短时间内可用才用，超时就用回退字体直到下次访问。好处是几乎不跳动，坏处是首次访问的用户可能一直看到系统字体。",[11,30,31],{},"block：短暂隐藏文字等字体到位。这个基本别用，首屏文字空白三秒比字体丑更糟。",[20,33,34],{"id":34},"两周实测数据",[11,36,37],{},"站 A 是文档站，正文为主。swap 的 LCP P75 是 1.6 秒，optional 是 1.5 秒，差别很小，因为 h1 用哪个字体渲染出来都是最大元素。但 CLS 差别大：swap 是 0.09，optional 是 0.01。",[11,39,40],{},"站 B 是营销首页，大标题承担品牌感受。swap 的 LCP 是 1.9 秒，optional 是 2.3 秒。原因是大标题在 swap 下会被重绘，但至少先出现在首屏；optional 下首次访问看不到自定义字体，下一次访问才生效。CLS 方面 swap 是 0.14，optional 是 0.02。",[20,42,43],{"id":43},"我们的选择",[11,45,46],{},"内容站选 optional。文档、博客、术语表以阅读为主，字体视觉一致性没那么重要，稳定更重要。",[11,48,49,50,52],{},"营销站选 swap，但必须配两件事：字体文件 preload，回退字体加 ",[15,51,17],{}," 校准。这两件做完，swap 的 CLS 从 0.14 降到 0.03 左右。站 B 改完两周，真实数据稳定在 0.04。",[20,54,55],{"id":55},"一个反例",[11,57,58],{},"我见过一个站把所有字体都设成 block，理由是\"避免闪烁\"。结果移动端首屏空白 2.8 秒，用户以为网站挂了。这种做法在 2026 年没有任何理由。",[11,60,61],{},"还有人给所有字体都 preload，一次 preload 四个字体文件，等于把首屏带宽分给四个资源，LCP 反而更差。preload 只给首屏真正用到的那一个。",[20,63,64],{"id":64},"怎么自己测",[11,66,67],{},"不用搞复杂，两个页面、各跑两周，看 GSC 的真实数据就够。重点看两个数：LCP 的 P75 和 CLS 的 P75，别只看实验室。",[11,69,70],{},"如果两周内数据波动超过 20%，说明样本不够，需要更长时间或者更大的流量。这种时候别急着下结论，先看有没有其他改动混进来了。",[20,72,73],{"id":73},"落地时的两个细节",[11,75,76],{},"一是字体文件要和 CSS 在同一层 CDN 上，别一个在源站一个在 CDN，跨层回源会把收益吃掉。我们有个客户字体放在对象存储，没开缓存头，每次访问都要回源，改了缓存策略后 P75 从 700 毫秒降到 90 毫秒。",[11,78,79],{},"二是用 web vitals 的 JS 埋点看真实用户数据，别只看实验室。实验室环境是本地缓存加高速网络，测不出用户手机上的真实情况。我们现在的做法是每周拉一次真实用户数据，超过阈值就回看那次发布改了什么。",{"title":81,"searchDepth":82,"depth":82,"links":83},"",2,[84,85,86,87,88,89],{"id":22,"depth":82,"text":22},{"id":34,"depth":82,"text":34},{"id":43,"depth":82,"text":43},{"id":55,"depth":82,"text":55},{"id":64,"depth":82,"text":64},{"id":73,"depth":82,"text":73},null,"技术SEO","2026-03-05","两个站各跑两周：文档站用 optional，LCP 1.5 秒、CLS 0.01；营销站用 swap，LCP 1.9 秒、CLS 0.14，加上 preload 和 size-adjust 后 CLS 降到 0.03。",false,"md",{},true,"\u002Fblog\u002Ffont-display-swap-vs-optional",{"title":5,"description":93},"blog\u002Ffont-display-swap-vs-optional",[102,103,104],"font-display","CLS","字体加载","i91VTSe9rZjqFi8WpwD4uWU9JeBiHiOsWAGAcWVLP0g",{"id":107,"title":108,"author":6,"body":109,"canonical":90,"category":91,"cover":90,"date":272,"description":273,"draft":94,"extension":95,"keywords":90,"meta":274,"navigation":97,"noindex":94,"ogImage":90,"path":275,"seo":276,"seoDescription":90,"seoTitle":90,"stem":277,"tags":278,"updated":90,"__hash__":282},"blog\u002Fblog\u002Furl-parameter-governance.md","URL 参数治理：筛选、排序、追踪参数要分开处理",{"type":8,"value":110,"toc":264},[111,114,117,124,130,136,140,147,150,153,156,231,234,238,245,248,251,254,257,260],[11,112,113],{},"参数治理的关键是分类，不是统一 canonical。功能参数、追踪参数、变体参数的处理方式完全不同，混着来一定出问题。",[20,115,116],{"id":116},"三类参数",[11,118,119,123],{},[120,121,122],"strong",{},"功能型","：筛选、排序、分页。这类参数用户真的会用，蜘蛛也会抓。保留，但要给规则：列表页 canonical 指向不带参数的版本，分页页 canonical 自指（别指向第一页），有独立搜索价值的筛选组合才允许单独成页。",[11,125,126,129],{},[120,127,128],{},"追踪型","：utm 系列、gclid、fbclid、ref、source。对内容没有任何影响，是纯噪声。最优解是在链接生成环节就不加，其次是在服务器或 CDN 层 302 清洗到干净 URL。",[11,131,132,135],{},[120,133,134],{},"变体型","：版本、语言、打印版、移动版。这类本质上不是参数问题，是路径设计问题。已经用参数的做 301 收编到路径，新页面别再犯。",[20,137,139],{"id":138},"_2025-年-12-月那个数据工具站","2025 年 12 月那个数据工具站",[11,141,142,143,146],{},"站内导航链接全都自动带 ",[15,144,145],{},"?source=nav","，加上分享和投放链接，蜘蛛抓到了 3.4 万个带参数的 URL，GSC 里\"重复网页\"报了 2.1 万。客户的第一反应是加 canonical，但问题出在模板。",[11,148,149],{},"我们在模板里去掉 source 参数，nginx 上加一条规则 302 清洗 utm 和 gclid。三周后重复网页降到 4000，蜘蛛对产品页的抓取频次涨了 2.2 倍。",[20,151,152],{"id":152},"怎么查",[11,154,155],{},"日志里把 URL 的查询串提取出来，按参数名统计抓取次数：",[157,158,162],"pre",{"className":159,"code":160,"language":161,"meta":81,"style":81},"language-bash shiki shiki-themes github-light github-dark","grep \"Googlebot\" access.log | awk -F'?' '{print $2}' | cut -d'&' -f1 | sort | uniq -c | sort -rn\n","bash",[15,163,164],{"__ignoreMap":81},[165,166,169,173,177,180,184,187,191,194,197,199,202,205,208,211,213,216,218,221,224,226,228],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sScJk","grep",[165,174,176],{"class":175},"sZZnC"," \"Googlebot\"",[165,178,179],{"class":175}," access.log",[165,181,183],{"class":182},"szBVR"," |",[165,185,186],{"class":171}," awk",[165,188,190],{"class":189},"sj4cs"," -F",[165,192,193],{"class":175},"'?'",[165,195,196],{"class":175}," '{print $2}'",[165,198,183],{"class":182},[165,200,201],{"class":171}," cut",[165,203,204],{"class":189}," -d",[165,206,207],{"class":175},"'&'",[165,209,210],{"class":189}," -f1",[165,212,183],{"class":182},[165,214,215],{"class":171}," sort",[165,217,183],{"class":182},[165,219,220],{"class":171}," uniq",[165,222,223],{"class":189}," -c",[165,225,183],{"class":182},[165,227,215],{"class":171},[165,229,230],{"class":189}," -rn\n",[11,232,233],{},"排前面的参数就是治理重点。Screaming Frog 的 URL 参数报告能看站内链接里有多少带参数，这个数字比日志更能说明问题——站内链接是我们自己能控制的。",[20,235,237],{"id":236},"一个例外值得单独成页的筛选组合","一个例外：值得单独成页的筛选组合",[11,239,240,241,244],{},"不是所有筛选参数都该压掉。如果某个组合有稳定的搜索需求，比如\"北京 + 三年经验\"这类招聘筛选、\"100 人以下团队 + 项目协作\"这类软件筛选，单独做一个静态页比让参数页参与排名更好。判断标准是搜索量：GSC 里这类词每月有几十次展示，就值得做成 ",[15,242,243],{},"\u002Fsolutions\u002Fsmall-team"," 这样的路径页。",[11,246,247],{},"判断做不做，看两件事：这个词有没有独立搜索需求，页面内容能不能撑满 600 字。两个都满足就做成路径页，只有一个满足就留在参数里。",[20,249,250],{"id":250},"规则写在哪",[11,252,253],{},"优先级从高到低：模板生成规则 > 服务器 302 清洗 > canonical > robots 屏蔽。前面能解决的，不要留给后面。canonical 是声明不是限制，蜘蛛可以不遵守；robots 是屏蔽不是清理，被挡的 URL 仍然可能被索引。",[20,255,256],{"id":256},"立场",[11,258,259],{},"参数治理是工程问题，不是 SEO 问题。让前端改参数生成逻辑，比上线后加一百条规则都有效。做 SEO 的人要能跟开发说清楚\"这条链接为什么不能带这个参数\"。",[261,262,263],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":81,"searchDepth":82,"depth":82,"links":265},[266,267,268,269,270,271],{"id":116,"depth":82,"text":116},{"id":138,"depth":82,"text":139},{"id":152,"depth":82,"text":152},{"id":236,"depth":82,"text":237},{"id":250,"depth":82,"text":250},{"id":256,"depth":82,"text":256},"2026-03-04","三种参数混在一起治理，是软件站重复内容的源头。我们把参数分三类，给每类定规则：哪些进 canonical、哪些交给服务器清洗、哪些在链接生成时就掐掉。",{},"\u002Fblog\u002Furl-parameter-governance",{"title":108,"description":273},"blog\u002Furl-parameter-governance",[279,280,281],"URL参数","重复内容","canonical","FGb6TFLxOPkM6K52CqiVecaxcw_sCYqynHPYdFtg-HA",{"id":284,"title":285,"author":6,"body":286,"canonical":90,"category":91,"cover":90,"date":383,"description":384,"draft":94,"extension":95,"keywords":90,"meta":385,"navigation":97,"noindex":94,"ogImage":90,"path":386,"seo":387,"seoDescription":90,"seoTitle":90,"stem":388,"tags":389,"updated":90,"__hash__":393},"blog\u002Fblog\u002Fdelete-post-301-or-410.md","删掉的文章该 301 还是 410，我们的判断只有三条",{"type":8,"value":287,"toc":373},[288,291,295,298,301,305,308,311,315,318,321,324,327,330,333,336,339,342,345,348,352,355,358,361,364,367,370],[11,289,290],{},"删文章的时候，301 和 410 的选择比大多数人想的更有讲究。我们的判断只有三条：这个页面上有没有外链、有没有排名、有没有历史流量。三条都是否，才走 410，其余一律 301。",[20,292,294],{"id":293},"_410-适合什么页面","410 适合什么页面",[11,296,297],{},"从来没被收录、从来没曝光、没有任何外链、内容本身没有价值的页面。测试页、空标签页、批量生成的垃圾页，这类走 410。",[11,299,300],{},"410 的意思是“永久删除，别再来了”。它比 404 更明确，爬虫放弃得更快。",[20,302,304],{"id":303},"_301-适合什么页面","301 适合什么页面",[11,306,307],{},"有外链的，有排名的，有过流量的，被外部引用过的。哪怕现在没流量，只要有一个外链，就 301。",[11,309,310],{},"2025 年那次审计，88 篇里只有 12 篇走了 410，剩下 76 篇都 301 到最相关的一篇。判断标准就是这个。",[20,312,314],{"id":313},"_301-指向哪","301 指向哪",[11,316,317],{},"指向内容最接近的那篇，不是首页，不是分类页。",[11,319,320],{},"实在找不到相关页面的，指向同主题的支柱页。全站指向首页的做法，等于把一堆不相干的权重混在一起，搜索引擎会给这种改法打折。",[20,322,323],{"id":323},"别一次性批量删",[11,325,326],{},"我们按批次删，每批 20 篇以内，隔两周看一次抓取和收录。",[11,328,329],{},"一次性删 80 篇，日志里会出现一大批 404，抓取预算会被这些错误占掉。2024 年有个客户这么干过，收录恢复花了两个多月。",[20,331,332],{"id":332},"删之前做三件事",[11,334,335],{},"导出 URL 清单。查每个 URL 的外链数。在搜索后台提交移除请求，加速下架。",[11,337,338],{},"这三件事做完再动手，顺序反了容易漏掉有外链的页面。",[20,340,341],{"id":341},"一个我们踩过的坑",[11,343,344],{},"2025 年 8 月，我们把一个 410 用在了有 3 个外链的页面上。当时判断是“内容没用”，忽略了外链。",[11,346,347],{},"两个月后客户发现有个行业目录站还在链那个地址，权重全落空。后来补了 301，但延迟已经造成了。",[20,349,351],{"id":350},"_404-和-410-的实际差别","404 和 410 的实际差别",[11,353,354],{},"对搜索引擎来说，两者都表示页面不存在。410 更明确，一般下架更快；404 会被反复重试，有时候要几周才彻底移除。",[11,356,357],{},"但对用户来说，410 和 404 长得一样。所以这个选择的技术意义大于体验意义，别在这上面纠结太久。",[20,359,360],{"id":360},"一个可以偷懒的做法",[11,362,363],{},"拿不准的时候，用 301。301 至少有把权重转给别的页面的机会，410 什么都没有。",[11,365,366],{},"我们内部有个更简单的判断：如果这篇内容在退订邮件、销售资料、渠道目录里可能被提到过，就别用 410。链接一旦出现在别人的文档里，你就控制不了它什么时候生效。",[11,368,369],{},"我们给客户删页面时的默认选项就是 301，只有确认边缘价值为零，才改成 410。",[11,371,372],{},"应该是：先查外链，再判断内容价值，最后决定 301 还是 410。",{"title":81,"searchDepth":82,"depth":82,"links":374},[375,376,377,378,379,380,381,382],{"id":293,"depth":82,"text":294},{"id":303,"depth":82,"text":304},{"id":313,"depth":82,"text":314},{"id":323,"depth":82,"text":323},{"id":332,"depth":82,"text":332},{"id":341,"depth":82,"text":341},{"id":350,"depth":82,"text":351},{"id":360,"depth":82,"text":360},"2026-03-06","2025 年我们给客户删了 88 篇文章，其中只有 12 篇走 410，其余全部 301。判断依据就三条：有没有外链、有没有排名、有没有历史流量。判断错了就是白丢权重。",{},"\u002Fblog\u002Fdelete-post-301-or-410",{"title":285,"description":384},"blog\u002Fdelete-post-301-or-410",[390,391,392],"删除页面","301重定向","内容审计","ZPRFj_HA8gjqu4Wl_HHu11YwU3l-mQ7paseRzo43nMs",1794088107858]