Hexo 搜索跳转失效?一招解决链接域名丢失问题
问题现象:博客搜索功能正常,但点击搜索结果后跳转链接丢失了站点域名,例如实际文章链接为 http://www.gloam.cn:4000/20260302020433.html,搜索后却指向 http://20260302020433.html,导致无法访问。 根本原因:Hexo 搜索插件在生成搜索数据时,只记录了文章的相对路径(即 permalink 配置值),没有自动补全站点的完整域名。 解决方案:修改主题中负责渲染搜索结果的 JavaScript 文件,将文章的相对路径拼接上站点的根路径(如 location.origin),生成绝对链接即可解决。 问题复现根据 Hexo永久链接最佳实践:终极方案与优化指南 对文章的url进行了优化,但是优化后通过搜索无法跳转到正确的文章。 12345实际链接:http://www.gloam.cn:4000/20260302020433.html搜索后跳转链接:http://20260302020433.html 修复指南定位搜索功能相关文件在主题目录中寻找负责搜索的脚本文件。以 hexo-theme-matery 主题为例,需要找到...
Hexo永久链接最佳实践:终极方案与优化指南
结论先行:日期方案是最佳选择经过多种方案的对比与实践,推荐使用基于文章创建时间的日期格式作为永久链接,即: 1permalink: :year:month:day:hour:minute:second.html 该方案完全依赖 Hexo 原生功能,无需额外插件;生成的 URL 简洁、无中文乱码、长度固定;只要在每篇文章的 Front-matter 中明确设置 date 字段,链接即可永久不变,彻底解决了文件名修改、中文转义等痛点,是兼顾 SEO 与稳定性的最优解。 下面详细分析各方案的优缺点,根据实际需求选择。 默认配置Hexo 生成永久链接的常规设置位于站点根目录的 _config.yml 文件中,如下所示: 12345permalink: :year:month:day:hour:minute:second.html permalink_defaults: pretty_urls: trailing_index: true # 设为 false 可移除 URL 末尾的 'index.html' trailing_html: true #...
图片压缩与格式优化指南
太大的图片不仅会影响加载速度,而且会让捉襟见肘的网站流量变得更多,为此有必要在上传图片前先确认下图片的大小,如果图片太大建议先进行一下图片的压缩。 图片压缩那么如何压缩图片呢?个人使用的是一个在线的网站工具:tinypng.com,完全免费,可以批量压缩 20 张图片,最大 5MB。 该网站还提供了: API ,开发者可以调用它来为自己的产品提供图片压缩服务,但每月只能调用 500 次。 Mac 的桌面端工具 TinyPNG4Mac,开源在 GitHub,可以压缩超过 5M 的图片。 webp / avif 格式webp 和 avif 格式比起传统的 jpg 格式体积更小,也是目前非常主流的图片格式。 WebP 使用了更优的图像数据压缩算法,能带来更小的图片体积。例如微信文章里的很多图片都是 webp 格式。avif 格式压缩的更厉害,体积更小。一些主流网站使用的图片就是avif格式的。 但是这两种格式得考虑兼容性问题,读者可以去 caniuse.com 搜索各大浏览器的兼容情况。 感兴趣的同学可以参考以下博客进行了解 什么是WebP?使用WebP格式的图片提供网...
Hexo插件:移除图片默认 alt 属性
Hexo 生成图片时,若未手动设置 alt,默认使用文件名作为替代文本,可能导致无意义内容。若希望彻底移除所有 <img> 标签的 alt 属性,在主题或者根目录的scripts/remove-img-alt.js里加入以下代码, 1hexo.extend.filter.register('after_render:html', function (str) { return str.replace(/<img(.*?)alt=".*?"(.*?)>/g, '<img$1$2>'); }); 此代码在 HTML 渲染后移除所有 alt。 注意:这会一并删除手动添加的有意义 alt,请按需使用。 scripts这个文件夹需要自己创建,Hexo 的规则是: 只要在 Hexo 根目录或主题目录(和 _config.yml 同一层级)下有 scripts/ 目录,里面放的 .js 文件会在生成站点时自动执行。
Hexo移除图片默认 alt 属性
Hexo 生成图片时,若未手动设置 alt,默认使用文件名作为替代文本,可能导致无意义内容。若希望彻底移除所有 <img> 标签的 alt 属性,在主题或者根目录的scripts/remove-img-alt.js里加入以下代码, 1hexo.extend.filter.register('after_render:html', function (str) { return str.replace(/<img(.*?)alt=".*?"(.*?)>/g, '<img$1$2>'); }); 此代码在 HTML 渲染后移除所有 alt。 注意:这会一并删除手动添加的有意义 alt,请按需使用。 scripts这个文件夹需要自己创建,Hexo 的规则是: 只要在 Hexo 根目录或主题目录(和 _config.yml 同一层级)下有 scripts/ 目录,里面放的 .js 文件会在生成站点时自动执行。
jsDelivr 缓存刷新与版本控制
目前 jsDelivr 是一个免费,开源的加速 CDN 公共服务,可以使用 jsDelivr 来做 CDN 加速。 如果更新了版本,通过jsDelivr的链接是无法马上看到的。jsDelivr 的缓存更新时间是 24 小时。 强制刷新如果你需要刷新cdn内容,可通过以下两种方式手动清除缓存: 直接访问刷新链接 在原链接域名前加上 purge. 前缀。 例如原链接: https://cdn.jsdelivr.net/gh/user/repo/file.css 刷新链接: https://purge.jsdelivr.net/gh/user/repo/file.css 使用官方刷新工具 访问 Purge jsDelivr CDN cache,在页面中输入需要刷新的 URL 并提交。 强制刷新后,由于全球边缘节点同步需要时间,部分节点可能仍未更新,因此刷新后立即访问原链接仍有可能看到旧内容。等待y一段时间后再试通常可解决。 推荐方案:使用版本号控制为彻底避免缓存问题,最可靠的方法是在链接中加入版本号(或 commit hash、标签)。 1https://cdn.j...
从零到一键发布:Obsidian + Hexo + GitHub Pages 个人博客搭建指南
前言我一直使用 Obsidian 管理笔记,它很好地满足了我的写作需求。但我始终渴望拥有一个属于自己的博客——一方面希望将积累的知识分享出去,获得反馈;另一方面,通过维护博客倒逼自己持续写作和总结,提升表达能力。 本文将完整记录我搭建博客的过程,并重点解决从 Obsidian 写作到博客发布的自动化流程。如果你也想打造一个“赛博小窝”,希望我的经验能给你带来一些参考。 搭建方案我的博客基于以下工具组合实现: 写作端: Obsidian,笔记的写作组织工具。 同步插件:Enveloppe:将本地文章同步到GitHub的Obsidian插件。 博客框架: Hexo:博客站点使用的框架。 主题:hexo-theme-matery:简洁美观的响应式主题。 托管平台:GitHub Pages:免费静态网页托管。 由于我不希望公开所有文章的源文件,我创建了两个 GitHub 仓库: 私有仓库 hexo-project – 存放 Hexo 博客配置、主题和文章源文件。 公共仓库 <用户名>.github.io – 存放 Hexo 生成的静态文件,供 GitHub Pages...
解耦复杂业务:基于责任链与上下文的重构实战
起因在版本迭代的过程中发现,订单计算的方法过于复杂,在新增或者修改功能时往往需要通篇将方法通读一遍甚至多遍,不能迅速找到应该修改的地方进行功能的改造,通过分析发现存在以下的缺陷(姑且称之为缺陷) 没有进行逻辑划分,代码行数太长 没有进行有效的封装抽象,虽然将部分代码封装成函数,但是函数放在一个类中,又造成了订单服务这个类变成了大泥球的类 业务逻辑不统一,比如签名校验的逻辑散落在方法的各个地方 业务语义性不强,各种get set遍布,无法体现出业务的含义 重构过程 过程分解对于复杂度较高的代码,无论是进行代码的重构还是在此基础上进行功能的迭代,对于过程的分解是必不可少的。通过通篇阅读代码,整个订单计算的逻辑可以分解为几部分组成 得到上面分解后的逻辑,那么想到的自然是分而治之,根据分解的逻辑将功能抽象到一个方法中,然后在订单计算的方法中进行依次调用即可。这样做虽然能够将订单计算的逻辑整理的相对容易阅读,但是所有的业务代码全都写在订单业务的一个类中,造成类的膨胀,让订单业务类变成一个大泥球的类,影响这个类的可阅读性,而且也不能做到逻辑代码的整体复用。 那么我们就需要将这些业务逻辑...
单元测试的困境与破局:为何我们不愿写,以及如何高效地写
单元测试作为软件质量的重要一环,往往在整个开发流程中被大多数开发人员所忽略,本文旨在分析如何写好单元测试并探索一些测试驱动开发的应用。 单元测试原则在写单元测试前,先要明确什么是单元测试,单元测试的原则是什么?明确这些问题前不妨先参考一下前人总结的单元测试First原则。 在工作过程中经常见到一些无效的单测,通常是启动Spring容器、连接数据库、调用方法,最后控制台输出结果,这种并不能称之为有效的单测。 12345678910111213@RunWith(SpringRunner.class)@SpringBootTestpublic class HelloServiceTest { @Autowired private UserService userService; @Test public void addUserTest() { AddUserRequest addUserRequest = new AddUserRequest("zhangsan", "1886589985...
告别分类焦虑:让笔记自然生长流动
起点:被分类束缚的笔记时光在学生时代,我养成了体系化学习的习惯,这种习惯延伸到笔记管理上,就表现为严格的分类存储——每次创建笔记时,首先思考的是“这个文件应该放在哪个文件夹”。这种基于文件夹分类的组织方式,在整理时确实直观清晰,让我能够快速定位到需要的资料。 困境:当分类遇到复杂知识然而,随着接触的知识领域越来越广,我逐渐发现一个棘手的问题:现实世界中的知识往往是多维交叉的,一份笔记很难被简单地归入单一分类。 遇到的挑战: 同一份笔记既属于A类别,也属于B类别 记录灵感闪念时,难以立即找到合适的分类 创建笔记前的分类思考成了额外的心智负担 知识之间的关联被文件夹结构人为割裂 尝试:标签系统的希望与失望为了解决多分类问题,我开始尝试使用标签系统。理论上,标签能够为笔记提供多维度的分类方式,打破文件夹的线性束缚。 实践结果: ✅ 确实解决了笔记的多分类问题 ❌ 标签数量失控增长 ❌ 部分标签下只有1-2个文件,失去分类意义 ❌ 大量标签反而增加了管理复杂度 ❌ 最终还是陷入了“如何打标签”的新一轮思考负担 标签系统在理论上很美好,但在实践中,我发现自己陷入了...
进制转换与数据编码
进制转换R进制转十进制R进制转十进制使用按权展开法,具体操作是将R进制的每一位数值使用$R^K$的形式表示,K表示该位与小数点的距离,当该位位于小数点左边,K表示该位和小数点之间间隔数字的个数,当该位位于小数点右侧,K是负数,其绝对值是该位与小数点之间数字个数加1 例如:二进制 转 十进制 $$ 10100.01 = 1 \cdot 2^4 + 1 \cdot 2^2 + 1 \cdot 2^{-2} $$七进制 转 十进制 $$ 604.01 = 6\cdot7^2+4\cdot7^0+1\cdot7^{-2} $$ 十进制转R进制十进制转R进制使用短除法例如将94转换成二进制数 123456794 ÷ 2 = 47 余 047 ÷ 2 = 23 余 123 ÷ 2 = 11 余 111 ÷ 2 = 5 余 15 ÷ 2 = 2 余 12 ÷ 2 = 1 余 01 ÷ 2 = 0 余 1 将余数从后往前书写就是对应的二进制 1011110 二进制转八进制二进制的 111 表示 八进制的 7,000表示八进制的0,二进制转换成八进制时,将二...
高并发基石:IO多路复用深度剖析
用户空间-内核空间我们通常将操作系统内核和应用程序运行的空间分为内核空间和用户空间,这是为了提供保护和控制。下面将详细解释这两个概念,并给出它们之间的区别和交互方式。 用户空间(User Space):这是应用程序运行的空间。它只能访问受限的资源,不能直接访问硬件设备等敏感资源。如果应用程序需要执行特权操作(如读写磁盘、发送网络数据包等),它必须通过系统调用(System Call)请求内核代为执行。 内核空间(Kernel Space):这是操作系统内核运行的空间,具有最高的特权级别,可以访问所有硬件资源和内存。内核负责管理进程调度、内存管理、设备驱动、系统安全等。 为什么要有这样的分离? 稳定性与安全性:如果应用程序可以直接访问硬件和内核数据,那么一个应用程序的错误可能导致整个系统崩溃。通过分离,即使应用程序崩溃,也不会影响内核和其他应用程序。 多任务与资源管理:内核可以公平地分配资源给多个应用程序,并防止应用程序之间相互干扰。 虚拟内存:每个进程都有自己的虚拟地址空间,其中一部分映射到内核空间,一部分映射到用户空间。这样,每个进程都认为它独占了整个内存,而实际上...







