news 2026/6/23 6:56:04

Hexo时钟插件,修改自 hexo-butterfly-clock-remake ,新增高德地图 IP 定位支持

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hexo时钟插件,修改自 hexo-butterfly-clock-remake ,新增高德地图 IP 定位支持

最近在维护博客侧边栏时,遇到了一次非常典型、也非常“真实”的问题:

最近刚换上的 Hexo 时钟插件,突然因为第三方 API 挂了,直接失效。

这篇文章记录了我从问题出现到完整解决的全过程,包括插件改造与 npm 发布。


这篇文章会讲什么

  • 排查hexo-butterfly-clock-remake失效原因

  • 自行修改并重写 IP 定位逻辑

  • 接入高德地图 Web 服务 API

  • 打包并发布自己的 npm 插件

  • 完成Hexo 插件的安装与更新


一、问题背景:IP 定位接口失效

我上一篇 Blog 使用的是下面这个插件:

hexo-butterfly-clock-remake
用于 Butterfly 主题侧边栏显示:时间 + 天气 + 城市

原插件依赖的 IP 定位接口为:

https://api.vore.top/api/IPdata

某天开始出现异常,表现为:

  • 插件完全不渲染

  • 浏览器控制台请求失败

结论非常明确:

第三方 IP 定位 API 已不可用(接口直接炸了)

而插件本身已经多年未维护,也没有任何备用定位方案。


二、解决思路:用高德地图 Web 服务接管 IP 定位

问题集中在IP → 城市这一步,因此整体思路非常清晰:

  • 保留原有插件结构与注入方式

  • 只替换 IP 定位来源

  • 不影响原有和风天气(QWeather)逻辑

为什么选择高德地图?

高德地图 Web 服务提供了稳定可靠的 IP 定位接口:

https://restapi.amap.com/v3/ip?key={你的Key}

优点非常明显:

  • 接口稳定

  • 国内访问速度快

  • 返回城市 / 省份信息已足够使用

  • 免费额度对博客场景完全充足


三、我具体做了哪些改动

1. 新增配置项

在站点配置或主题配置中新增一项:

gaud_map_key: xxxxxxxxxxxxxxxxxxxxx

说明:

  • 这是高德地图 Web 服务 Key

  • 与 JS SDK Key 不同

  • 专用于 IP 定位接口


2. 修改 IP 获取逻辑

原逻辑(简化)

IP API → city → QWeather

新逻辑

高德 IP API → city / province → QWeather

当 IP 接口返回的city为空时,自动 fallback 到province,最大限度避免出现「未知城市」。


四、为什么我选择单独发布一个新插件

我没有直接向原仓库提 PR,而是选择:

  • 独立维护

  • 保持向下兼容

  • 重新发布 npm 包

  • 不影响原插件用户

最终插件命名为:

hexo-butterfly-clock-veeink

📦 GitHub 仓库地址:
👉 https://github.com/kitia01/hexo-butterfly-clock-veeink

这是一个只增强、不破坏的改进版本。


五、发布 npm 包的全过程

1. 登录 npm

npm login

按提示输入:

  • npm 用户名

  • 密码

  • 邮箱

  • OTP(如开启 2FA)


2. 配置package.json

确保关键信息正确:

{ "name": "hexo-butterfly-clock-veeink", "version": "1.0.0", "main": "index.js", "keywords": ["hexo", "butterfly", "clock"], "license": "MIT" }


3. 发布到 npm(重点)

npm publish

⚠️ 注意:npm不允许覆盖已发布版本号,每次发布必须升级版本。


六、Hexo 中如何安装 / 更新插件

1️⃣ 安装

(1)卸载旧时钟插件(如存在)
npm uninstall hexo-butterfly-clock npm uninstall hexo-butterfly-clock-anzhiyu npm uninstall hexo-butterfly-clock-anzhiyu-yang npm uninstall hexo-butterfly-clock-remake
(2)安装本插件

npm install hexo-butterfly-clock-veeink


2️⃣ 使用方式

(1)添加配置

在站点配置_config.yml或主题配置_config.butterfly.yml中加入:

使用前需注册和风天气开发者账号
👉 https://dev.qweather.com

