Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >修改Hexo自动生成的HTML文件名

修改Hexo自动生成的HTML文件名

作者头像
编程大道
发布于 2019-07-15 08:46:19
发布于 2019-07-15 08:46:19
2.1K00
代码可运行
举报
文章被收录于专栏:编程大道编程大道
运行总次数:0
代码可运行

导读

我们在使用Hexo框架生成静态博客时,其实是将你写好的.md文件输出成HTML文件进行渲染,其中HTML的文件名称就是.md的文件名称。

而我们为了编辑文章方便,为了通过文件名就知道这是哪篇文章,通常是把.md文件命名成中文的甚至是文章的标题,那么生成HTML文件时也就是中文的文件名了。

例如:钢铁是怎么炼成的.md经过 hexo g 命令会生成钢铁是怎么炼成的.html;执行 hexo d 命令会将文件推送到你的仓库,那么你访问这篇章时,对应的地址栏就是 http://xxxx/.../钢铁是怎么炼成的.html ,这样看起来很别扭,对搜索引擎也不友好。

那么我们如何修改为以数字加字母命名的HTML呢?今天我们就来探究一下。

(1)修改生成HTML时的命名策略

我们从Hexo是基于Node.js的,Hexo生成HTML文件这句话的到启发,Hexo肯定会获取文件夹下的所有.md文件生成HTML文件,命名格式xxx.md-->xxx.html,然后肯定会创建目录存放HTML文件。

这时候我们会想,我们是不是可以在Hexo生成HTML文件时,修改HTML的命名策略,即将原始的命名方式改为我们自定义的命名方式?

有了思路说干就干。于是去Hexo的各个文件里去找,它是在哪转换文件的。当我找了好几个文件后,我放弃了,文件太多了,太难找了,无异于大海捞针。在hexo模块里找了很久也没找到。。。

(2)修改HTML文件名

既然刚才那种方法行不通,那么我们就另辟蹊径,在Hexo生成HTML文件后,再去修改文件名。

JS怎么获取目录下的所有文件呢?搜了一下说Node.js可以,刚好Hexo是基于Node.js的。

于是任意目录下(除hexo目录)创建rename.js文件如下,其中新的文件名生成策略可以自己定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//引入fs操作文件
var fs = require('fs');
//引入jquery
var join = require('path').join;
var jsdom = require('jsdom');
const {JSDOM} = jsdom;
const {document} = (new JSDOM('<!doctype html><html><body></body></html>')).window;
global.document = document;
global.window = document.defaultView;
global.jQuery = require('jquery')(window);
const $ = require('jquery')(window);


var eng = ['a','b','c','d','e','f','g','h','i','j'];
//生成随机6位数字字母 全路径新文件名
function getNewNameRandom(_file){
  var fiveInt = Math.floor(Math.random()*89999+10000);//五位随机数
    var eng_index = Math.floor(Math.random()*10+1);//一位字母
  return _file.substr(0,_file.lastIndexOf('\\')+1) + eng[eng_index-1] + fiveInt + ".html";//新文件名,全路径
}
function getAllFiles(jsonPath){
    let jsonFiles = [];
    function findJsonFile(path){
      let files = fs.readdirSync(path);
      files.forEach(function (item, index) {
          let fPath = join(path,item);
          let stat = fs.statSync(fPath);
          if(stat.isDirectory() === true) {
              findJsonFile(fPath);
          }
          if (stat.isFile() === true) { 
            jsonFiles.push(fPath);
          }
      });
  }
    findJsonFile(jsonPath);
    console.log(jsonFiles);//指定目录下的文件,包括子目录
    return jsonFiles;
}
function doFileRename(){
  var jsonFiles = getAllFiles("F:/static/page");//生成的HTML文件
  for(var i=0;i<jsonFiles.length;i++){
      var _file = jsonFiles[i];
    var newName = getNewNameRandom(_file);//新文件名,全路径
    console.log(newName)
    fs.rename(_file,newName,function(err){//重命名
      if(err){
        console.log("重命名失败");
      }else{
        console.log("重命名成功");
      }
    })
    }
}
doFileRename();

