Loading [MathJax]/jax/input/TeX/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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nodejs批量修改mp3文件名
最近发现以前的SD卡里很多音乐文件出问题了,在LOST.DIR文件夹里,而且文件名变成了一堆数字,还没有后缀。上网查的数据修复的方法都没用,所以决定自食其力,自己修改。批量修改当然就得先弄个办法使用脚本来实现啦。
赤蓝紫
2023/03/16
1.4K0
nodejs批量修改mp3文件名
SpringBoot-13-插曲之Node文件重命名+自动生成json对象
遇到的问题:图片太多,使用起来挺麻烦 [1]有很多图片放服务器里,怎么能更好的管理,更方便拿到图片呢? [2]想用json 以一个对象数组的形式保存这些图片:以[{img:"图片名"},{img:
张风捷特烈
2018/09/26
5740
用 NodeJS 重命名系统文件[每日前端夜话0xB2]
你是在 Node.js 中操作系统文件,并且需要一种简单的方法来以编程方式重命名文件?
疯狂的技术宅
2019/08/30
8990
用 NodeJS 重命名系统文件[每日前端夜话0xB2]
Node入门教程(9)第七章:NodeJs的文件处理
Node的文件处理涉及到前面说的ptah模块,以及fs文件系统、stream流处理、Buffer缓冲器等模块。内容可能比较多,相关内容请以官网文档为主,此处主要以案例讲解为主,分享给大家一些常用的经典案例。细节就不展开了。 fs文件系统 fs模块提供了很多文件操作相关的api,比如:监控文件夹、文件,文件重命名,文件读写,文件修改权限、文件读写流等。 在此,我们仅以几个案例的方式来驱动学习Node的文件系统,细节请详细阅读Node的api文档或者源码。 案例: 如何监控文件夹的变化? 如何读取一个文
老马
2018/04/16
1.5K0
[原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件
本人因为要想自己写个小说网站练练手,在其中遇到的一些问题,将其解决方法总结出来,例如: 1:小说网站存储了大量的小说,每个小说主页都很相似,url不同,不是使用的history属性改写的,所以如果人工
SpiritLing
2018/04/16
3.3K0
[原创] 利用前端+php批量生成html文件,传入新文本,输出新的html文件
React多页面应用4(webpack自动化生成多入口页面)
本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包括Babel、热更新等) ----2017.12.28 2.React多页面应用2(处理CSS及图片,引入postCSS及图片处理等)----2017.12.29 3.React多页面应用3(webpack性能提升,包括打包性能、提取公共包等)----2017.12.30 4.React多页面应用4(webpack自动化生成多入口页面)----201
前端人人
2018/04/11
1.8K1
React多页面应用4(webpack自动化生成多入口页面)
gulp入门(小白级别)
在该项目路径下,我们独立安装gulp:npm install gulp 。此时会生成一个 node_modules 文件夹和一个 package-lock.json 文件,如下图:
celineWong7
2020/11/05
1.4K0
批量修改某个文件夹下的文件名字
down了一些前端资源,想空闲时候学着玩的,但是每个文件后面都有很长的后缀,看着比较烦,大家都有这个烦恼吧? 那就用我这个工具类吧,简单,java跑一下就好 注意:这个是会自动递归子文件夹的,防止误改哦; /** * 批量重命名文件 */ class ReNameFile { /**新字符串,如果是去掉前缀后缀就留空,否则写上需要替换的字符串*/ static String newString = ""; /**要被替换的字符串*/ static String
名字是乱打的
2022/09/29
2K0
Python - 批量修改文件名
python 对文件进行批量改名用到的是 os 模块中的 listdir 方法和 rename 方法。
小菠萝测试笔记
2021/05/18
3.6K0
Hexo自动生成及部署系统
转载至 https://cloud.tencent.com/developer/article/1388235
腾讯云serverless团队
2019/02/21
8.6K0
前端如何实现.md文件转换成.html文件
.md文件是markdown的一种标记语言,和html比较起来,更简单快捷,主要体现在:标记符的数量和书写上。
winty
2020/11/16
3.3K0
自动生成特定组件
每一次的需求都需要在某个文件夹下面新建一个 pages 然后在创建组件,在创建对应的 scss 文件,而且比如需求的页面和之前类似,又得去 Ant Design Pro Component 复制对应的代码,然后今天在做需求时就想在项目内引用一个通过模版自动生成组件的小工具
离殊
2022/04/01
1.4K0
自动生成特定组件
「Python」重命名文件夹内所有文件
请注意,本文编写于 1004 天前,最后修改于 1004 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
6920
Node.js
主要学习:JavaScript+Node.js内置API模块(fs、path、http等)+第三方API模块(express、mysql等)
岳泽以
2022/11/21
8.1K0
Node.js
对象储存cos-腾讯云对象储存cos
COS是腾讯云提供的对象存储服务,功能非常强大,可以作为文件服务器,CDN加速,静态网页服务,还提供了图片的常用操作。
张天华
2019/08/01
24.8K0
对象储存cos-腾讯云对象储存cos
Node.js学习笔记——认识nodejs、详解fs文件系统模块与path路径模块
不同的浏览器使用不同的 JavaScript 解析引擎 Chrome 浏览器 => V8 Firefox 浏览器 => OdinMonkey(奥丁猴) Safri浏览器 => JSCore IE 浏览器 => Chakra(查克拉) 其中,Chrome 浏览器的 V8 解析引擎性能最好!
timerring
2022/07/20
1.7K0
Node.js学习笔记——认识nodejs、详解fs文件系统模块与path路径模块
【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?
具体的属性可以查看官方文档,这里用到的是:before-upload="beforeAvatarUpload" 这个钩子函数,看名字就知道这是在图片上传前执行的方法,在此可以进行一些验证,官方给出了对图片类型以及大小的验证,接下来将实现对图片尺寸的验证.
一尾流莺
2022/12/10
1.3K0
【解决方案】ElementUI图片上传前如何对尺寸进行验证并且上传到新浪SCS?
编程语言对比手册-纵向版[-文件-]
笔名 | QQ|微信| ---|---|---|---| 张风捷特烈 | 1981462002|zdl1994328|
张风捷特烈
2022/09/20
1.2K0
编程语言对比手册-纵向版[-文件-]
在 Linux 中重命名文件夹中的所有文件
在Linux系统中,有时候我们需要批量重命名文件夹中的所有文件,以便更好地组织和管理文件。本文将详细介绍几种在Linux中重命名文件夹中所有文件的方法,包括使用命令行工具和脚本等方式。
网络技术联盟站
2023/06/08
5.9K0
在 Linux 中重命名文件夹中的所有文件
gitalk 自动初始化
​ 前面有篇文章介绍了使用hexo的评论系统gitalk,但是使用过程中有一些小问题,每一篇文章都需要初始化一下issues,不然是无法评论的,如果文章太多,一个一个初始化就太浪费时间和精力,所以借鉴了网上的一些资料完成一个自动化初始评论的需求
caoayu
2020/09/23
9610
gitalk 自动初始化
相关推荐
nodejs批量修改mp3文件名
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验