MPA架构下的SEO与首屏加载优化实战策略
两三年前我接手过一个电商项目技术栈是传统的服务端渲染加模板引擎页面总数超过一百个也就是一个典型的MPAMulti-Page Application。当时团队里正好有同事在推进“首页改造成SPA”的方案理由是“用户交互更顺滑”。但我在评估了一圈之后反而把方案方向扳回了MPA的深水区把SEO和首屏加载当成两个核心指标来做深做透。原因很简单这类内容型、流量型业务搜索引擎的自然流量占比超过四成而首屏加载时间每慢一秒跳出率就要翻一个台阶。MPA天然的服务端直出特点在SEO这件事上就是比SPA省心真正难啃的是首屏加载。这篇文章不打算做泛泛的概念科普我直接把当时踩过的坑、验证过的手段、量化出来的数据变化整理成一套可以照抄的策略与实践。全文会按照“设计思路 - 核心细节 - 实操过程 - 问题排查”这条线来展开所有内容都来自真实项目参数和步骤都保留到可直接复用的程度。1. 内容整体设计与思路拆解1.1 MPA为什么在SEO这件事上天然占优先说清楚一个基础认知MPA和SPA最本质的区别在于页面交付方式。MPA每一个页面都是独立的HTML文档用户请求一个URL服务端直接把渲染好的完整HTML返回给浏览器。而SPA通常只有一个HTML壳子剩下的内容全靠JavaScript在浏览器里动态生成。搜索引擎爬虫虽然这些年进步不小但对JavaScript的解析能力依然有限尤其是在抓取深度和渲染等待时间上都有严格限制。一个页面如果依赖好几个异步接口才能拼出关键内容爬虫很可能等不到数据返回就放弃抓取了。相比之下MPA的HTML里直接躺着完整的标题、描述、正文、内链爬虫只需一次请求就能读走所有关键信息这是结构上的天然优势。还有一个容易被忽略的点MPA每个页面可以独立设置独一无二的title、meta description、canonical标签这在SPA里往往要额外借助预渲染或服务端快照才能做到位。对于电商站、资讯站这类需要大量长尾关键词覆盖的场景MPA的这个特性极其值钱。我当时做过的数据对比是同样的关键词库MPA页面收录率可以做到85%以上而之前用SPA实验的那些页面收录率勉强到40%。1.2 首屏加载的瓶颈究竟在哪里MPA的问题也很突出首屏加载通常比SPA更难优化。SPA首次加载后切换路由只是局部更新而MPA每次跳转都是一次全新的文档加载。这意味着每一张页面都要重新请求HTML、重新解析CSS、重新执行JS任何公共资源处理不好都会在每个页面上重复产生开销。我把当时观测到的首屏瓶颈归纳为四个层面网络层每个页面都要串行请求HTML、CSS、JS、图片、字体尤其是字体文件动辄几百KB阻塞渲染路径。渲染层CSS文件如果拆得太零碎浏览器需要下载并解析完所有样式表才会开始绘制页面带来白屏时间。执行层公共JS在大页面里被反复加载和执行特别是依赖jQuery和各类插件的传统项目脚本执行本身就能拖慢首屏。资源层图片不加懒加载和尺寸约束首屏外的图片也一起加载直接吃光带宽。1.3 为什么“SEO优化”和“首屏加载”必须放在一起看很多团队的思维是分开处理SEO归SEO性能归性能。但实际操作中这两个指标会互相拉扯典型的矛盾是为了SEO需要直出完整HTML和服务端渲染导致首屏HTML体积偏大加载变慢反过来为了首屏速度把内容改成客户端异步渲染SEO又崩了。所以必须把两件事绑定成一套整体方案来处理。核心思路是HTML直出的内容坚决保留但直出的数据要精简所有非关键逻辑全部挪到异步或延迟阶段。换句话说爬虫能看到完整内容而真实用户能更快看到页面。这个平衡点就是整套优化策略的设计中心。2. 核心细节解析与实操要点2.1 模板继承与公共片段抽取MPA项目最忌讳的事情是每一个页面复制一份公共的头部、导航、底部代码。我当时接手的那套系统就是典型的复制粘贴式开发头部导航在每个页面的模板里都有一份完整的HTML改一处要全量同步几十个文件这种结构的性能问题和维护成本都非常可怕。正确的做法是使用模板继承机制。以我当时用的Node.js Nunjucks模板引擎为例基础布局文件layout.html只定义页面骨架所有公共模块头部、导航、底部、统计脚本都在布局里加载子页面只需要填充content区域的内容。这样公共资源的引用关系是收敛的后续做公共资源合并、加缓存版本号、抽离关键CSS都只需要改一个地方。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title{% block title %}默认标题{% endblock %}/title meta namedescription content{% block description %}默认描述{% endblock %} {% block head_extend %}{% endblock %} /head body {% include widgets/header.html %} main classmain-container {% block content %}{% endblock %} /main {% include widgets/footer.html %} {% block foot_script %}{% endblock %} /body /html这样做还有一层额外的价值SEO层面的结构化数据比如面包屑导航、商品评分、FAQ标记都可以作为模板片段注入到对应区域。页面上每个逻辑模块都是组件化的搜索引擎也能更清晰地理解页面结构。2.2 资源合并策略数量与体积的权衡HTTP/1.1时代浏览器对同一域名的并发连接数限制在6个左右所以文件合并是硬需求。到了HTTP/2时代多路复用让并发请求不再是瓶颈文件的合并策略就需要重新思考了。我当时整个项目从HTTP/1.1升级到HTTP/2之后重新测了一轮首屏性能。全量合并成一个vendor.js的做法反而变慢了因为这会强制浏览器在拿到主页面之后必须下载一个动辄几百KB的大文件哪怕用户只是来浏览一个简单的文章页。而拆成几十个小文件在HTTP/2的并发机制下反而能更早地执行到页面真正需要的代码。实操下来最终采用的是三层拆分策略第一层critical.js首屏交互必须要用的逻辑比如导航菜单的展开收起、首屏轮播直接内联或同步加载。第二层vendor-core.js几乎所有页面都会用到的公共库合并成一个文件加长效缓存。第三层page-specific.js每个页面各自的业务逻辑按页面单独加载不强求合并。这种“抓大放小”的资源拆分方式配合HTTP/2的多路复用平均网络等待时间比之前混成一堆文件时下降了三成左右。2.3 关键CSS内联绕过渲染阻塞的最短路径渲染阻塞是首屏性能的隐形杀手。浏览器遇到CSS文件时会停止解析HTML等CSS下载解析完成后才继续。这就意味着如果页面引用的样式文件太多或单个文件太大用户看到的白屏时间就会拉长。关键CSS内联的思路很简单把首屏渲染所必需的样式直接以内联style标签的形式放进HTML的head区域避免额外的网络请求。非关键的样式比如页脚样式、弹窗样式则用非阻塞方式加载function loadCSS(href) { const link document.createElement(link); link.rel stylesheet; link.href href; document.head.appendChild(link); }这里有两点值得特别注意。第一内联的CSS写死之后改样式就要重新发布所有引用它的页面否则会留下新旧不一致的坑我当时专门加了一个“关键样式版本号”自动注入机制。第二关键CSS不是随便把原来的完整CSS全量内联那样HTML体积反而膨胀必须通过工具分析首屏依赖的样式规则之后生成一个精简子集。我用的工具是Penthouse和Critical打包构建时自动完成抽取和内联稳定跑了很久没出过问题。我自己在实践中的一个心得是关键CSS的内联范围宁小勿大。只覆盖首屏可视区真正用到的布局、颜色、字体像列表页下方的瀑布流、详情页底部的推荐模块都不用管这些区域晚几百毫秒出样式用户根本感知不到。2.4 脚本延迟加载与执行时机控制JS脚本默认是同步解析执行的也就是说浏览器遇到script标签时必须停下HTML解析先去下载并执行JS执行完才能继续。这意味着无脑在head或body顶部放一堆脚本会直接拉长首屏可交互时间。我的处理原则是分级控制完全不需要参与首屏渲染的脚本全部加defer属性让它们在文档解析完成后按顺序执行。只用在特定交互事件里的脚本加async属性让它们下载和执行都不阻塞解析。根本不需要在页面加载阶段执行的脚本比如埋点统计、客服组件直接延迟到用户空闲时动态注入。Defer和Async的区别是很多人搞不清楚的地方。Defer保证脚本按顺序执行适合有依赖关系的场景Async则是谁先下载完谁先执行适合完全独立、互不依赖的脚本。当时项目里的百度统计、CNZZ统计脚本都是延迟到onload之后才加载的对首屏没有任何阻塞作用。但延迟加载也不是没有代价最大的坑就是交互延迟。有些按钮绑定的事件依赖于延迟脚本用户快速点击时事件还没挂载上。这个问题的解法是把交互逻辑复制一份到内联脚本里保证用户能立刻响应统计脚本延迟加载则不影响功能。3. 实操过程与核心环节实现3.1 一套可复用的MPA性能基线分析流程拿到一个MPA项目不要急着动手优化先把现状量化出来。我当时的流程是先用Lighthouse对三类页面分别跑一遍首页、列表页、详情页。每类页面至少跑五轮取中位数重点记录First Contentful Paint、Largest Contentful Paint、Time to Interactive三个指标。同时用浏览器Performance面板录制一次完整的页面加载过程看水图里网络请求的瀑布流。重点找两类问题一是长条的TTFBTime To First Byte时间说明后端渲染慢二是密集的串行请求块说明资源加载路径没有利用好浏览器的并行机制。慢的话建议用WebPageTest加一次三网环境的测试拿不同地域的数据做对比。这个步骤的价值在建立基线优化完成后要用同一个基线再测一遍数据才具备可比性。3.2 服务端直出中的数据精简与缓存策略MPA服务端直出时HTML里经常存在大量冗余数据。最常见的就是商品列表页服务端把每件商品的完整信息都塞进HTML包括用户根本看不到的内部字段、折扣计算中间变量、日志追踪信息。这些数据对爬虫没意义对用户又形成体积负担。实操上我做过一次彻底的模板数据清理原则是“一切非展示数据一律从直出模板中移除”。需要后续异步请求接口的数据只保留必要的ID集合其他都由JS按需拉取。做这个动作之前淘宝商品列表页的HTML大约是180KB清理之后压缩到70KB左右这一项直接让TTI指标提升了20%以上。另外可以利用缓存机制把纯静态的壳子部分和动态数据部分分开缓存。公共头部、公共底部、导航栏属于静态部分可以生成静态片段交给CDN缓存页面数据则按商品ID或类目维度做对象级缓存。后端TTFB从300多毫秒降到了100毫秒以内这个优化在省际网络环境下体感尤其明显。3.3 Nginx层的一次完整配置调优服务端配置这里很多MPA项目的性能问题其实出在Nginx这一层。我先贴一份当时优化后的关键配置片段server { listen 80; server_name example.com; gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 5; gzip_types text/plain text/css text/javascript application/javascript application/json image/svgxml; location ~* \.(css|js)$ { expires 30d; add_header Cache-Control public, immutable; } location ~* \.(png|jpg|jpeg|webp|gif|ico)$ { expires 7d; add_header Cache-Control public; } location ~* \.(woff|woff2|ttf|eot)$ { expires 30d; add_header Cache-Control public, immutable; } }首屏优化里gzip的作用经常被低估。没有开启gzip时一个40KB的CSS文件传输体积就是40KB开启后压缩到8到9KB网络传输时间直接少掉七成。压缩级别5是我在压缩比和CPU开销之间反复测下来的甜点值太高的级别并不会让体积再小多少反而会增加服务器的CPU压力。还有一个容易被忽略的细节Cache-Control里的immutable标志表示资源内容永久不变浏览器可以直接使用本地缓存连重新验证都不需要。这个标志一定要配合内容哈希命名的文件不然发布新版本后用户还会用旧缓存排错时白白折腾半天。3.4 首屏图片与字体的现场优化记录图片是MPA首屏性能的大头我当时做了一个决定性动作所有首屏图片都加上明确的宽高属性并在HTML里用CSS控制最大展示尺寸同时接入懒加载库实现可视区外的图片延迟加载。这里有个关键点懒加载的图片一定要使用IntersectionObserver实现而不是滚动监听计算offsetTop的老方案。老方案在滚动时会频繁触发性能问题新方案里浏览器自己管理观察时机实测性能开销低得多。字体加载当时也花了不少功夫。项目用了自定义字体靠font-face引用woff2文件一个常规字重加一个粗体500KB起步。早期实现是同步加载首屏会被严重的FOITFlash Of Invisible Text时间拖累文字在字体加载完成前不可见白屏感极强。换成了font-display: swap策略之后浏览器会先用系统字体显示文本自定义字体加载完成后自动替换视觉上不再出现空白。实测首屏可读时间提升了30%以上。同时进一步优化字体体积的话可用unicode-range按需加载汉字子集。中文字体文件巨大但每个页面需要的字符可能只有几十个按页面所需的字符集合去切片加载理论上可以把字体体积压缩到原来的十分之一。我当时的做法是先用字体工具做子集化只保留站点实际会用到的常用汉字配合unicode-range让浏览器按需请求对应切片的字体文件。4. 常见问题与排查技巧实录4.1 首屏白屏时间过长且Lighthouse性能分和实际体验不符这类问题通常发生在引入关键CSS内联之后。Lighthouse测出来的FCP指标很好看但用户反馈打开页面时白屏时间反而变长了。我排查过之后发现原因在于内联关键CSS后页面确实在一开始就有样式了但关键CSS只覆盖首屏而首屏往下滚一屏就会看到裸奔的HTML结构用户自然觉得页面坏掉了。解决方案是重新梳理“关键CSS”的判定标准。我的心法是不是以首屏为界而是把首屏再多算一屏到两屏把用户最容易感知到的范围先覆盖住。非关键样式继续用异步加载保证完整样式表在用户滚动到达之前就加载完毕。实际感受是FCP数据会稍微变慢一点点但真实用户的满意度明显提升。4.2 页面JS总是重复执行每开一个新页面就多一次内存泄漏MPA里几乎每一个页面都会加载同一个公共JS文件如果公共JS里有初始化轮询、全局事件绑定这类代码每打开一个新页面就多一份实例用户一路逛下去内存占用会越来越高页面越来越卡最后只能刷新解决。排查的突破口是Performance面板的Memory时间线如果看到锯齿状的持续上升曲线十有八九是全局脚本反复注册事件导致的。解决思路分两层一是公共JS里不要直接注册监听器而是用一个初始化管理器检查当前页面是否已经初始化过重复加载时直接跳过二是不必要在页面跳转时反复创建的实例尽量用单例模式。另外浏览器后退缓存是MPA首屏体验的一把双刃剑。开启bfcache后用户从详情页返回列表页时可以瞬间从缓存恢复这是真实场景里的隐性指标。为了不破坏它我建议不要在页面里注册beforeunload事件不要用unload事件清理资源这些操作会把bfcache直接禁用得不偿失。4.3 第三方脚本总会抢占主线程把首屏交互卡死MPA项目里通常会接入一堆第三方脚本在线客服、用户行为分析、AB测试、广告联盟代码。这些脚本往往没有经过性能优化而且又是同步执行在主线程上抢占大量时间用户点击按钮后可能要等上几秒才有反应。我的处理思路是建立一个第三方脚本优先级清单把脚本分为核心业务依赖和可异步化两类。可异步化的脚本全部移到页面load事件的回调里动态创建window.addEventListener(load, function() { loadScript(/assets/js/customer-service.js); loadScript(/assets/js/analytics.js); });这个方法实践下来对首屏交互时间的改善效果非常明显。而且第三方脚本一般彼此独立不会依赖页面上其他JS的加载时机所以延迟加载并不会造成功能缺失。4.4 改动后线上缓存不生效一直在排查旧文件这个问题十有八九是文件名没有做内容哈希导致的。部署新版本后文件版本号没有变化浏览器和CDN都还在用旧缓存。解决方法是构建时给每个静态资源文件名加上hash指纹例如app-8f3d7a2e.js内容变了哈希就会变浏览器自然会把旧缓存作废。还要检查CDN的缓存规则是否配置正确。我当时遇到过CDN静态文件缓存时间设置太长但源站文件已经更新的情况。排查之后确认CDN回源时没有做文件变更检测而本地验证容易被本地缓存误导以为线上没更新。正确做法是在Nginx层对带hash的静态文件开启immutable缓存对不带hash的文件设置较短的Cache-Control比如no-cache让浏览器每次重新验证这样既能享受缓存提速又不会出现发布不生效的诡异问题。写在最后MPA的SEO优化和首屏加载优化本质上是一个系统工程拆开来看每一步都有成熟的手段难的是组合起来不打乱仗。我在这个项目里最深的体会是所有优化动作都必须先量化再行动把每次改动前后的数据记录下来才能知道哪些手段在这个项目里是真正有效的哪些是无效投资。我最想分享的一个小技巧是在做完一轮优化之后不要只盯着Lighthouse分数一定要用弱网环境模拟真实场景再测一遍。因为我多次发现实验室环境下的优异指标到了真实低网速场景里表现完全是另一回事。首屏优化这件事用户感受才是唯一正确答案。后来那套系统在收录率、搜索权重和首屏速度上都拿到了不错的成绩最让我满意的是没有牺牲掉前端的可维护性。这也是这篇内容想要传递的核心理念好性能不必然以复杂度为代价只要理清策略和数据每一步的控制都完全不需要猜。

