自从 jsDelivr 速度下降后,现在连访问也出现了问题。
所以分享个利用 Hexo 的插件系统,批量替换 Butterfly 主题 CDN 的方法。

步骤

创建文件

创建一个 JavaScript 脚本文件,放到 scripts 文件夹。

增加代码

请根据主题版本选择。

modify.js
1
2
3
4
5
6
7
8
9
10
11
'use strict';
const { filter } = hexo.extend;

// 替换 CDN
filter.register('before_generate', () => {
const { asset } = hexo.theme.config;
for (const name in asset) {
asset[name] = asset[name]
.replace('//cdn.jsdelivr.net/npm/', '//npm.elemecdn.com/');
}
}, 11);
modify.js
1
2
3
4
5
6
7
8
9
10
11
'use strict';
const { filter } = hexo.extend;

// 替换 CDN
filter.register('before_generate', () => {
const { CDN } = hexo.theme.config;
for (const name in CDN) {
CDN[name] = CDN[name]
.replace('//cdn.jsdelivr.net/npm/', '//npm.elemecdn.com/');
}
}, 11);

按需修改

根据需要更改 replace 方法的参数,上文是将 jsDelivr 替换为 饿了么。

原理

参考主题 config.js 的代码。
主题会在运行时,根据配置文件动态生成链接并增加到配置中。
那么我们只需要再用相同的方式,微调一下就能做到批量替换了。

在 Hexo 注册 before_generate 过滤器,设置优先级为 11。
触发时,遍历配置中的 asset 选项并替换链接。

过滤器的默认优先级是 10,所以我们设置成 11。
确保等主题处理完配置之后再运行。