REVIEW
私たちは、静的なブログがHexoフレームワークを使用して生成すると、実際には、HTMLファイル名た.mdファイル名でレンダリングするためのHTMLファイルにあなたた.md書かれたファイルの出力は、です。
利便性のために我々は、これは通常、中国語にた.mdファイルや、物品のも、タイトルにちなんで命名されているどのような記事は、HTMLファイルを生成するときには、中国のファイル名であることを知っているファイル名を渡すための資料を、編集します。
たとえば:钢铁是怎么炼成的.md
後hexo g
のコマンドが生成され钢铁是怎么炼成的.html
、実行hexo d
コマンドファイルは、あなたの倉庫にプッシュされますので、あなたは、この章を訪問したときに、アドレスバーに対応しているhttp://xxxx/.../钢铁是怎么炼成的.html
ので、優しい検索エンジンではない、非常に厄介に見えます。
それでは、どのよう我々はそれをHTMLの数字と文字の名前を変更するのですか?今日、我々はそれを見ていきます。結果を表示
HTMLを生成するときに(1)名前付けポリシーを変更
私たちはHexo是基于Node.js的,Hexo生成HTML文件
この文鼓舞するために、Hexoフォルダは間違いなく、フォーマットxxx.md命名、すべてのた.mdファイルはHTMLファイルが生成されます- > xxx.html、その後、確かにHTMLファイルのディレクトリを作成します。
我々は、我々がHexoでHTMLファイルを生成することはできませんしたい、HTMLの命名戦略を変更し、この時間は、命名の独自の命名カスタムを変更しようとしていますか?
アイデアを先に行ってきました。だから、HexoのGO TOそれぞれのファイルには、それがどこ変換されたファイルです。私はいくつかのファイルを見つけたとき、私はあまりにも多くの文書、あまりにも、見つけるのは難しい干し草の山で針と何ら変わりがあきらめました。長い時間を探してhexoモジュールを見つけられませんでした。。。
(2)HTMLファイル名を変更
その方法がうまく動作しないので、我々はHexoは、HTMLファイルを生成した後、ファイル名を変更するために行く、新しい道を開きます。
JSはどのディレクトリにその中のすべてのファイルを取得するには?検索、私はちょうどHexoがNode.js.に基づいており、Node.jsの言うことができます
だから、(hexoディレクトリを除く)任意のディレクトリに新しいファイル名が自分の世代の戦略を定義することができ、文書、次rename.jsを作成します。
//引入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
,这不是我想要的,因为,这样每次执行,原来的Html的名字都会变,我不知道这会不会影响SEO,即使不会也不想这样,因为假如别人收藏了你的文章链接,但你的文章HTML名字变了,那别人收藏的就无效了啊。
所以这种方式会存在这个最严重的问题。
(3)Base64生成文件名
修改JS代码
//引入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、第2种不太可行,推荐第3种
(4)修改文件生成规则
以上两种方式都需要我们来写代码,而且要手动执行node rename.js
对于这么懒的我来说很不方便,有没有更好的办法?答案是肯定的。
我们可以找到Hexo的根配置文件_config.yml,打开它,找到下图这个
我把他改成这样了,page是目录,执行hexo g
会在public下生成,我让生成的HTML文件都放在page下,:fileName.html
是HTML的命名格式,其中fileName
是个变量。这个变量从哪来?
あなたの記事の頭の中で、以下に示すように、あなたた.mdファイルには、この変数を増やしてHTMLを生成するときに、ファイル名の値を、割り当て、およびその他のファイルの注意が繰り返されていません
言い換えれば、限り、各記事のヘッドとして、あなたは、このプロパティ、および割り当てを追加して確保することだけでOK、上記の二つの方法ほど面倒ではありません。
この実行ではhexo g
後にそうなりました
実行は、hexo d
そのような場合は後に、私のサイトを訪問します
執筆の時点でfileNameプロパティを記述することを忘れないようにするには、我々はテンプレートを変更することができ、足場の下の3つのテンプレートディレクトリがある
fileName属性テンプレートを追加するには、
問題
必要手動でファイルの名前を書くために、ユニークな確実にするために、より便利に
概要
第三及び第四の使用をお勧めします、第三の主要なは(た.mdファイル名変更しないものとする)そのまま各実行hexoグラムHTMLファイル名の後に生成されたソリューションですが、実行することを忘れないでくださいnode rename.js
限り、彼らのように第四。例えば、のような、独自の命名規則を持っている:今日は5月のメートル、ワット29日、水曜日、時間は17:00である、ことができるファイル名はm29w17です。
あなたはファイル名を変更することができ、または他に良い方法がある場合にHTMLがHexoで生成知っている場合は、あなたが私に教えてメッセージを残すことができ、ありがとうございました。
本明細書に提供されるこの記事および方法は、元の作者、アウト独自の方法では、ソース、感謝を明記してくださいしています!!!