Astro 使用 ClientRouter 后 Twikoo 样式崩了怎么解决
解决 Astro 启用 View Transitions 后 Twikoo 评论组件样式丢失的问题,使用 nocss 版本分离加载 CSS
Copied
解决 Astro 启用 View Transitions 后 Twikoo 评论组件样式丢失的问题,使用 nocss 版本分离加载 CSS
在 Astro 博客中启用 <ClientRouter /> (View Transitions) 后,你可能会发现 Twikoo 评论组件的样式崩了:
Twikoo 默认使用的是 twikoo.min.js,这是一个 JS + CSS 合并版。它的样式是通过 JavaScript 动态注入到 <head> 中的。
当 Astro 使用 ClientRouter 进行客户端导航时:
使用 twikoo.nocss.js 版本,并单独加载 CSS 文件。
<!-- 1. 使用 link 标签静态加载 CSS (推荐) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/twikoo@1.6.44/dist/twikoo.css">
<script>
// 动态加载 Twikoo 脚本(无 CSS 版本)
const loadTwikoo = () => {
return new Promise((resolve, reject) => {
// 检查是否已加载
if (typeof window.twikoo !== 'undefined') {
resolve();
return;
}
const script = document.createElement('script');
// 使用 nocss 版本,避免它自动注入 CSS 导致冲突
script.src = 'https://cdn.jsdelivr.net/npm/twikoo@1.6.44/dist/twikoo.nocss.js';
script.onload = () => setTimeout(() => resolve(), 100);
script.onerror = () => reject(new Error('Failed to load Twikoo'));
document.head.appendChild(script);
});
};
</script>
| 之前 | 之后 |
|---|---|
twikoo.min.js | twikoo.nocss.js |
| CSS 内嵌在 JS 中 | 独立加载 twikoo.css |
<link> 静态引入:直接写在 HTML 模板中,ClientRouter 会像处理其他样式一样正确处理它,不会误删。Twikoo 初始化逻辑也需要在页面切换后重新执行:
function initTwikoo() {
const container = document.getElementById('tcomment');
if (!container) return;
container.innerHTML = ''; // 清空旧内容
loadTwikoo().then(() => {
window.twikoo.init({
envId: 'your-env-id',
el: '#tcomment',
path: location.pathname,
lang: 'zh-CN',
});
});
}
// 初始加载
initTwikoo();
// View Transitions 页面切换后重新初始化
document.addEventListener('astro:page-load', initTwikoo);
在 Astro + ClientRouter 环境下使用 Twikoo:
twikoo.nocss.js 无样式版本<link> 加载 twikoo.cssastro:page-load 重新初始化评论组件这样就能保证页面切换后 Twikoo 样式正常显示了!
Astro 使用 ClientRouter 后 Twikoo 样式崩了怎么解决
www.jsom.top/post/astro-使用-clientrouter-后-twikoo-样式崩了怎么解决
Comments