相关新闻

Windows用户权限设置实战:从最小权限到服务提权

Windows用户权限设置实战:从最小权限到服务提权

简介:本资源是一份面向Windows系统管理员与IT运维初学者的用户权限管理实务指南,聚焦操作系统级安全配置核心问题。文档以简明步骤结合组权限原理,详解Administrators、Power Users、Users、Guests及SYSTEM等关键用户组的默认权限边界、适用场…

2026/10/9 3:37:16 阅读更多 →
TensorFlow 2.0与Keras深度学习实战:从环境配置到模型调优

TensorFlow 2.0与Keras深度学习实战:从环境配置到模型调优

1. 从零开始:为什么我推荐TensorFlow 2.0/Keras作为深度学习入门首选先亮个观点:深度学习入门这几年我反复带过不少朋友,也帮人排过无数环境坑,如果让我只推荐一条最省心的路线,那一定是Python加TensorFlow 2.0加Keras…

2026/10/9 3:37:16 阅读更多 →
硅基流动+Chatbox:零运维AI应用落地方案

硅基流动+Chatbox:零运维AI应用落地方案

简介:本资源是一份面向初级开发者与个人AI实践者的低成本大模型应用搭建指南,聚焦如何利用硅基流动平台的DeepSeek API与开源跨平台AI助手Chatbox,构建稳定、免费且响应流畅的本地化AI应用。方案兼顾经济性与实用性,特别适合个人研…

