hexo这个模板的大小写
HEXO这个模板的大小写
之前遇到了很奇妙的问题,举个例子:
我在hexo的scaffolds中写了Dev-Env.md为
1
2
3
4
5
6
7
8
9
title: {{ title }}
date: {{ date }}
updated: {{ date }}
cover: /img/Cover-Dev-Env.jpg
categories:
- Dev-Env
tags:hexo new Dev-Env "排列去重问题"后,
我看到的“排列去重问题.md”是 1
2
3
4
5
6---
layout: dev-env
title: 排列去重问题
date: 2026-03-21 06:13:01
tags:
---
这个问题是怎么发生的呢?
是因为没有在YAML中写layout吗
查询Hexo文档,提到:
在新建文章时,Hexo 会根据 scaffolds 文件夹内相对应的文件来建立文件。 例如:
$ hexo new photo "My Gallery"在执行这行指令时,Hexo 会尝试在 scaffolds 文件夹中寻找 photo.md,并根据其内容建立文章。 以下是您可以在模版中使用的变量:
占位符 描述 layout 布局 title 标题 date 文件建立日期
看起来作为scaffolds的文档或许应该有一个layout?
我在Dev-Code.md的开头插入了layout: Dev-Code之后,事情并没有发生变化;
是的,居然真的这么干了
乍看没什么问题,细看就出现了问题:
您可以在模版中使用的变量
layout它是一个变量而不是什么属性;
难道是大小写
虽然按照文档的说法,总结一遍的话就会发现:
1
hexo new {这里} 标题
{这里}可能是个layout,也可能是scaffold的名字;
而且,输出的排列去重问题.md确实有个layout属性,值为dev-env
所以说,可能性呢?有没有可能不知怎么地,hexo传给后续流程的是一个dev-env而不是一个Dev-Env,这导致scaffold机制没有正常生效呢?
为了验证这个疑问,我将scaffolds里的Dev-Env.md改名为dev-env.md,然后再次实验:
1
hexo new Dev-Env "排列去重问题"
这次,就成功地出现了我想要的结果: 1
2
3
4
5
6
7
8title: 排列去重问题
date: 当时的时间
updated: 当时的时间
cover: /img/Cover-Dev-Env.jpg
categories:
- Dev-Env
tags:
所以问题就是这么回事:hexo new ${3} ${4}的参数${3}会被强制转换为小写;
而${3}代表layout或者scaffold的文件名;
因此scaffolds中文件名出现的字母必须全部小写。
关于那个layout
文档只是提了一嘴${3}可以是layout,
后面又提了一嘴${3}可以是scaffold,
甚至没有提“会被转换成小写”这么重要的事情,唯一跟“小写”有关的是这句: |占位符|描述| |—|—| |:title|标题(小写,空格将会被替换为短杠)|
然而经过我的实地测试: 1
hexo new notexist tEstBlog
生成结果是source/_posts/tEstBlog.md:
1
2
3
4
5
6
layout: notexist
title: tEstBlog
date: 2026-04-19 07:37:27
tags:
这就是我要提的第二个重要观察结论了。
当我们使用 1
hexo new ${3} ${4}
(文档有提)当
${3}为draft或post时,会在source/_drafts/或source/中,生成${4}.md或者${4}/index.md;当
${3}转小写之后,为scaffolds中存在的文件名、或是文件名.md之前的部分时,则会套用该脚手架生成标题为${4}的文章;当
${3}转小写后,与scaffolds中的任何文件名、即便去掉.md也不匹配时,会产生一个头部有layout: ${3}的标题为${4}的文章;
new文章时与scaffold们有关的特性
- 如果
scaffolds中存在一个空白内容的文件,而hexo new的时候指定了这个文件,文档没有说会怎么样,实验结论是hexo会崩溃; - 如果
scaffolds的文件中,头部显性含有一个layout:标签,那么生成的文章头中也会有一个layout:标签; - 若
scaffolds头部含有{{ title }},那么这一部分会被${4}以原样替换;
然后总结一下(注意,这只是满足我的好奇心,推测其实现方式,而不是为未定义行为寻找标准):
|命令|scaffolds已有的文件特征|创建的新文章所在位置|新文章文件名|新文章的特征|
|—|—|—|—|—|
|hexo new draft tEstBlog|有draft.md(默认)|source/_draft/|tEstBlog.md|遵循draft.md的规定|
|hexo new post tEstBlog|有post.md(默认)|source/_post/|tEstBlog.md|遵循post.md的规定|
|hexo new page tEstBlog|有page.md(默认)|source/tEstBlog/|index.md|遵循page.md的规定|
|hexo new hLwD tEstBlog|有hlwd|source/_post|tEstBlog.md|遵循hlwd的规定|
|hexo new HLwD tEstBlog|有hlwd.md|source/_post|tEstBlog.md|遵循hlwd.md的规定|
|hexo new HlWd tEstBlog|有HlWd|source/_post/|tEstBlog.md|layout: hlwd title:tEstBlog tag: date:,不遵守post.md的规定|
|hexo new hlWd tEstBlog|同时有hlwd与hlwd.md|source/_post/|tEstBlog.md|遵循hlwd而不是hlwd.md的规定|
|hexo new hlWD tEstBlog|hlwd.md的头部有一行somewhat: {{ layout }}|source/_post/|tEstBlog.md|遵循hlwd.md规定,头部有一行somewhat: hlwd|
|hexo new HlWd tEstBlog|hlwd.png|source/_post/|tEstBlog.md|遵循hlwd.png(markdown)的规定|
|hexo new Hlwd tEstBlog|hlwd.png.jpg|source/_post/|tEstBlog.md|layout: hlwd title: tEstBlog date: tags:|
|hexo new HlWD.png tEstBlog|hlwd.png.jpg|source/_post/|tEstBlog-png.md|遵循hlwd.png.jpg(markdown)的规定,特别地,{{ title }}被解析为tEstBlog.png|
所以可以判断得出,除了draft和post有自己的特殊处理方式以外,其它的hexo new行为会导致:
将scaffolds中所有文件名取出,截断最后一个.及其之后的部分,将之前的部分“原样”与${4}“小写变换之后”比对,
对于匹配的,依照该脚手架文件进行“原样”创建,并且替换其中的{{ title }} {{ date }}为${4}和YYYY-mm-dd HH:MM:SS格式的创建时间,
对于{{ layout }},则以${3}的全小写变换进行替换;
对于不匹配的,创建类似的文档source/_post/${4}.md:
1
2
3
4
5
6
layout: ${3}
title: ${4}
date: YYYY-mm-dd HH:MM:SS
tags:post.md中读取格式;
结论
基于这样的观察,我决定以这样的形式维护hexo的scaffolds目录:
1
2
3
4
5
6
7
8
9
10scaffolds
├── blogmaintenance.md
├── dev-code.md
├── dev-env.md
├── draft.md
├── knowledgemark.md
├── page.md
└── post.md
1 directory, 7 files
并且类似这样写模板:
1
2
3
4
5
6
7
8
9
10
11
12
13---
title: {{ title }}
date: {{ date }}
updated: {{ date }}
cover: /img/Cover-Dev-Env.jpg
categories:
- Dev-Env
tags:
---
{{ title }}
===========
头部之外的这个
并不会被替换,但是可以留着占个位置,方便进行CV工程。
Knighthana
2026/04/19