然后在这个JS所在目录打开命令行,执行node rename.js

看日志,是全部成功了,找到对应目录,真的成功了。

存在的问题

再次hexo g时,又会生成原来的那样中文命名的HTML,我们重命名的还在(执行 hexo clean 就不在了),这不是我们想要的,或许你会说,再执行一次 node rename.js,这不是我想要的,因为,这样执行每次原来的文章页面的名字都会变,我不知道这会不会影响SEO,即时不会也不想这样,因为加入别人收藏了你的文章链接,但你的文章HTML名字变了,拿别人收藏的就无效了啊。

所以这种方式会存在这个最严重的问题。

(3)Base64生成文件名

修改JS代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//引入fs操作文件
var fs = require('fs');
//引入jquery
var join = require('path').join;
var jsdom = require('jsdom');
const {JSDOM} = jsdom;
const {document} = (new JSDOM('<!doctype html><html><body></body></html>')).window;
global.document = document;
global.window = document.defaultView;
global.jQuery = require('jquery')(window);
const $ = require('jquery')(window);


var eng = ['a','b','c','d','e','f','g','h','i','j'];
//文件名Base64后 根据算法从编码中取6位作为新文件名
function getNewNameBase64(_file){
  var fileName = _file.substr(_file.lastIndexOf('\\')+1,_file.length);//文件名
  var fi_bs64 = Buffer.from(fileName.substr(0,fileName.lastIndexOf('.'))).toString('base64')//转成base64编码
  var arr = fi_bs64.split("");
  var len = arr.length;
  var fis = "";
  for(var i=1;i<=6;i++){
    var s1 = arr[Math.floor(len/(2*i))];
    if(s1=='/'||s1=='+'){
      var eng_index = Math.floor(Math.random()*10+1);
      s1 = eng[eng_index-1];
    }
    fis = fis + s1;
  }
  console.log(fis)
  return _file.substr(0,_file.lastIndexOf('\\')+1) + fis + ".html";
}
function getAllFiles(jsonPath){
    let jsonFiles = [];
    function findJsonFile(path){
      let files = fs.readdirSync(path);
      files.forEach(function (item, index) {
          let fPath = join(path,item);
          let stat = fs.statSync(fPath);
          if(stat.isDirectory() === true) {
              findJsonFile(fPath);
          }
          if (stat.isFile() === true) { 
            jsonFiles.push(fPath);
          }
      });
  }
    findJsonFile(jsonPath);
    console.log(jsonFiles);//指定目录下的文件,包括子目录
    return jsonFiles;
}
function doFileRename(){
  var jsonFiles = getAllFiles("F:/static/page");//生成的HTML文件
  for(var i=0;i<jsonFiles.length;i++){
      var _file = jsonFiles[i];
    var newName = getNewNameBase64(_file);//新文件名,全路径
    console.log(newName)
    fs.rename(_file,newName,function(err){//重命名
      if(err){
        console.log("重命名失败");
      }else{
        console.log("重命名成功");
      }
    })
    }
}
doFileRename();

效果如下,看日志,是全部成功了

找到对应目录,真的成功了。

存在的问题

这种方法解决了上面那个方法存在的问题,即每次执行`node rename.js`只要原文件名不变,生成的新文件名不变。但是需要限制文件名不能变,否则新文件名还是会变。还有一点不能重复执行 node rename.js ,因为会根据新的再次生成新的。

小结

第2、3种方式都需要注意的是,

1、新名字的生成规则,要保证唯一性,不能重复

2、每次 hexo g 之后 hexo d 之前,要执行 node rename.js

3、不要重复执行

4、第一种不太可行,推荐第二种

(4)修改文件生成规则

以上两种方式都需要我们来写代码,而且要手动执行 node rename.js

对于这么懒的我来说很不方便,有没有更好的办法?答案是肯定的。

我们可以找到Hexo的根配置文件_config.yml,打开它,找到下图这个

我把他改成这样了,page是目录,执行 hexo g 会在public下生成,我让生成的HTML文件都放在page下,:fileName.html 是HTML的命名格式,其中 fileName 是个变量。这个变量从哪来?