2026/10/9 3:36:15 阅读更多 →

最新新闻

HARA与风险评估方法

HARA与风险评估方法

EPS electronic power steering, 电子助力转向系统 发现了问题,下面就要制定措施 内容来源 : https://www.bilibili.com/video/BV1GdeQ6xEHi?spm_id_from333.788.videopod.sections&vd_source473185c2a7a9b79ef8fcea7dce5ca501

2026/10/9 5:34:40 阅读更多 →
AI应用安全防线:从提示注入到Agent攻防的纵深防御指南

AI应用安全防线:从提示注入到Agent攻防的纵深防御指南

上个月帮一个做企业内部知识库问答的团队做AI应用开发安全评审,聊到一半,团队负责人问了我一个问题:"我们的Agent已经接了20多个外部工具,如果检索到的某份文档里藏着恶意指令,Agent会不会照着执行?&q…

2026/10/9 5:34:40 阅读更多 →
WALL-OSS 模型详解

WALL-OSS 模型详解

WALL 模型详解 WALL (本项目) 基本信息 项目 内容 全称 WALL Series Foundation Model 机构 开源项目 架构 Transformer + Flow Matching 动作类型 连续动作 训练方式 模仿学习 (Flow Matching) 模型架构图 输入图像(三视角) ├── faceImg (正面相机) ├…

