修复评论区不渲染:id 全局变量遮蔽导致脚本未加载

容器是 <div id="twikoo">,浏览器会把带 id 的元素暴露成 window 上的同名
全局变量,所以脚本加载前 window.twikoo 已指向那个 DOM 元素。原守卫
if (window.twikoo) 因此误判「已加载」而直接返回,真正的 twikoo 库从未被加载,
表现为只显示「评论」标题、容器为空。

改为检查真正的 API:typeof window.twikoo?.init === "function"。

验证(jsdom 对线上页面实测):init 为函数,容器渲染 23040 字节,
提交框/昵称/textarea 齐全,历史评论 |´・ω・)ノ 正常显示,无报错。

另:deploy.sh 的 PI_SITE_PATH 改为 /home/pi/www/Astro_firefly/(覆盖部署)
This commit is contained in:
dsh
2026-09-14 21:08:46 +08:00
parent 0b99eabfbe
commit 4810c87d30
2 changed files with 11 additions and 2 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ set -euo pipefail
# ========== 配置区(按需修改) ========== # ========== 配置区(按需修改) ==========
PI_HOST="192.168.1.87" # 树莓派 IP PI_HOST="192.168.1.87" # 树莓派 IP
PI_USER="pi" PI_USER="pi"
PI_SITE_PATH="/home/pi/www/Astro_vermilion/" # 与 Firefly 分开放,方便对比 PI_SITE_PATH="/home/pi/www/Astro_firefly/" # 沿用现有 nginx 站点目录(会覆盖原 Firefly)
CLOUD_HOST="81.70.45.191" # 云服务器 IP CLOUD_HOST="81.70.45.191" # 云服务器 IP
CLOUD_USER="root" CLOUD_USER="root"
+10 -1
View File
@@ -30,8 +30,17 @@ const isEnabled = Boolean(envId)
;(() => { ;(() => {
const SCRIPT_SRC = "/assets/js/twikoo.min.js" const SCRIPT_SRC = "/assets/js/twikoo.min.js"
/**
* 注意:容器是 <div id="twikoo">,而浏览器会把带 id 的元素暴露成
* window 上的同名全局变量 —— 所以脚本加载前 window.twikoo 就已经
* 是那个 DOM 元素了。这里必须检查真正的 API 是否存在,
* 不能只判断 `if (window.twikoo)`,否则会误以为已加载而跳过。
*/
const isLoaded = () =>
typeof window.twikoo === "object" && typeof window.twikoo?.init === "function"
const loadScript = () => { const loadScript = () => {
if (window.twikoo) return Promise.resolve() if (isLoaded()) return Promise.resolve()
const existing = document.querySelector("script[data-twikoo]") const existing = document.querySelector("script[data-twikoo]")
if (existing) { if (existing) {