[{"data":1,"prerenderedAt":537},["ShallowReactive",2],{"content:\u002F2025\u002Funpopular-blog-tech":3,"surround:\u002F2025\u002Funpopular-blog-tech":525},{"id":4,"title":5,"body":6,"categories":498,"date":500,"description":501,"draft":502,"extension":503,"image":504,"meta":505,"navigation":507,"path":508,"permalink":509,"published":509,"readingTime":510,"recommend":509,"references":509,"seo":515,"sitemap":516,"stem":517,"tags":518,"type":522,"updated":523,"__hash__":524},"content\u002Fposts\u002F2025\u002Funpopular-blog-tech.md","谈谈不受欢迎的博客技术特征",{"type":7,"value":8,"toc":467},"minimark",[9,19,22,29,33,37,40,107,120,127,137,140,143,146,150,157,160,175,184,187,190,197,206,210,213,220,229,232,236,239,242,247,250,254,257,260,263,271,275,281,284,287,292,306,309,312,317,320,324,327,331,334,344,347,357,364,373,378,382,385,388,391,395,398,401,406,409,412,415,418,421,425,428,437,440,444,454,457],[10,11,12,16],"chat",{},[13,14,15],"p",{},"{一位知乎网友}",[13,17,18],{},"请问你的博客是那个给文本加上渐变配色代码块，用衬线字体article巨大阴影半透明背景加莫名其妙的地方抄来的canvas动效，打开会自动播放网易云音乐且加载一个Live2D小人挡住播放器控件，还有自定义光标加上点击特效且复制文本的时候会自作主张加上版权通告，切出网页以后title还会变成莫名其妙的文本内容的吗",[13,20,21],{},"这位网友讲述了一个尖锐的博客现象，但没有触及我认为的核心问题：博客的核心定位是“内容传递”与“用户预期”，但部分技术反向会破坏体验、流失读者。在这些负面技术特征下，用户可能因反感直接关闭页面，甚至不再回访。",[13,23,24,25],{},"或者换句话说：",[26,27,28],"strong",{},"有些功能虽好，但受限于开发者的产品认知或技术水平，实现后反而变成了干扰用户体验的痼疾。",[30,31,32],"h2",{"id":32},"用户体验",[34,35,36],"h3",{"id":36},"切换标签页时更改标题",[13,38,39],{},"一些博客网站在用户离开时，会将网页标题改为挽留文本，这当然十分有趣。但当打开一组标签页时，后果便变得灾难起来，用户无法识别各标签页的内容。",[41,42,43,59],"table",{},[44,45,46],"thead",{},[47,48,49,53,56],"tr",{},[50,51,52],"th",{},"🍊 ♪(^∇^*)欢迎肥来！",[50,54,55],{},"❄ (｡•́︿•̀｡) 别走呀！还没看完呢～",[50,57,58],{},"⭐ (๑•́ω•̀๑) 等等！别切走呀～",[60,61,62,74,85,96],"tbody",{},[47,63,64,68,71],{},[65,66,67],"td",{},"📌 (≧∇≦)ﾉ 不要离开！再看看嘛～",[65,69,70],{},"🎨 (´･ω･`) 别走啦！多留会儿呀～",[65,72,73],{},"📖 (｡･ω･｡)ﾉ 等等！别切换呀～",[47,75,76,79,82],{},[65,77,78],{},"🍃 (๑˃̵ᴗ˂̵)و 不要走！再停留会儿～",[65,80,81],{},"💫 (´• ω •`)ﾉ 别走呀！再看看～",[65,83,84],{},"📝 (≧∇≦)ﾉ 等等！别离开嘛～",[47,86,87,90,93],{},[65,88,89],{},"🎈 (｡･ω･｡)ﾉ 不要切走！再留会儿～",[65,91,92],{},"🍀 (っ´ω`c) 别走呀！再看看嘛～",[65,94,95],{},"✨ (｡•́︿•̀｡) 等等！别离开呀～",[47,97,98,101,104],{},[65,99,100],{},"📮 (≧∇≦)ﾉ 不要走！多留会儿呀～",[65,102,103],{},"🌸 (´･ω･`) 别走啦！再看看嘛～",[65,105,106],{},"📌 (๑˃̵ᴗ˂̵)و 等等！别切走呀～",[108,109,110,113],"quote",{},[13,111,112],{},"这不像是网上冲浪，倒像是在一大片尖叫鸡中行走。",[114,115,117],"template",{"v-slot:icon":116},"",[13,118,119],{},"🐔",[13,121,122,123,126],{},"如果你的博客网站不是为了自娱自乐，而是想真正为读者",[26,124,125],{},"传递有价值的信息","，那么过于花哨的标签页标题技巧很可能在用户查阅资料时造成困扰。",[108,128,129,132],{},[13,130,131],{},"标题里一定要有标题✍️✍️️✍️",[114,133,134],{"v-slot:icon":116},[13,135,136],{},"\\0\u002F\\0\u002F\\0\u002F",[34,138,139],{"id":139},"打开网页时自动播放声音",[13,141,142],{},"浏览器限制自动播放是为了清静，但是有开发者在利用“首次交互后播放”的规则，来实现自动播放背景音乐或语音播报。",[13,144,145],{},"这种无预警的侵入在办公或公共场合只会让用户陷入尴尬。当用户的第一反应是“关掉页面”而非“阅读内容”时，这个功能就彻底失败了。真正高级的设计，从不靠剥夺用户的“掌控感”来刷存在感。声音若有价值，请把开关留给用户，而不是强加于人。",[34,147,149],{"id":148},"正文使用难以阅读的艺术字体对比度过低的配色","正文使用难以阅读的艺术字体、对比度过低的配色",[13,151,152],{},[153,154,156],"span",{"style":155},"font-family: cursive; opacity: 0.2;","字都看不清，不读了！",[34,158,159],{"id":159},"将鼠标指针改为难以识别的光标样式",[13,161,162,163,170,171,174],{},"让我想起了用别人电脑时",[153,164,169],{"style":165,"className":166,"title":168},"cursor:none",[167],"text-repeat","别笑，你试你也找不到","找不到鼠标指针","的尴尬经历。如果你认为自己网站的光标样式比用户设置的更好，那么它起码",[26,172,173],{},"应当易于识别","。",[108,176,177,180],{},[13,178,179],{},"鼠标指针一定要能看清✍️✍️️✍️",[114,181,182],{"v-slot:icon":116},[13,183,136],{},[34,185,186],{"id":186},"更改右键菜单",[13,188,189],{},"右键菜单没什么用，但开发者觉得右键菜单没什么用不太可能，于是在博客中加入了右键菜单。它能——阻止召唤出真正的右键菜单。",[13,191,192,193,196],{},"用户点击右键是为了使用功能，而不是点着玩。一个好的设计应该补足体验，也就是",[26,194,195],{},"让用户知道右键能做什么","，而不是通过剥夺原生功能来强刷存在感。",[108,198,199,202],{},[13,200,201],{},"右键一定要能召唤用户想要的菜单✍️✍️️✍️",[114,203,204],{"v-slot:icon":116},[13,205,136],{},[34,207,209],{"id":208},"阻止交互的弹窗加载动画","阻止交互的弹窗、加载动画",[13,211,212],{},"先被一个强迫点击“我知道了”的“更新日志”挡住去路，关掉它，又是全屏 Google Ads 的贴脸输出。别笑，你试你也过不了加载动画：一个圆形头像在白屏中心有节奏地闪烁。一秒，两秒……它闪烁得如此优雅，页面却始终卡在“最后一公里”。",[13,214,215,216,219],{},"如果你的加载动画",[26,217,218],{},"一定要等待所有资源","，请给用户一个网络不好时能关掉它的机会。",[108,221,222,225],{},[13,223,224],{},"加载动画一定要能加载完✍️✍️️✍️",[114,226,227],{"v-slot:icon":116},[13,228,136],{},[30,230,231],{"id":231},"技术误用",[34,233,235],{"id":234},"质量不佳的-js-cdn","质量不佳的 JS CDN",[13,237,238],{},"很多博主迷信 jsDelivr、UNPKG 或相关公益\u002F自建镜像，但这并不是最优解。",[13,240,241],{},"公共常用 JS 库完全可以通过更快的、选择更多的国内 JS CDN 提供。它们大多是 cdnjs 的镜像，只要在 cdnjs 找到库，就能通过替换域名来使用。",[243,244],"link-card",{"link":245,"title":246},"\u002F2024\u002Fvitepress-enhancement#通过-cdn-引入图标-css","参见：通过 CDN 引入图标 CSS",[13,248,249],{},"私有 GitHub 仓库、npm 包不推荐使用公共加速服务。公共 CDN 提供的应当是公共受益的内容，保障稳定性、加载速度、安全性才是公共 CDN 应该做的。",[34,251,253],{"id":252},"pjax-pace","Pjax + PACE",[13,255,256],{},"打开博客只有背景没有字？进度条一直卡在 99% 动弹不得？",[13,258,259],{},"这通常是 Pjax 搭配 PACE 加载动画造成的。Pjax 负责实现页面切换不刷新，而 PACE 动画则会监控后台的所有请求。逻辑漏洞在于：只要有一个资源加载失败（比如某个图标、头像或 CDN 抽风），PACE 就会认为加载还没完成，导致进度条永远无法读条成功。",[13,261,262],{},"最尴尬的是，此时文章文字其实已经加载到了页面上，但由于 PACE 还没发出“完成”指令，导致页面上的文字依然维持着加载中的透明状态。为了那点所谓的视觉效果，硬生生让用户对着一片空白干等。",[10,264,265,268],{},[13,266,267],{},"{.纸鹿}",[13,269,270],{},"技术虽好，但一定要有容错。",[34,272,274],{"id":273},"禁用选中复制","禁用选中、复制",[13,276,277],{},[153,278,280],{"style":279},"user-select: none;","应该还没有技术博客不让用户选中文本吧……CSDN 除外。",[34,282,283],{"id":283},"禁用开发者工具",[13,285,286],{},"从来没有一种方法能真正的禁用开发者工具，反而只会恶心到用户和开发者。",[243,288],{"link":289,"title":290,"icon":291},"https:\u002F\u002Farchive.bikari.top\u002Fbook\u002Fdaily\u002Fa47d4e9","你这个级别的 Devtools 无权哈我 - 微光档案","https:\u002F\u002Farchive.bikari.top\u002Ffavicon.ico",[293,294,296],"folding",{"title":295},"还有可爱的开发者，用控制台打印的语句成功骗到了用户。",[297,298,303],"pre",{"className":299,"code":301,"language":302,"meta":116},[300],"language-ansi","\u001b[32;7m NCC2-036 \u001b[0m 调用前置摄像头拍照成功，识别为【小笨蛋】.\n\n\u001b[34;7m WELCOME \u001b[0m 你好，小笨蛋.\n\n\u001b[34;7m W23-12 \u001b[0m 你已打开控制台.\n\n\u001b[33;7m S013-782 \u001b[0m 你现在正处于监控中.\n","ansi",[304,305,301],"code",{"__ignoreMap":116},[13,307,308],{},"一些热门的检测开发者工具的库十分容易误报，当用户打开垂直标签页，或是下载列表、历史记录出现在侧栏时，这些库就会误判。",[13,310,311],{},"一些页面在检测到开发者工具时，会用各种声光警告用户并阻止用户浏览网页，把用户当作窃取页面代码的黑客，却防不住真正的 DevTools 远程调试。",[108,313,314],{},[13,315,316],{},"当我打开 DevTools 时，大概率是想要看 bug 到底有多荒唐。",[30,318,319],{"id":319},"服务滥用",[34,321,323],{"id":322},"pwa","PWA",[13,325,326],{},"渐进式 Web 应用程序（PWA）本意是好功能，它能让网页像原生应用一样运行。但在早期浏览器中，网页一打开就弹窗“是否安装应用”，极其干扰体验。好在现在的浏览器已经收敛了许多，不再自动弹窗。",[34,328,330],{"id":329},"滥用-service-worker-cachestorage","滥用 Service Worker + CacheStorage",[13,332,333],{},"一些博主对前端缓存机制一知半解，放着成熟、好用的 HTTP 强缓存\u002F协商缓存不用，非要秀肌肉搞“全站离线化”，强行把所有图片、脚本塞进用户的 CacheStorage。",[108,335,336,339],{},[13,337,338],{},"Bro，我只是来看篇文章，清理不掉的硬盘空间谁来补啊！",[114,340,341],{"v-slot:icon":116},[13,342,343],{},"😭",[13,345,346],{},"这种“秀肌肉”的行为完全是本末倒置：",[348,349,350,354],"ul",{},[351,352,353],"li",{},"清理困难：CacheStorage 独立于 HTTP 缓存，普通用户点击“清除浏览器缓存”根本删不掉它。它就像牛皮癣一样粘在硬盘里，甚至会导致页面更新失效。",[351,355,356],{},"占用空间：有些站点初次访问就会留下几百 MB 的“坚固缓存”。浏览器原生的 HTTP 缓存有自动清理机制，但 CacheStorage 如果博主没写清理逻辑，就会一直膨胀。",[13,358,359,360,363],{},"JS、CSS 和图片本该交给 HTTP 响应头的 ",[304,361,362],{"code":362},"Cache-Control"," 处理，而不是费劲引入 Service Worker 又不讨好。",[13,365,366,367,372],{},"Windows 用户可以按下 ",[368,369],"key",{":win":370,"code":371},"true","R","，看看你的硬盘里藏了多少惊喜：",[374,375],"copy",{"code":376,"prompt":377},"%LOCALAPPDATA%\\Microsoft\\Edge\\User Data\\Default\\Service Worker","Edge",[374,379],{"code":380,"prompt":381},"%LOCALAPPDATA%\\Google\\Chrome\\User Data\\Default\\Service Worker","Chrome",[34,383,384],{"id":384},"将公共服务滥用为图床",[13,386,387],{},"许多教程都在教小白如何把 GitHub 或 npm 包装成图床，这是典型的公共服务滥用。",[13,389,390],{},"开源基础设施的初衷是支撑代码托管和分发，而非免费的二进制存储仓库。尤其是一些人，利用 npm 托管资源、再配合公共 CDN 进行分发，这种“连环招”不仅增加了链路的不确定性，更是在透支整个社区的信任底线。",[34,392,394],{"id":393},"npm-竞速","npm 竞速",[13,396,397],{},"更有甚者，利用 Service Worker + npm + 公共 CDN 搞出一套“竞速方案”：将全站静态资源托管在 npm，然后在用户端发起多个 CDN 节点的并发请求，谁快用谁，最后再强制塞进用户的磁盘缓存。",[13,399,400],{},"这种方案看似解决了访问速度问题，实则吃相难看——为了加载一个几十 KB 的脚本，向数个公共 CDN 发起冗余请求，再结合 CacheStorage 滥用——让浏览器变成放大公益服务流量的黑手，给设备塞入难以铲除的“缓存墓碑”。",[108,402,403],{},[13,404,405],{},"真正做到托管平台、CDN、用户均不受益。",[30,407,408],{"id":408},"影响自身",[34,410,411],{"id":411},"频繁更换域名",[13,413,414],{},"不知道怎么评价，因为已经访问不到了。",[34,416,417],{"id":417},"无订阅源",[13,419,420],{},"我始终认为现代博客是早期互联网精神的延续，而 RSS\u002FAtom 订阅源就是一种独属于独立博客的技术浪漫。如果一个博客只能靠博主在朋友圈或社交平台“推销”才能获得流量，那它更像是一个孤岛。",[34,422,424],{"id":423},"csr-站点","CSR 站点",[13,426,427],{},"经常能看到类似《我用 Vue\u002FReact 写了一个博客》的视频，但这类纯 CSR（客户端渲染）项目很难在生产环境下生存，原因很简单：",[429,430,431,434],"ol",{},[351,432,433],{},"HTML 只是一个挂载点的空壳，内容全靠浏览器运行 JS 后生成。对于很多搜索引擎爬虫来说，你的博客就是一片空白。",[351,435,436],{},"单页应用（SPA）若使用默认的哈希模式（#\u002Fpath），在搜索引擎眼中，你整个站点几篇或几百篇文章其实都挤在同一个路径下。",[13,438,439],{},"没有 SSR（服务端渲染）或 SSG（静态网站生成）支撑的 JS 框架博客，就是拒绝被发现。",[34,441,443],{"id":442},"不关注-seo","不关注 SEO",[13,445,446,447,453],{},"Meta 元数据名称、Open Graph、Twitter Card、JSON-LD、搜索索引、网站统计……先别急着配置这些，如果你的网页具有 ",[304,448,451],{"className":449,"code":451,"language":452},[450],"language-html","\u003Clink rel=\"canonical\">","html"," 标签，先看看它写对了吗？",[13,455,456],{},"这个标签的作用是告诉搜索引擎“权威地址”。如果你有多个域名或路径指向同一篇文章，它能避免权重分散。而一些主题会错误地把文章页的 Canonical 标签指向主页、不一致的域名或协议。这无异于向搜索引擎宣告“吾非正版，无需收录”。",[108,458,459,462],{},[13,460,461],{},"技术只是系数，文章才是基数。讲了这么多，博客文章在哪里？",[114,463,464],{"v-slot:icon":116},[13,465,466],{},"🤔🤔🤔",{"title":116,"searchDepth":468,"depth":468,"links":469},4,[470,480,486,492],{"id":32,"depth":471,"text":32,"children":472},2,[473,475,476,477,478,479],{"id":36,"depth":474,"text":36},3,{"id":139,"depth":474,"text":139},{"id":148,"depth":474,"text":149},{"id":159,"depth":474,"text":159},{"id":186,"depth":474,"text":186},{"id":208,"depth":474,"text":209},{"id":231,"depth":471,"text":231,"children":481},[482,483,484,485],{"id":234,"depth":474,"text":235},{"id":252,"depth":474,"text":253},{"id":273,"depth":474,"text":274},{"id":283,"depth":474,"text":283},{"id":319,"depth":471,"text":319,"children":487},[488,489,490,491],{"id":322,"depth":474,"text":323},{"id":329,"depth":474,"text":330},{"id":384,"depth":474,"text":384},{"id":393,"depth":474,"text":394},{"id":408,"depth":471,"text":408,"children":493},[494,495,496,497],{"id":411,"depth":474,"text":411},{"id":417,"depth":474,"text":417},{"id":423,"depth":474,"text":424},{"id":442,"depth":474,"text":443},[499],"杂谈","2025-10-07 16:06:46","从弹窗干扰到服务滥用，文章剖析博客网站「自以为在优化，实则在添堵」的负面技术特征。",false,"md","https:\u002F\u002Fassets.zhilu.cyou\u002Fcover5\u002Funpopular-blog-tech.webp",{"slots":506},{},true,"\u002F2025\u002Funpopular-blog-tech",null,{"text":511,"minutes":512,"time":513,"words":514},"15 min read",14.36,861600,2872,{"title":5,"description":501},{"loc":508},"posts\u002F2025\u002Funpopular-blog-tech",[519,520,521],"博客","技术选型","前端","tech","2025-12-24 22:47:40","NgDeRt-_j-pxTUeseeppChkI-W68vsjOE8lWkiRtKjo",[526,532],{"title":527,"path":528,"stem":529,"date":530,"type":531,"children":-1},"我们的设备被拿来做了什么：软件的背景行为","\u002F2025\u002Fbackground-behavior","posts\u002F2025\u002Fbackground-behavior","2025-08-18 01:16:02","story",{"title":533,"path":534,"stem":535,"date":536,"type":522,"children":-1},"实习后买了一堆东西","\u002F2026\u002Fbuy-right","posts\u002F2026\u002Fbuy-right","2026-02-23 11:02:12",1782091371484]