# electric_clock # see:https://github.com/kitia01/hexo-butterfly-clock-veeink electric_clock: enable: true # 插件开关 priority: 5 # 过滤器优先级 enable_page: all # 应用页面,可写特定路径或 "all" exclude: # 排除页面,可留空或写具体路径 # - /posts/ # - /about/ layout: type: class # 容器类型,class 或 id name: aside-content # 目标容器的 class 或 id # insert_before: user-countdown # 插入到该元素前面 insert_after: card-announcement # 插入到该元素后面(二选一) loading: https://cdn.cbd.int/hexo-butterfly-clock-veeink@1.0.0/lib/loading.gif clock_css: https://cdn.cbd.int/hexo-butterfly-clock-veeink@1.0.0/lib/clock-min.css clock_js: https://cdn.cbd.int/hexo-butterfly-clock-veeink@1.0.0/lib/clock-min.js qweather_api_host: {YOUR API HOST} qweather_key: {YOUR KEY} # 新增:高德地图 Web 服务 Key gaud_map_key: {YOUR KEY} # 高得地图web服务key default_city: "资兴"

(2)参数说明
参数类型释义
prioritynumber【可选】过滤器优先级,数值越小,执行越早,默认为10,选填
enabletrue/false【必选】控制开关
enable_pagepath【可选】填写想要应用的页面,如根目录就填’/‘,分类页面就填’/categories/'。若要应用于所有页面,就填all,默认为all
excludepath【可选】填写想要屏蔽的页面,可以多个。写法见示例。原理是将屏蔽项的内容逐个放到当前路径去匹配,若当前路径包含任一屏蔽项,则不会挂载。
layout.typeid/class【可选】挂载容器类型,填写id或class,不填则默认为id
layout.nameid/class【必选】挂载容器名称
layout.insert_beforeid/class【可选】 插入到该元素前面(二选一)
layout.insert_afterid/class【可选】插入到该元素后面(二选一)
loadingURL【可选】电子钟加载动画的图片
clock_cssURL【可选】电子钟样式CDN资源
clock_jsURL【可选】电子钟执行脚本CDN资源
qweather_keykey【必选】和风天气 key
qweather_api_hostURL【必选】和风天气 api_host
gaud_map_keystring【可选】高得地图web服务key,如果没有填写则根据默认城市优先选择
default_citystring【可选】当默认城市为空,优先根据IP定位,填写了默认城市将优先使用默认城市的定位和天气

3️⃣ 重新生成博客

hexo cl hexo g hexo s

确认侧边栏:

  • 时间

  • 天气

  • 城市定位

均正常显示。


七、踩坑记录(真实)

  • ❌ JS 压缩(minify)时错误混淆作用域,运行时报ReferenceError

  • ❌ 过度依赖第三方 API 的稳定性

  • ✅ Key 通过配置传入,而非写死

  • ✅ IP 定位失败时增加 fallback,避免 UI 直接炸掉


八、总结

这次经历让我非常清楚地意识到:

博客长期稳定 ≠ 第三方 API 永久可靠

同时也完整走了一遍 npm 插件发布流程

整体并不复杂,但每一步都有坑。

如果你也在使用hexo-butterfly-clock-remake,并遇到城市定位失效的问题,希望这个插件和这篇记录能帮到你。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:21:59

Logto身份认证系统入门指南:从零构建安全登录体系

Logto身份认证系统入门指南:从零构建安全登录体系 【免费下载链接】logto logto-io/logto: 这是一个用于收集、分析和可视化日志数据的Web工具。适合用于需要收集、分析和可视化日志数据的场景。特点:易于使用,支持多种日志格式,具…

作者头像 李华
网站建设 2026/6/23 19:36:19

【Java毕设全套源码+文档】基于Java的教学评价管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/23 18:41:28

7、自定义报告处理器:Puppet 中的数据处理与监控

自定义报告处理器:Puppet 中的数据处理与监控 在 Puppet 中,报告处理器是一个核心组件,它能帮助我们更好地管理和监控系统。下面将详细介绍如何创建自定义报告处理器,以及如何利用 Puppet 进行数据处理、监控和日志记录。 报告处理器的核心技术 报告处理器的核心技术主要…

作者头像 李华
网站建设 2026/6/23 3:02:36

8、Puppet 报告处理与 PuppetDB 探索

Puppet 报告处理与 PuppetDB 探索 1. 向 MySQL 添加 Puppet 指标和事件 将新的报告处理器添加到 Puppet 主服务器后重启,数据会开始出现在 MySQL 中。不过,仅有的这些数据用处不大,我们需要添加 Puppet 指标来获取更多详细信息。 指标能让我们了解 Puppet 管理的基础设施…

作者头像 李华
网站建设 2026/6/23 11:10:49

14、创建自定义仪表盘:从基础到趋势分析

创建自定义仪表盘:从基础到趋势分析 1. 仪表盘初步观察与数据填充准备 仪表盘通过颜色有效区分不同数据类型,其中“Failed”板块会轻微脉动,这是因为在布局中为该小部件设置了 class="status-danger" 类。此外,还有 class="status-warning" 类,…

作者头像 李华