从你的.md文件里,如下图,在你的文章头部增加这个变量并指定一个值,这就是生成HTML时的文件名,注意也是不要和其他文件重复

也就是说,你的每篇文章只要头部加了这个属性,并赋值且确保唯一就OK了,不用像上面那两种方式那样麻烦了。

只样在执行 hexo g 后就变成这样了

执行 hexo d 后访问我的网站就是这样了,我的个人博客:

https://itwalking.top 欢迎访问

为了避免忘记在写文章时写fileName属性,我们可以修改模板,在scaffolds目录下有三个模板

在模板添加fileName属性

存在的问题

需要手动写文件的名字,且要保证唯一,但是比较方便

总结

推荐使用第3和第4种,第3种主要就是解决每次执行hexo g后生成的HTML文件名不变(前提是.md文件名不变),但不要忘了执行 node rename.js;第4种只要自己有一个自己的命名规范就好了,比如:今天是五月m,日期29,周三w,时间是17点,文件名就可以就是m29w17。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BiggerBoy 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安装Kibana
地址:https://www.elastic.co/cn/downloads/past-releases/kibana-6-7-2
HLee
2021/01/04
1K0
安装Kibana
Elastic Stack之 Kibana 6.7.1版本安装
1、截至目前Elasticsearch 版本已经更新到了7.10.1版本了,这里先使用Kibana 6.7.1版本,给一个下载地址,如下所示:
别先生
2021/01/13
7150
Elasticsearch 5.x 安装X-Pack
x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,也是官方推荐的。
程裕强
2022/05/06
7330
Elasticsearch 5.x 安装X-Pack
elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
  刚从事开发那段时间不习惯输出日志,认为那是无用功,徒增代码量,总认为自己的代码无懈可击;老大的叮嘱、强调也都视为耳旁风,最终导致的结果是我加班排查问题,花的时间还挺长的,要复现问题、排查问题等,幸亏那是公司内部员工用的系统,时间长一点也没什么大问题,但是如果是针对客户的,时间就代表很多东西了,那造成的影响就非常大了。自那以后养成了输出日志的习惯。