2026/10/9 5:34:40 阅读更多 →
第二章:1、Embedding与向量数据库

第二章:1、Embedding与向量数据库

一、Embedding 原理详解1. 什么是 Embedding?定义:将一段文本转换为 float[] 数组(如1536个浮点数),这个数组即为文本的“语义指纹”。类比:如同每个人有独一无二的指纹,每段文本也有独特的向量…

2026/10/9 5:34:40 阅读更多 →
品牌档位约束的Prompt条件生成:低端/中端/高端话术模板与错配检测

品牌档位约束的Prompt条件生成:低端/中端/高端话术模板与错配检测

一、问题定义 LLM生成slogan默认输出“中庸档”表达——功能与情绪各占一半的通用句式。但品牌实践存在明确的档位规律: 低端品牌:直接给好处(多、快、好、省); 中端品牌:不卖产品,卖向往&#…

2026/10/9 5:34:40 阅读更多 →
基于微信小程序的智能拍卖系统设计与实现复盘

基于微信小程序的智能拍卖系统设计与实现复盘

去年做毕业设计选题时,我在几个平台搜了一圈"智能拍卖小程序",下载过好几个标着"完整源码文档"的压缩包。解压之后发现问题都差不多:要么是几年前的老项目,登录接口还是旧版wx.getUserInfo,要么核…

2026/10/9 5:33:39 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →