惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
I
InfoQ
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
Google Developers Blog
WordPress大学
WordPress大学
B
Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
博客园 - 聂微东
Jina AI
Jina AI

竹林里有冰的博客

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客 基于 Cloudflare Workers 实现的在线服务状态检测告警系统 | 竹林里有冰的博客 构建部署在 Cloudflare Workers 上的 TG Bot | 竹林里有冰的博客 2024年,Firefox 是唯一还在坚持执行在线的 SSL 证书吊销状态检查的主流浏览器 | 竹林里有冰的博客 小爱课程表适配不完全指北——以 ZJUT 本科正方教务系统为例 | 竹林里有冰的博客 给家里云装上 Fedora 41 KDE 后,我是如何配置的 | 竹林里有冰的博客 为 Hexo 添加 follow 认证 | 竹林里有冰的博客 使用 GPT 对 waline 的评论进行审查 | 竹林里有冰的博客
将博客从 waline v2 更新到 waline v3 | 竹林里有冰的博客
竹林里有冰 · 2024-11-15 · via 竹林里有冰的博客

waline 更新到 V3 版本已经是九个月前的事情了,眼瞅着 hexo fluid 主题并没有带我更新的意思,我就打算自己更新到最新版,结果遇到了两个坑,写文供大家参考。

在 Hexo 目录下的 _config.fluid.yml 文件中找到 waline 的 cdn,将版本号指向最新版。

-  waline: https://registry.npmmirror.com/@waline/client/2.15.8/files/dist/
+  waline: https://registry.npmmirror.com/@waline/client/^3/files/dist/

再次部署博客,我遇到了第一个坑:waline 没有在页面上正常加载。

打开控制台一看,报错给得很明白:Waline is not defined

根据 issue#2483

https://unpkg.com/@waline/client@3.1.3/dist/waline.umd.js 用这个地址

本质是 ...... 没有使用 ES Module 的加载方式 <script type="module">,所以需要使用 UMD 的模块

那么按照正常的脑回路,我们应该修改主题中的引入 waline 部分的 js 文件,把针对 waline.js 的引用改成 waline.umd.js,具体的修改处在这里

但是,我是使用 npm 安装的主题,方便在主题更新时直接同步上游的更改,如果使用这种修改源文件引用的方式将会导致我不得不放弃原有的主题安装方式,改用下载主题源码的方式。

那么有没有办法,既能够成功加载带 umd 的 js,又不用改动主题源码呢?还真有,我自己部署 cdn 就好了。从 npmjs 下载带 umd 的 waline.umd.js,重命名成 waline.js,和 waline.css 一起放在同一路径下,在把自己的 cdn 链接前缀填入 _config.fluid.yml 中,就可以实现移花接木——表面上访问的是 waline.js,实际上内容是 waline.umd.js 。

插曲二——重复显示的 @#

更新到 v3 版本以后,我发现所有的评论都出现了重复两遍的 @

我去群里提问,管理员 li zheming 给出了这样的答复:

这个是 feature 了,早版本 @ 是渲染在评论内容里的,这块后来重构了下,@ 是 Waline 自己渲染了。不过历史数据我们并没有处理,所以会出现这种情况。如果比较介意的话可以手动去数据库里删除下。

那么很显然,我很介意这点,我需要删除数据库中的 @ 信息。

打开 waline 的后台管理站点,我发现我有整整 30 页的评论——很显然我是 waline 的牢用户了,我不太可能一个一个手动去掉评论中的 @

我的 waline 数据库是 leancloud,对方的 webui 没办法帮助我批量去除 html 或者 markdown 形式的内容(就算对方支持 sql 语句,处理这个问题都够呛),我需要一个脚本来直接处理数据库中的信息。

首先,我们需要导出数据库数据,自然是登陆 leancloud,然后找到 数据存储 - 导入导出 - 数据导出,选择 Comment 单个 Class,单击导出按钮。

err,我寻思凌晨 1 点应该是 16 点前吧,怎么导出不了,而我昨晚 23 点反而可以导出,leancloud 到底是哪门子时区。所以我直接拿了 23 点时导出的数据进行处理。

leancloud 导出的数据是 jsonl 格式的,我们对需要去除的 @ 信息进行归纳总结,发现一共有两种 @ 的渲染方式

  • <a class="at" href="#id">@username</a> 的 html 风格(有时 class 和 href 顺序还会反过来)
  • [@username](#id) 的 markdown 风格

而 html 风格还有两种结尾方式,

一种是如 <a class="at" href="#id">@username</a> , 这样以 空格 + 半角逗号 + 空格 结尾的形式,

令一种是如 <a class="at" href="#id">@username</a>: 这样以 半角冒号 + 空格结尾的形式。

markdown 风格的结尾方式我就只看到一种,如 [@username](#id): 这样以 半角冒号 + 空格结尾的形式。

因此,我们需要对三种形式分别编写正则表达式进行匹配并删除,参考代码如下

import re

with open('Comment.0.jsonl', 'r') as f:
    s = f.read()

patterns = [
    r'<a class=\\"at\\" href=\\"#(?:.*?)\\">@(?:.*?)</a>: ',
    r'<a class=\\"at\\" href=\\"#(?:.*?)\\">@(?:.*?)</a> , ',
    r'\[@(?:.*?)\]\(#(?:.*?)\):'
]

for pattern in patterns:
    s = re.sub(pattern, "", s)

with open('Comment.1.jsonl', 'w') as f:
    f.write(s)

随后删除 Comment 表中所有数据,把生成的 Comment.1.jsonl 导入 leancloud,就算是大功告成了。