青石路
2018/09/10
1.4K0
elk + filebeat,6.3.2版本简单搭建,实现我们自己的集中式日志系统
ElasticStack的入门学习
1、Elasticsearch 6.x版本的安装,我这里使用Elasticsearch 6.7.0版本的。
别先生
2019/10/29
6570
ElasticStack的入门学习
可视化kibana搭建
安装包下载 注意elasticsearch版本应与kibana版本一致,否则error # 1.上传服务器解压 [root@summer opt]# tar xvf kibana-6.3.1-linux-x86_64.tar.gz # 2.修改配置文件 配置文件路径 kibana-6.3.1-linux-x86_64/config/kibana.yml 主要修改点 server.host: "192.168.0.9" elasticsearch.url: "http://192.168.0.9:2
summerking
2022/09/19
3250
可视化kibana搭建
ELK 搭建4
安装kibana 准确来说,只用解压就可以了 [root@h102 ELK]# ls elasticsearch-2.1.1.rpm GPG-KEY-elasticsearch kibana-4.3.1-linux-x64.tar.gz logstash-2.1.1-1.noarch.rpm [root@h102 ELK]# tar -zxvf kibana-4.3.1-linux-x64.tar.gz kibana-4.3.1-linux-x64/ kibana-4.3.1-linux-x64/b
franket
2022/02/11
2700
ELK5.0安装教程
ELK升级后,安装稍微发生了点变化,在Elasticsearch中增加了很多资源上的限制,其他的倒是没什么变化。不过所有的安装都是基于JDK已经安装完的情况,且为1.8版本。 安装Elasticsearch 在官网下载elsaticsearch安装包: 下载地址 下载对应版本拷贝到服务器,然后执行下面命令解压缩: tar -zxvf elasticsearch-5.2.2.tar.gz 解压后进入对应的目录,修改配置文件: cluster.name: page-cluster node.name:
用户1154259
2018/01/17
9210
Kibana 基础3
配置 修改 config/kibana.yml 中的 elasticsearch 配置 [root@h101 kibana]# cd kibana-4.3.1-linux-x64/config/ [root@h101 config]# ls kibana.yml [root@h101 config]# grep -v "^#" kibana.yml | grep -v "^$" [root@h101 config]# vim kibana.yml [root@h101 config]# grep -v "
franket
2022/02/10
3280
ElasticSearch 6.x 学习笔记:3.Kibana插件
注意,ElasticSearch版本是6.1.1,kibana的版本必须对应,所以,此处下载kibana-6.1.1-linux-x86_64.tar.gz
程裕强
2022/05/06
4870
ElasticSearch 6.x 学习笔记:3.Kibana插件
ELK Stack最新版本测试一安装篇
filebeat1.0.0-rc2  logstash2.0.0-1  elasticsearch2.0.0  kibana4.2
三杯水Plus
2018/11/14
5560
部署 Kubernetes 集群日志插件 Fluentd、Elasticsearch、Kibana
哎_小羊
2018/01/02
7.5K0
部署 Kubernetes 集群日志插件 Fluentd、Elasticsearch、Kibana
12-部署EFK插件
配置和安装 EFK 官方文件目录:cluster/addons/fluentd-elasticsearch $ ls *.yaml es-controller.yaml es-service.yaml fluentd-es-ds.yaml kibana-controller.yaml kibana-service.yaml efk-rbac.yaml 同样EFK服务也需要一个efk-rbac.yaml文件,配置serviceaccount为efk。 已经修改好的 yaml 文件见:EFK 配置 es
程序员同行者
2018/07/03
1.1K0
ElasticSearch安装与启动
检查JDK版本之后,我们可以下载并运行Elasticsearch。 二进制文件可以从 www.elastic.co/downloads 获取,过去版本也可以从中获取。 对于每个版本,您可以选择zip或tar存档,或DEB或RPM软件包。 为了简单起见,我们使用tar文件。
smartsi
2019/08/07
1K0
ElasticSearch 6.x 学习笔记:elasticsearch+logstash+kibana 6.1.1
https://www.elastic.co/downloads/past-releases/logstash-6-1-1
程裕强
2022/05/06
2720
CentOS7搭建ELK-6.2.3版本
ELK是ElasticSerach、Logstash、Kibana三款产品名称的首字母集合,用于日志的搜集和搜索,今天我们一起搭建和体验基于ELK的日志服务;
程序员欣宸
2022/05/09
5330
CentOS7搭建ELK-6.2.3版本
ES、Kibana 的安装
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
后端码匠
2021/08/21
7330
如何搭建 Elasticsearch-kibana 环境
es使用java编写,安装es之前,需要先检查jdk环境,一般要求在1.7以上,如果没有安装jdk,建议直接安装1.8版本。安装过程参考:https://blog.csdn.net/weixin_39800144/article/details/78836289
IT云清
2019/01/22
2K1
通过ELK快速搭建集中化日志平台
在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散落在各个服务器的logs文件夹下,确实有点不大方便,这个时候就想到了,在log4net中配置 mysql的数据源,不过这里面有一个坑,熟悉log4net的同学知道写入mysql有一个batch的阈值,比如说batchcache中有100条,才写入mysql,这样的话,就有一个延迟的效果,而且如果batchcache中不满100条的话,你在mysql中是看不到最新的100条日志。而且采用中心化的mysql,涉及到tcp传输,其中的性能大家也应该明白,而且mysql没有一个好的日志界面,只能自己去写UI,所以还还得继续寻找其他的解决方案,也就是本篇的ELK。
星哥玩云
2022/07/19
6782
通过ELK快速搭建集中化日志平台
浅谈ElasticSearch架构以及集成
Elasticsearch是一个高度可扩展的开源的分布式Restful全文搜索和分析引擎。它允许用户快速的(近实时的)存储、搜索和分析海量数据。它通常用作底层引擎技术,为具有复杂搜索功能和要求的应用程序提供支持。以下是ES可用于的一些场景:
chengcheng222e
2021/11/04
8050
相关推荐
安装Kibana
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验