修复评论区切页后排版崩坏:twikoo 基础样式改为静态引入

Astro 的 ClientRouter 切页时会清掉 head 里它不认识的 <style>,而 twikoo
的 CSS 正是 twikoo.min.js 运行时 appendChild 到 head 的;脚本本身又只执行
一次(window.twikoo 已存在就跳过),样式不会重新注入。

表现:从一篇带评论的文章点链接进另一篇后,评论区样式整段丢失 ——
markdown 图标被 .twikoo svg{width:100%;height:100%} 撑成 768x1240px、
文件输入框 .tk-input-image 从 display:none 变回可见、.OwO-items 从 flex
塌成 block 竖排成一列;整页刷新后恢复。

修复:把官方 twikoo.css 放进 public/assets/css/(与现有 twikoo.min.js 同为
1.7.20,已核对两个文件都来自同一个 npm 包、md5 一致),在 Comments.astro
里用静态 <link> 引入,排在 twikoo-custom.css 之前。静态 link 在 <body> 里,
切页时会随新页面一起换进来,不再依赖运行时注入。

没有换用官方 twikoo.nocss.js:它是 all 完整版去掉 CSS(997 KB),比
twikoo.min.js(506 KB,CSS 打包在内)大近一倍,而本站服务器没开 gzip,
换过去等于访客多下 491 KB。

验证(headless Chrome 131,禁用缓存,对本地 dist 实测):
- 直接打开文章页:icon 18.75px / fileInput none / .tk-submit 179px
- 文章 -> 文章切页:修复前 768px / inline-block / 2919px;
  修复后与直接打开逐像素一致(diff bbox = None,差异像素 0.0000%)
- 连续切页 3 次、切页后展开 OwO 表情面板,均正常
This commit is contained in:
dsh
2026-09-15 08:39:41 +08:00
parent 4810c87d30
commit c841fa2047
5 changed files with 1173 additions and 5 deletions
+13 -1
View File
@@ -9,7 +9,19 @@ const isEnabled = Boolean(envId)
{
isEnabled && (
<section class="mt-12 pb-12" data-comments>
{/* twikoo 的主样式由脚本运行时注入,这里只加主题适配层 */}
{/*
twikoo 的基础样式必须用静态 <link> 引入,不能只靠 twikoo.min.js 运行时注入。
原因:脚本会把样式 appendChild 到 <head>,而 Astro 的 ClientRouter 在切页
时会清掉 head 里它不认识的 <style>;脚本本身又只执行一次(window.twikoo
已存在就跳过),样式不会重新注入。表现为「从一篇带评论的文章点进另一篇后,
评论区排版全崩」——markdown 图标被撑成几百像素、文件输入框露出来、
表情面板塌成一列;整页刷新才恢复。
顺序:twikoo.css(官方原样,随版本从 npm 更新)→ twikoo-custom.css(主题适配)。
放在 body 里而不是 head,是为了让 ClientRouter 每次切页都把它一起换进来。
*/}
<link rel="stylesheet" href="/assets/css/twikoo.css" />
<link rel="stylesheet" href="/assets/css/twikoo-custom.css" />
<div class="px-6">