没有不值得去解决的问题,也没有不值得去学习的技术!

标签: SPA

  • A Tour of Go 的广告优化在方案 B 与 103 页 Prerender 上线后,又进入了一轮真正的生产稳定性收尾。本文按时间线记录了从方案 A 因复杂 DOM 监听与操作而出现难以稳定复现的问题,到方案 B 改用 Angular course view 生命周期管理广告,再到 Prerender、Angular、CodeMirror 交接过程中出现短暂源码空白,以及真实 AdSense 写入 height: auto !important、min-height: 0px !important 导致课程高度塌缩和 footer 提前进入第一屏的完整过程。最终没有恢复复杂的方案 A,而是仅将其中已经验证有效的局部 layout protection 接回方案 B,并通过浏览器回归测试和真实广告展示完成最终验收。

  • 在决定保留 A Tour of Go 原有 SPA 架构之后,广告问题从“要不要整页刷新”转变成了“广告应该放在哪里、又该如何跟随 SPA 页面生命周期”。本文记录了从 AdSense Preview 识别 footer 下方候选广告位,到方案 A 使用 MutationObserver 跟踪 DOM 变化,再到方案 B 将广告直接绑定 Angular route-owned course view 生命周期的完整演进。最终通过 mount() / $destroy / unmount() 管理每一页独立广告节点,并保留 Auto Ads 继续服务其他已正常运行的站点和域名。

  • 在排查 A Tour of Go 展示广告始终不出现的问题时,一个看似直接的方案是放弃 SPA,让每一节课程都通过完整页面刷新来简化 AdSense、统计和 SEO。但进一步对比后发现,最大的代价并不是一次性的前端改造,而是长期偏离 golang/website 上游架构,持续增加同步与维护成本。本文结合官方 A Tour of Go 的 SPA 导航、上游 _content/tour/ 目录以及项目自身的 upstream baseline 管理方式,对“保留 SPA”与“放弃 SPA”进行完整权衡,并最终确定:让广告适配 A Tour of Go,而不是为了广告重新设计 A Tour of Go。

  • 在 A Tour of Go 多语言站点接入 Google AdSense 后,课程页虽然存在大片视觉空白,但普通展示广告始终没有出现。本文从 Auto Ads 配置、adsbygoogle.js 加载状态以及官方 A Tour of Go 的 DOM / layout 结构入手,分析为什么“页面看起来有空白”并不等于“Google 认为这里存在可插入广告的位置”。最终将问题范围收敛到 A Tour of Go 特殊的左右分栏和交互式页面结构,并引出后续一个更重要的架构选择:是否值得为了 AdSense 放弃原有 SPA。

  • 记录 go-dev.shuijingwanwq.com 单页网站接入统计与 Google AdSense Auto Ads 的验证过程。由于 A Tour of Go 采用 SPA 架构,页面切换不会触发传统页面刷新,因此需要验证第三方统计和广告服务对动态路由变化的支持情况。经过测试,Google Analytics 4 与百度统计均能够正常记录课程页面切换,Google AdSense Auto Ads 也完成脚本加载、隐私流程以及自动广告展示验证。目前页面内广告仍处于持续观察阶段,后续将根据实际展示效果进一步优化广告策略。

👨‍💻 个人品牌

王世强|技术实践者 · 独立博客作者

15+ 年 Web 与系统实践经验,持续关注网站基础设施、系统优化、AI 工具与自动化。

持续运营技术博客 10+ 年,累计发布 1000+ 篇原创技术文章。

长期建设个人项目,也欢迎合适的技术交流、咨询与合作。

👉 关于我

.env (14) add (16) AI 翻译 (33) Apache (13) Array (19) A Tour of Go (76) Cache (13) CentOS (23) ChatGPT (29) ChatGPT Plus (17) chrome (19) Cloudflare (38) Codex (26) composer (42) composer.json (22) composer install (13) composer update (14) console (16) Container (25) curl (16) delete (31) Docker (32) Dockerfile (15) EdgeOne (34) environment variable (19) error (24) file (15) filter (20) Git (28) GitHub (23) Gitlab (15) GLM-5.2 (27) Go (65) go-tour-i18n (16) Google AdSense (30) Go 语言 (24) GraphQL (24) GraphQL API (14) Gutenberg (36) http (21) https (22) Interface (19) Jquery (13) json (24) Laravel (37) Laravel 6 (55) Laravel 9 (25) Lighthouse (17) Lighthouse 5 (14) Linux (22) Migrate (13) Module (17) MySQL (78) MySQL 5.7 (22) Nginx (63) normalize.css (28) OKX (15) OneinStack (21) PHP (67) php-fpm (19) php.ini (24) PHP 7.1.12 (22) PHP 7.4 (26) phpmyadmin (15) PhpStorm (24) Polylang (58) postman (18) Query (17) queue (16) Rancher (24) Redis (51) RESTful (27) RESTful API (23) Shopify (19) SlyTranslate (21) SQL (24) String (14) TortoiseGit (14) Twenty Twenty-Five (20) Ubuntu (43) update (20) VPN (17) W3 Total Cache (40) Windows 10 (46) WireGuard (28) WordPress (135) WPCode (23) Wstunnel (15) Yii (40) Yii 2 (70) Yii 2.0 (51) 国际化 (14) 多语言翻译 (38) 开源项目 (15) 技术博客 (15) 故障排查 (19) 数据库迁移 (16) 浏览器 (14) 阿里云 (20) 页面缓存 (14)

2026 年 10 月
一 二 三 四 五 六 日
 1234
567891011
12131415161718
19202122232425
262728293031