利用hexo搭建博客
首先安装npm和git
npm install -g hexo-cli
对于熟悉 npm 的进阶用户,可以仅局部安装 hexo
包。
$ npm install hexo
在一个地方创建空文件夹(命名blog),所有东西将在里面生成。
打开文件夹,在此文件夹下运行git bash(右键单击空白处)
sudo hexo init #生成博客 初始化博客
这时候系统会自动克隆文件到blog,并默认landscape主题。再输入命令:
hexo s #启动本地博客服务
部署到gitee
输入命令:
hexo clean #清理
hexo g #生成
hexo s #启动本地服务器
创建文章
hexo n "我的第一篇文章" #创建新的文章
hexo d # 部署到仓库
如何消除首页的颜色变化蒙版效果
打开themes文件夹→matery→source→css→matery.css,找到这么一大段代码,注释其中的代码。
@-webkit-keyframes rainbow {
/*注释内容*/
}
@keyframes rainbow {
/*注释内容*/
}
Hexo文章中如何插入图片
在hexo中发表文章时发现自己的图片无法显示,这是因为hexo在解析你的文章时找不到你的图片路径,下面说一下如何配置文章中的图片路径
打开在hexo根目录下的 _config.yml
配置文件,找到 post_asset_folder
属性,默认为 false
改为 true
在hexo根目录下执行如下命令
cnpm install hexo-asset-image
此时再执行命令 hexo n article_name
创建新的文章,在 source/_posts
中会生成文章 post_name.md
和同名文件夹 post_name
,我们将文章中所使用到的将图片资源均放在 post_name
中,这时就可以在文章中使用相对路径引用图片资源了
[img_name](img_name.jpg) #文章中的图片资源路径格式
配置
您可以在 _config.yml
中修改大部分的配置。
网站
参数 | 描述 |
---|---|
title |
网站标题 |
subtitle |
网站副标题 |
description |
网站描述 |
keywords |
网站的关键词。支持多个关键词。 |
author |
您的名字 |
language |
网站使用的语言。对于简体中文用户来说,使用不同的主题可能需要设置成不同的值,请参考你的主题的文档自行设置,常见的有 zh-Hans 和 zh-CN 。 |
timezone |
网站时区。Hexo 默认使用您电脑的时区。请参考 时区列表 进行设置,如 America/New_York , Japan , 和 UTC 。一般的,对于中国大陆地区可以使用 Asia/Shanghai 。 |
其中,description
主要用于SEO,告诉搜索引擎一个关于您站点的简单描述,通常建议在其中包含您网站的关键词。author
参数用于主题显示文章的作者。
网址
参数 | 描述 | 默认值 |
---|---|---|
url |
网址, 必须以 http:// 或 https:// 开头 |
|
root |
网站根目录 | url's pathname |
permalink |
文章的 永久链接 格式 | :year/:month/:day/:title/ |
permalink_defaults |
永久链接中各部分的默认值 | |
pretty_urls |
改写 permalink 的值来美化 URL |
|
pretty_urls.trailing_index |
是否在永久链接中保留尾部的 index.html ,设置为 false 时去除 |
true |
pretty_urls.trailing_html |
是否在永久链接中保留尾部的 .html , 设置为 false 时去除 (对尾部的 index.html 无效) |
true |
网站存放在子目录
如果您的网站存放在子目录中,例如
http://example.com/blog
,则请将您的url
设为http://example.com/blog
并把root
设为/blog/
。
例如:
# 比如,一个页面的永久链接是 http://example.com/foo/bar/index.html
pretty_urls:
trailing_index: false
# 此时页面的永久链接会变为 http://example.com/foo/bar/
目录
参数 | 描述 | 默认值 |
---|---|---|
source_dir |
资源文件夹,这个文件夹用来存放内容。 | source |
public_dir |
公共文件夹,这个文件夹用于存放生成的站点文件。 | public |
tag_dir |
标签文件夹 | tags |
archive_dir |
归档文件夹 | archives |
category_dir |
分类文件夹 | categories |
code_dir |
Include code 文件夹,source_dir 下的子目录 |
downloads/code |
i18n_dir |
国际化(i18n)文件夹 | :lang |
skip_render |
跳过指定文件的渲染。匹配到的文件将会被不做改动地复制到 public 目录中。您可使用 glob 表达式来匹配路径。 |
例如:
skip_render: "mypage/**/*"
# 将会直接将 `source/mypage/index.html` 和 `source/mypage/code.js` 不做改动地输出到 'public' 目录
# 你也可以用这种方法来跳过对指定文章文件的渲染
skip_render: "_posts/test-post.md"
# 这将会忽略对 'test-post.md' 的渲染
提示
如果您刚刚开始接触 Hexo,通常没有必要修改这一部分的值。
文章
参数 | 描述 | 默认值 |
---|---|---|
new_post_name |
新文章的文件名称 | :title.md |
default_layout |
预设布局 | post |
auto_spacing |
在中文和英文之间加入空格 | false |
titlecase |
把标题转换为 title case | false |
external_link |
在新标签中打开链接 | true |
external_link.enable |
在新标签中打开链接 | true |
external_link.field |
对整个网站(site )生效或仅对文章(post )生效 |
site |
external_link.exclude |
需要排除的域名。主域名和子域名如 www 需分别配置 |
[] |
filename_case |
把文件名称转换为 (1) 小写或 (2) 大写 | 0 |
render_drafts |
显示草稿 | false |
post_asset_folder |
启动 Asset 文件夹 | false |
relative_link |
把链接改为与根目录的相对位址 | false |
future |
显示未来的文章 | true |
highlight |
代码块的设置, 请参考 Highlight.js 进行设置 | |
prismjs |
代码块的设置, 请参考 PrismJS 进行设置 |
相对地址
默认情况下,Hexo 生成的超链接都是绝对地址。例如,如果您的网站域名为
example.com
,您有一篇文章名为hello
,那么绝对链接可能像这样:http://example.com/hello.html
,它是绝对于域名的。相对链接像这样:/hello.html
,也就是说,无论用什么域名访问该站点,都没有关系,这在进行反向代理时可能用到。通常情况下,建议使用绝对地址。
分类 & 标签
参数 | 描述 | 默认值 |
---|---|---|
default_category |
默认分类 | uncategorized |
category_map |
分类别名 | |
tag_map |
标签别名 |
日期 / 时间格式
Hexo 使用 Moment.js 来解析和显示时间。
参数 | 描述 | 默认值 |
---|---|---|
date_format |
日期格式 | YYYY-MM-DD |
time_format |
时间格式 | HH:mm:ss |
updated_option |
当 Front Matter 中没有指定 updated 时 updated 的取值 |
mtime |
updated_option
updated_option
控制了当 Front Matter 中没有指定updated
时,updated
如何取值:
mtime
: 使用文件的最后修改时间。这是从 Hexo 3.0.0 开始的默认行为。date
: 使用date
作为updated
的值。可被用于 Git 工作流之中,因为使用 Git 管理站点时,文件的最后修改日期常常会发生改变empty
: 直接删除updated
。使用这一选项可能会导致大部分主题和插件无法正常工作。
use_date_for_updated
选项已经被废弃,将会在下个重大版本发布时去除。请改为使用updated_option: 'date'
。
use_date_for_updated` | 启用以后,如果 Front Matter 中没有指定 `updated`, [`post.updated`](https://hexo.io/zh-cn/docs/configuration) 将会使用 `date` 的值而不是文件的创建时间。在 Git 工作流中这个选项会很有用 | `true
分页
参数 | 描述 | 默认值 |
---|---|---|
per_page |
每页显示的文章量 (0 = 关闭分页功能) | 10 |
pagination_dir |
分页目录 | page |
扩展
参数 | 描述 |
---|---|
theme |
当前主题名称。值为false 时禁用主题 |
theme_config |
主题的配置文件。在这里放置的配置会覆盖主题目录下的 _config.yml 中的配置 |
deploy |
部署部分的设置 |
meta_generator |
Meta generator 标签。 值为 false 时 Hexo 不会在头部插入该标签 |
包括或不包括目录和文件
在 Hexo 配置文件中,通过设置 include/exclude 可以让 Hexo 进行处理或忽略某些目录和文件夹。你可以使用 glob 表达式 对目录和文件进行匹配。
include
and exclude
options only apply to the source/
folder, whereas ignore
option applies to all folders.
参数 | 描述 |
---|---|
include |
Hexo 默认会忽略隐藏文件和文件夹(包括名称以下划线和 . 开头的文件和文件夹,Hexo 的 _posts 和 _data 等目录除外)。通过设置此字段将使 Hexo 处理他们并将它们复制到 source 目录下。 |
exclude |
Hexo 会忽略这些文件和目录 |
ignore |
Ignore files/folders |
举例:
# Include/Exclude Files/Folders
include:
- ".nojekyll"
# 包括 'source/css/_typing.css'
- "css/_typing.css"
# 包括 'source/_css/' 中的任何文件,但不包括子目录及其其中的文件。
- "_css/*"
# 包含 'source/_css/' 中的任何文件和子目录下的任何文件
- "_css/**/*"
exclude:
# 不包括 'source/js/test.js'
- "js/test.js"
# 不包括 'source/js/' 中的文件、但包括子目录下的所有目录和文件
- "js/*"
# 不包括 'source/js/' 中的文件和子目录下的任何文件
- "js/**/*"
# 不包括 'source/js/' 目录下的所有文件名以 'test' 开头的文件,但包括其它文件和子目录下的单文件
- "js/test*"
# 不包括 'source/js/' 及其子目录中任何以 'test' 开头的文件
- "js/**/test*"
# 不要用 exclude 来忽略 'source/_posts/' 中的文件。你应该使用 'skip_render',或者在要忽略的文件的文件名之前加一个下划线 '_'
# 在这里配置一个 - "_posts/hello-world.md" 是没有用的。
ignore:
# Ignore any folder named 'foo'.
- "**/foo"
# Ignore 'foo' folder in 'themes/' only.
- "**/themes/*/foo"
# Same as above, but applies to every subfolders of 'themes/'.
- "**/themes/**/foo"
列表中的每一项都必须用单引号或双引号包裹起来。
include
和 exclude
并不适用于 themes/
目录下的文件。如果需要忽略 themes/
目录下的部分文件或文件夹,可以使用 ignore
或在文件名之前添加下划线 _
。
使用代替配置文件
可以在 hexo-cli 中使用 --config
参数来指定自定义配置文件的路径。你可以使用一个 YAML 或 JSON 文件的路径,也可以使用逗号分隔(无空格)的多个 YAML 或 JSON 文件的路径。例如:
# use 'custom.yml' in place of '_config.yml'
$ hexo server --config custom.yml
# use 'custom.yml' & 'custom2.json', prioritizing 'custom3.yml', then 'custom2.json'
$ hexo generate --config custom.yml,custom2.json,custom3.yml
当你指定了多个配置文件以后,Hexo 会按顺序将这部分配置文件合并成一个 _multiconfig.yml
。如果遇到重复的配置,排在后面的文件的配置会覆盖排在前面的文件的配置。这个原则适用于任意数量、任意深度的 YAML 和 JSON 文件。
例如,使用 --options
指定了两个自定义配置文件:
$ hexo generate --config custom.yml,custom2.json
如果 custom.yml
中指定了 foo: bar
,在 custom2.json 中指定了 "foo": "dinosaur"
,那么在 _multiconfig.yml
中你会得到 foo: dinosaur
。
使用代替主题配置文件
通常情况下,Hexo 主题是一个独立的项目,并拥有一个独立的 _config.yml
配置文件。
除了自行维护独立的主题配置文件,你也可以在其它地方对主题进行配置。
配置文件中的 theme_config
该特性自 Hexo 2.8.2 起提供
# _config.yml
theme: "my-theme"
theme_config:
bio: "My awesome bio"
foo:
bar: 'a'
# themes/my-theme/_config.yml
bio: "Some generic bio"
logo: "a-cool-image.png"
foo:
baz: 'b'
最终主题配置的输出是:
{
bio: "My awesome bio",
logo: "a-cool-image.png",
foo: {
bar: "a",
baz: "b"
}
}
独立的 _config.[theme].yml
文件
该特性自 Hexo 5.0.0 起提供
独立的主题配置文件应放置于站点根目录下,支持 yml
或 json
格式。需要配置站点 _config.yml
文件中的 theme
以供 Hexo 寻找 _config.[theme].yml
文件。
# _config.yml
theme: "my-theme"
# _config.my-theme.yml
bio: "My awesome bio"
foo:
bar: 'a'
# themes/my-theme/_config.yml
bio: "Some generic bio"
logo: "a-cool-image.png"
foo:
baz: 'b'
最终主题配置的输出是:
{
bio: "My awesome bio",
logo: "a-cool-image.png",
foo: {
bar: "a",
baz: "b"
}
}
我们强烈建议你将所有的主题配置集中在一处。如果你不得不在多处配置你的主题,那么这些信息对你将会非常有用:Hexo 在合并主题配置时,Hexo 配置文件中的
theme_config
的优先级最高,其次是_config.[theme].yml
文件,最后是位于主题目录下的_config.yml
文件。
指令
init
$ hexo init [folder]
新建一个网站。如果没有设置 folder
,Hexo 默认在目前的文件夹建立网站。
本命令相当于执行了以下几步:
- Git clone hexo-starter 和 hexo-theme-landscape 主题到当前目录或指定目录。
- 使用 Yarn 1、pnpm 或 npm 包管理器下载依赖(如有已安装多个,则列在前面的优先)。npm 默认随 Node.js 安装。
new
$ hexo new [layout] <title>
新建一篇文章。如果没有设置 layout
的话,默认使用 _config.yml 中的 default_layout
参数代替。如果标题包含空格的话,请使用引号括起来。
$ hexo new "post title with whitespace"
参数 | 描述 |
---|---|
-p , --path |
自定义新文章的路径 |
-r , --replace |
如果存在同名文章,将其替换 |
-s , --slug |
文章的 Slug,作为新文章的文件名和发布后的 URL |
默认情况下,Hexo 会使用文章的标题来决定文章文件的路径。对于独立页面来说,Hexo 会创建一个以标题为名字的目录,并在目录中放置一个 index.md
文件。你可以使用 --path
参数来覆盖上述行为、自行决定文件的目录:
hexo new page --path about/me "About me"
以上命令会创建一个 source/about/me.md
文件,同时 Front Matter 中的 title 为 "About me"
注意!title 是必须指定的!如果你这么做并不能达到你的目的:
hexo new page --path about/me
此时 Hexo 会创建 source/_posts/about/me.md
,同时 me.md
的 Front Matter 中的 title 为 "page"
。这是因为在上述命令中,hexo-cli 将 page
视为指定文章的标题、并采用默认的 layout
。
generate
$ hexo generate
生成静态文件。
选项 | 描述 |
---|---|
-d , --deploy |
文件生成后立即部署网站 |
-w , --watch |
监视文件变动 |
-b , --bail |
生成过程中如果发生任何未处理的异常则抛出异常 |
-f , --force |
强制重新生成文件 Hexo 引入了差分机制,如果 public 目录存在,那么 hexo g 只会重新生成改动的文件。 使用该参数的效果接近 hexo clean && hexo generate |
-c , --concurrency |
最大同时生成文件的数量,默认无限制 |
该命令可以简写为
$ hexo g
publish
$ hexo publish [layout] <filename>
发表草稿。
server
$ hexo server
启动服务器。默认情况下,访问网址为: http://localhost:4000/
。
选项 | 描述 |
---|---|
-p , --port |
重设端口 |
-s , --static |
只使用静态文件 |
-l , --log |
启动日记记录,使用覆盖记录格式 |
deploy
$ hexo deploy
部署网站。
参数 | 描述 |
---|---|
-g , --generate |
部署之前预先生成静态文件 |
该命令可以简写为:
$ hexo d
render
$ hexo render <file1> [file2] ...
渲染文件。
参数 | 描述 |
---|---|
-o , --output |
设置输出路径 |
migrate
$ hexo migrate <type>
从其他博客系统 迁移内容。
clean
$ hexo clean
清除缓存文件 (db.json
) 和已生成的静态文件 (public
)。
在某些情况(尤其是更换主题后),如果发现您对站点的更改无论如何也不生效,您可能需要运行该命令。
list
$ hexo list <type>
列出网站资料。
version
$ hexo version
显示 Hexo 版本。
选项
安全模式
$ hexo --safe
在安全模式下,不会载入插件和脚本。当您在安装新插件遭遇问题时,可以尝试以安全模式重新执行。
调试模式
$ hexo --debug
在终端中显示调试信息并记录到 debug.log
。当您碰到问题时,可以尝试用调试模式重新执行一次,并 提交调试信息到 GitHub。
简洁模式
$ hexo --silent
隐藏终端信息。
自定义配置文件的路径
# 使用 custom.yml 代替默认的 _config.yml
$ hexo server --config custom.yml
# 使用 custom.yml 和 custom2.json,其中 custom2.json 优先级更高
$ hexo generate --config custom.yml,custom2.json,custom3.yml
自定义配置文件的路径,指定这个参数后将不再使用默认的 _config.yml
。
你可以使用一个 YAML 或 JSON 文件的路径,也可以使用逗号分隔(无空格)的多个 YAML 或 JSON 文件的路径。例如:
# 使用 custom.yml 代替默认的 _config.yml
$ hexo server --config custom.yml
# 使用 custom.yml, custom2.json 和 custom3.yml,其中 custom3.yml 优先级最高,其次是 custom2.json
$ hexo generate --config custom.yml,custom2.json,custom3.yml
当你指定了多个配置文件以后,Hexo 会按顺序将这部分配置文件合并成一个 _multiconfig.yml
。如果遇到重复的配置,排在后面的文件的配置会覆盖排在前面的文件的配置。这个原则适用于任意数量、任意深度的 YAML 和 JSON 文件。
显示草稿
$ hexo --draft
显示 source/_drafts
文件夹中的草稿文章。
自定义 CWD
$ hexo --cwd /path/to/cwd
自定义当前工作目录(Current working directory)的路径。
迁移
RSS
首先,安装 hexo-migrator-rss
插件。
$ npm install hexo-migrator-rss --save
插件安装完成后,执行下列命令,从 RSS 迁移所有文章。source
可以是文件路径或网址。
$ hexo migrate rss <source>
Jekyll
把 _posts
文件夹内的所有文件复制到 source/_posts
文件夹,并在 _config.yml
中修改 new_post_name
参数。
new_post_name: :year-:month-:day-:title.md
Octopress
把 Octopress source/_posts
文件夹内的所有文件转移到 Hexo 的 source/_posts
文件夹,并修改 _config.yml
中的 new_post_name
参数。
new_post_name: :year-:month-:day-:title.md
WordPress
首先,安装 hexo-migrator-wordpress
插件。
$ npm install hexo-migrator-wordpress --save
在 WordPress 仪表盘中导出数据(“Tools” → “Export” → “WordPress”)(详情参考WP支持页面)。
插件安装完成后,执行下列命令来迁移所有文章。source
可以是 WordPress 导出的文件路径或网址。
$ hexo migrate wordpress <source>
注意
这个插件并不能完美地实现WordPress->Hexo的数据转换,尤其是在处理WordPress的分类方面存在问题(见Front-matter中的分类与标签)。因此,建议您在迁移完成后,手工审阅所有生成的markdown文件,检查其中是否有错误。对于文章数量较大的WordPress站点,这项工作可能要花很长的时间。
Joomla
首先,安装 hexo-migrator-joomla
插件。
$ npm install hexo-migrator-joomla --save
使用 J2XML 组件导出 Joomla 文章。
插件安装完成后,执行下列命令来迁移所有文章。source
可以是 Joomla 导出的文件路径或网址。
$ hexo migrate joomla <source>
写作
你可以执行下列命令来创建一篇新文章或者新的页面。
$ hexo new [layout] <title>
您可以在命令中指定文章的布局(layout),默认为 post
,可以通过修改 _config.yml
中的 default_layout
参数来指定默认布局。
布局(Layout)
Hexo 有三种默认布局:post
、page
和 draft
。在创建这三种不同类型的文件时,它们将会被保存到不同的路径;而您自定义的其他布局和 post
相同,都将储存到 source/_posts
文件夹。
布局 | 路径 |
---|---|
post |
source/_posts |
page |
source |
draft |
source/_drafts |
Disabling layout
If you don’t want an article (post/page) to be processed with a theme, set
layout: false
in its front-matter. Refer to this section for more details.
文件名称
Hexo 默认以标题做为文件名称,但您可编辑 new_post_name
参数来改变默认的文件名称,举例来说,设为 :year-:month-:day-:title.md
可让您更方便的通过日期来管理文章。
变量 | 描述 |
---|---|
:title |
标题(小写,空格将会被替换为短杠) |
:year |
建立的年份,比如, 2015 |
:month |
建立的月份(有前导零),比如, 04 |
:i_month |
建立的月份(无前导零),比如, 4 |
:day |
建立的日期(有前导零),比如, 07 |
:i_day |
建立的日期(无前导零),比如, 7 |
草稿
刚刚提到了 Hexo 的一种特殊布局:draft
,这种布局在建立时会被保存到 source/_drafts
文件夹,您可通过 publish
命令将草稿移动到 source/_posts
文件夹,该命令的使用方式与 new
十分类似,您也可在命令中指定 layout
来指定布局。
$ hexo publish [layout] <title>
草稿默认不会显示在页面中,您可在执行时加上 --draft
参数,或是把 render_drafts
参数设为 true
来预览草稿。
模版(Scaffold)
在新建文章时,Hexo 会根据 scaffolds
文件夹内相对应的文件来建立文件,例如:
$ hexo new photo "My Gallery"
在执行这行指令时,Hexo 会尝试在 scaffolds
文件夹中寻找 photo.md
,并根据其内容建立文章,以下是您可以在模版中使用的变量:
变量 | 描述 |
---|---|
layout |
布局 |
title |
标题 |
date |
文件建立日期 |
支持的格式
Hexo 支持以任何格式书写文章,只要安装了相应的渲染插件。
例如,Hexo 默认安装了 hexo-renderer-marked
和 hexo-renderer-ejs
,因此你不仅可以用 Markdown 写作,你还可以用 EJS 写作。如果你安装了 hexo-renderer-pug
,你甚至可以用 Pug 模板语言书写文章。
只需要将文章的扩展名从 md
改成 ejs
,Hexo 就会使用 hexo-renderer-ejs
渲染这个文件,其他格式同理。
Front-matter
Front-matter 是文件最上方以 ---
分隔的区域,用于指定个别文件的变量,举例来说:
---
title: Hello World
date: 2013/7/13 20:46:25
---
以下是预先定义的参数,您可在模板中使用这些参数值并加以利用。
参数 | 描述 | 默认值 |
---|---|---|
layout |
布局 | config.default_layout |
title |
标题 | 文章的文件名 |
date |
建立日期 | 文件建立日期 |
updated |
更新日期 | 文件更新日期 |
comments |
开启文章的评论功能 | true |
tags |
标签(不适用于分页) | |
categories |
分类(不适用于分页) | |
permalink |
覆盖文章网址 | |
excerpt |
Page excerpt in plain text. Use this plugin to format the text | |
disableNunjucks |
Disable rendering of Nunjucks tag {{ }} /{% %} and tag plugins when enabled |
|
lang |
Set the language to override auto-detection | Inherited from _config.yml |
布局
The default layout is post
, in accordance to the value of default_layout
setting in _config.yml
. When the layout is disabled (layout: false
) in an article, it will not be processed with a theme. However, it will still be rendered by any available renderer: if an article is written in Markdown and a Markdown renderer (like the default hexo-renderer-marked) is installed, it will be rendered to HTML.
Tag plugins are always processed regardless of layout, unless disabled by the disableNunjucks
setting or renderer.
分类和标签
只有文章支持分类和标签,您可以在 Front-matter 中设置。在其他系统中,分类和标签听起来很接近,但是在 Hexo 中两者有着明显的差别:分类具有顺序性和层次性,也就是说 Foo, Bar
不等于 Bar, Foo
;而标签没有顺序和层次。
categories:
- Diary
tags:
- PS3
- Games
分类方法的分歧
如果您有过使用 WordPress 的经验,就很容易误解 Hexo 的分类方式。WordPress 支持对一篇文章设置多个分类,而且这些分类可以是同级的,也可以是父子分类。但是 Hexo 不支持指定多个同级分类。下面的指定方法:
categories: - Diary - Life
会使分类
Life
成为Diary
的子分类,而不是并列分类。因此,有必要为您的文章选择尽可能准确的分类。如果你需要为文章添加多个分类,可以尝试以下 list 中的方法。
categories: - [Diary, PlayStation] - [Diary, Games] - [Life]
此时这篇文章同时包括三个分类:
PlayStation
和Games
分别都是父分类Diary
的子分类,同时Life
是一个没有子分类的分类。
JSON Front-matter
除了 YAML 外,你也可以使用 JSON 来编写 Front-matter,只要将 ---
代换成 ;;;
即可。
"title": "Hello World",
"date": "2013/7/13 20:46:25"
;;;
标签插件(Tag Plugins)
标签插件和 Front-matter 中的标签不同,它们是用于在文章中快速插入特定内容的插件。
虽然你可以使用任何格式书写你的文章,但是标签插件永远可用,且语法也都是一致的。
Tag plugins should not be wrapped inside Markdown syntax, e.g. []({% post_path lorem-ipsum %})
is not supported.
引用块
在文章中插入引言,可包含作者、来源和标题。
别号: quote
{% blockquote [author[, source]] [link] [source_link_title] %}
content
{% endblockquote %}
样例
没有提供参数,则只输出普通的 blockquote
{% blockquote %}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque hendrerit lacus ut purus iaculis feugiat. Sed nec tempor elit, quis aliquam neque. Curabitur sed diam eget dolor fermentum semper at eu lorem.
{% endblockquote %}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque hendrerit lacus ut purus iaculis feugiat. Sed nec tempor elit, quis aliquam neque. Curabitur sed diam eget dolor fermentum semper at eu lorem.
引用书上的句子
{% blockquote David Levithan, Wide Awake %}
Do not just seek happiness for yourself. Seek happiness for all. Through kindness. Through mercy.
{% endblockquote %}
Do not just seek happiness for yourself. Seek happiness for all. Through kindness. Through mercy.
David LevithanWide Awake
引用 Twitter
{% blockquote @DevDocs https://twitter.com/devdocs/status/356095192085962752 %}
NEW: DevDocs now comes with syntax highlighting. http://devdocs.io
{% endblockquote %}
NEW: DevDocs now comes with syntax highlighting. http://devdocs.io
引用网络上的文章
{% blockquote Seth Godin http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html Welcome to Island Marketing %}
Every interaction is both precious and an opportunity to delight.
{% endblockquote %}
Every interaction is both precious and an opportunity to delight.
Seth GodinWelcome to Island Marketing
代码块
在文章中插入代码。
别名: code
{% codeblock [title] [lang:language] [url] [link text] [additional options] %}
code snippet
{% endcodeblock %}
Specify additional options in option:value
format, e.g. line_number:false first_line:5
.
Extra Options | Description | Default |
---|---|---|
line_number |
Show line number | true |
highlight |
Enable code highlighting | true |
first_line |
Specify the first line number | 1 |
mark |
Line highlight specific line(s), each value separated by a comma. Specify number range using a dash Example: mark:1,4-7,10 will mark line 1, 4 to 7 and 10. |
|
wrap |
Wrap the code block in `` | true |
样例
普通的代码块
{% codeblock %}
alert('Hello World!');
{% endcodeblock %}
alert('Hello World!');
指定语言
{% codeblock lang:objc %}
[rectangle setX: 10 y: 10 width: 20 height: 20];
{% endcodeblock %}
[rectangle setX: 10 y: 10 width: 20 height: 20];
附加说明
{% codeblock Array.map %}
array.map(callback[, thisArg])
{% endcodeblock %}
Array.maparray.map(callback[, thisArg])
附加说明和网址
{% codeblock _.compact http://underscorejs.org/#compact Underscore.js %}
_.compact([0, 1, false, 2, '', 3]);
=> [1, 2, 3]
{% endcodeblock %}
_.compactUnderscore.js_.compact([0, 1, false, 2, '', 3]);
=> [1, 2, 3]
反引号代码块
另一种形式的代码块,不同的是它使用三个反引号来包裹。
``` [language] [title] [url] [link text] code snippet ```
Pull Quote
在文章中插入 Pull quote。
{% pullquote [class] %}
content
{% endpullquote %}
jsFiddle
在文章中嵌入 jsFiddle。
{% jsfiddle shorttag [tabs] [skin] [width] [height] %}
Gist
在文章中嵌入 Gist。
{% gist gist_id [filename] %}
iframe
在文章中插入 iframe。
{% iframe url [width] [height] %}
Image
在文章中插入指定大小的图片。
{% img [class names] /path/to/image [width] [height] '"title text" "alt text"' %}
Link
在文章中插入链接,并自动给外部链接添加 target="_blank"
属性。
{% link text url [external] [title] %}
Include Code
插入 source/downloads/code
文件夹内的代码文件。source/downloads/code
不是固定的,取决于你在配置文件中 code_dir
的配置。
{% include_code [title] [lang:language] [from:line] [to:line] path/to/file %}
样例
嵌入 test.js 文件全文
{% include_code lang:javascript test.js %}
只嵌入第 3 行
{% include_code lang:javascript from:3 to:3 test.js %}
嵌入第 5 行至第 8 行
{% include_code lang:javascript from:5 to:8 test.js %}
嵌入第 5 行至文件结束
{% include_code lang:javascript from:5 test.js %}
嵌入第 1 行至第 8 行
{% include_code lang:javascript to:8 test.js %}
Youtube
在文章中插入 Youtube 视频。
{% youtube video_id [type] [cookie] %}
Examples
视频
{% youtube lJIrF4YjHfQ %}
播放列表
{% youtube PL9hW1uS6HUfscJ9DHkOSoOX45MjXduUxo 'playlist' %}
隐私模式
禁止 YouTube cookie
{% youtube lJIrF4YjHfQ false %}
{% youtube PL9hW1uS6HUfscJ9DHkOSoOX45MjXduUxo 'playlist' false %}
Vimeo
在文章中插入 Vimeo 视频。
{% vimeo video_id %}
引用文章
引用其他文章的链接。
{% post_path filename %}
{% post_link filename [title] [escape] %}
在使用此标签时可以忽略文章文件所在的路径或者文章的永久链接信息、如语言、日期。
例如,在文章中使用 {% post_link how-to-bake-a-cake %}
时,只需有一个名为 how-to-bake-a-cake.md
的文章文件即可。即使这个文件位于站点文件夹的 source/posts/2015-02-my-family-holiday
目录下、或者文章的永久链接是 2018/en/how-to-bake-a-cake
,都没有影响。
默认链接文字是文章的标题,你也可以自定义要显示的文本。
默认对文章的标题和自定义标题里的特殊字符进行转义。可以使用escape
选项,禁止对特殊字符进行转义。
链接使用文章的标题
{% post_link hexo-3-8-released %}
链接使用自定义文字
{% post_link hexo-3-8-released '通往文章的链接' %}
对标题的特殊字符进行转义
{% post_link hexo-4-released 'How to use <b> tag in title' %}
禁止对标题的特殊字符进行转义
{% post_link hexo-4-released '<b>bold</b> custom title' false %}
引用资源
引用文章的资源。
{% asset_path filename %}
{% asset_img [class names] slug [width] [height] [title text [alt text]] %}
{% asset_link filename [title] [escape] %}
Embed image
hexo-renderer-marked 3.1.0+ can (optionally) resolves the post’s path of an image automatically, refer to this section on how to enable it.
“foo.jpg” is located at http://example.com/2020/01/02/hello/foo.jpg
.
Default (no option)
{% asset_img foo.jpg %}
<img src="/2020/01/02/hello/foo.jpg">
Custom class
{% asset_img post-image foo.jpg %}
<img src="/2020/01/02/hello/foo.jpg" class="post-image">
Display size
{% asset_img foo.jpg 500 400 %}
<img src="/2020/01/02/hello/foo.jpg" width="500" height="400">
Title & Alt
{% asset_img logo.svg "lorem ipsum'dolor'" %}
<img src="/2020/01/02/hello/foo.jpg" title="lorem ipsum" alt="dolor">
Raw
如果您想在文章中插入 Swig 标签,可以尝试使用 Raw 标签,以免发生解析异常。
{% raw %}
content
{% endraw %}
文章摘要和截断
在文章中使用 <!-- more -->
,那么 <!-- more -->
之前的文字将会被视为摘要。首页中将只出现这部分文字,同时这部分文字也会出现在正文之中。
例如:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<!-- more -->
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
首页中将只会出现
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
正文中则会出现
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
注意,摘要可能会被 Front Matter 中的 excerpt
覆盖。
资源文件夹
资源(Asset)代表 source
文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images
文件夹中。然后通过类似于 
的方法访问它们。
对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组织化的方式来管理资源。这个稍微有些复杂但是管理资源非常方便的功能可以通过将 config.yml
文件中的 post_asset_folder
选项设为 true
来打开。
_config.ymlpost_asset_folder: true
当资源文件管理功能打开后,Hexo将会在你每一次通过 hexo new [layout] <title>
命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个文章文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。
相对路径引用的标签插件
通过常规的 markdown 语法和相对路径来引用图片和其它资源可能会导致它们在存档页或者主页上显示不正确。在Hexo 2时代,社区创建了很多插件来解决这个问题。但是,随着Hexo 3 的发布,许多新的标签插件被加入到了核心代码中。这使得你可以更简单地在文章中引用你的资源。
{% asset_path slug %}
{% asset_img slug [title] %}
{% asset_link slug [title] %}
比如说:当你打开文章资源文件夹功能后,你把一个 example.jpg
图片放在了你的资源文件夹中,如果通过使用相对路径的常规 markdown 语法 
,它将 不会 出现在首页上。(但是它会在文章中按你期待的方式工作)
正确的引用图片方式是使用下列的标签插件而不是 markdown :
{% asset_img example.jpg This is an example image %}
通过这种方式,图片将会同时出现在文章和主页以及归档页中。
Embedding an image using markdown
hexo-renderer-marked 3.1.0 introduced a new option that allows you to embed an image in markdown without using asset_img
tag plugin.
To enable:
_config.ymlpost_asset_folder: true
marked:
prependRoot: true
postAsset: true
Once enabled, an asset image will be automatically resolved to its corresponding post’s path. For example, “image.jpg” is located at “/2020/01/02/foo/image.jpg”, meaning it is an asset image of “/2020/01/02/foo/“ post, 
will be rendered as <img src="/2020/01/02/foo/image.jpg">
.
数据文件
有时您可能需要在主题中使用某些资料,而这些资料并不在文章内,并且是需要重复使用的,那么您可以考虑使用 Hexo 3.0 新增的「数据文件」功能。此功能会载入 source/_data
内的 YAML 或 JSON 文件,如此一来您便能在网站中复用这些文件了。
举例来说,在 source/_data
文件夹中新建 menu.yml
文件:
Home: /
Gallery: /gallery/
Archives: /archives/
您就能在模板中使用这些资料:
<% for (var link in site.data.menu) { %>
<a href="<%= site.data.menu[link] %>"> <%= link %> </a>
<% } %>
渲染结果如下 :
<a href="/"> Home </a>
<a href="/gallery/"> Gallery </a>
<a href="/archives/"> Archives </a>
服务器
hexo-server
Hexo 3.0 把服务器独立成了个别模块,您必须先安装 hexo-server 才能使用。
$ npm install hexo-server --save
安装完成后,输入以下命令以启动服务器,您的网站会在 http://localhost:4000
下启动。在服务器启动期间,Hexo 会监视文件变动并自动更新,您无须重启服务器。
$ hexo server
如果您想要更改端口,或是在执行时遇到了 EADDRINUSE
错误,可以在执行时使用 -p
选项指定其他端口,如下:
$ hexo server -p 5000
静态模式
在静态模式下,服务器只处理 public
文件夹内的文件,而不会处理文件变动,在执行时,您应该先自行执行 hexo generate
,此模式通常用于生产环境(production mode)下。
$ hexo server -s
自定义 IP
服务器默认运行在 0.0.0.0
,您可以覆盖默认的 IP 设置,如下:
$ hexo server -i 192.168.1.1
指定这个参数后,您就只能通过该IP才能访问站点。例如,对于一台使用无线网络的笔记本电脑,除了指向本机的127.0.0.1
外,通常还有一个192.168.*.*
的局域网IP,如果像上面那样使用-i
参数,就不能用127.0.0.1
来访问站点了。对于有公网IP的主机,如果您指定一个局域网IP作为-i
参数的值,那么就无法通过公网来访问站点。
Pow
Pow 是一个 Mac 系统上的零配置 Rack 服务器,它也可以作为一个简单易用的静态文件服务器来使用。
安装
$ curl get.pow.cx | sh
设置
在 ~/.pow
文件夹建立链接(symlink)。
$ cd ~/.pow
$ ln -s /path/to/myapp
您的网站将会在 http://myapp.dev
下运行,网址根据链接名称而定。
生成文件
使用 Hexo 生成静态文件快速而且简单。
$ hexo generate
监视文件变动
Hexo 能够监视文件变动并立即重新生成静态文件,在生成时会比对文件的 SHA1 checksum,只有变动的文件才会写入。
$ hexo generate --watch
完成后部署
您可执行下列的其中一个命令,让 Hexo 在生成完毕后自动部署网站,两个命令的作用是相同的。
$ hexo generate --deploy
$ hexo deploy --generate
简写
上面两个命令可以简写为
$ hexo g -d
$ hexo d -g
永久链接(Permalinks)
您可以在 _config.yml
配置中调整网站的永久链接或者在每篇文章的 Front-matter 中指定。
变量
除了下列变量外,您还可使用 Front-matter 中的所有属性。
变量 | 描述 |
---|---|
:year |
文章的发表年份(4 位数) |
:month |
文章的发表月份(2 位数) |
:i_month |
文章的发表月份(去掉开头的零) |
:day |
文章的发表日期 (2 位数) |
:i_day |
文章的发表日期(去掉开头的零) |
:hour |
文章发表时的小时 (2 位数) |
:minute |
文章发表时的分钟 (2 位数) |
:second |
文章发表时的秒钟 (2 位数) |
:title |
文件名称 (relative to “source/_posts/“ folder) |
:name |
文件名称 |
:post_title |
文章标题 |
:id |
文章 ID (not persistent across cache reset) |
:category |
分类。如果文章没有分类,则是 default_category 配置信息。 |
:hash |
SHA1 hash of filename (same as :title ) and date (12-hexadecimal) |
您可在 permalink_defaults
参数下调整永久链接中各变量的默认值:
permalink_defaults:
lang: en
示例
source/_posts/hello-world.mdtitle: Hello World
date: 2013-07-14 17:01:34
categories:
- foo
- bar
参数 | 结果 |
---|---|
:year/:month/:day/:title/ |
2013/07/14/hello-world/ |
:year-:month-:day-:title.html |
2013-07-14-hello-world.html |
:category/:title/ |
foo/bar/hello-world/ |
:title-:hash/ |
hello-world-a2c8ac003b43/ |
source/_posts/lorem/hello-world.mdtitle: Hello World
date: 2013-07-14 17:01:34
categories:
- foo
- bar
参数 | 结果 |
---|---|
:year/:month/:day/:title/ |
2013/07/14/lorem/hello-world/ |
:year/:month/:day/:name/ |
2013/07/14/hello-world/ |
多语种支持
若要建立一个多语种的网站,您可修改 new_post_name
和 permalink
参数,如下:
new_post_name: :lang/:title.md
permalink: :lang/:title/
当您建立新文章时,文章会被储存到:
$ hexo new "Hello World" --lang tw
# => source/_posts/tw/Hello-World.md
而网址会是:
http://localhost:4000/tw/hello-world/
主题
创建 Hexo 主题非常容易,您只要在 themes
文件夹内,新增一个任意名称的文件夹,并修改 _config.yml
内的 theme
设定,即可切换主题。一个主题可能会有以下的结构:
.
├── _config.yml
├── languages
├── layout
├── scripts
└── source
_config.yml
主题的配置文件。和 Hexo 配置文件不同,主题配置文件修改时会自动更新,无需重启 Hexo Server。
languages
语言文件夹。请参见 国际化 (i18n)。
layout
布局文件夹。用于存放主题的模板文件,决定了网站内容的呈现方式,Hexo 内建 Swig 模板引擎,您可以另外安装插件来获得 EJS、Haml、Jade 或 Pug 支持,Hexo 根据模板文件的扩展名来决定所使用的模板引擎,例如:
layout.ejs - 使用 EJS
layout.swig - 使用 Swig
您可参考 模板 以获得更多信息。
scripts
脚本文件夹。在启动时,Hexo 会载入此文件夹内的 JavaScript 文件,请参见 插件 以获得更多信息。
source
资源文件夹,除了模板以外的 Asset,例如 CSS、JavaScript 文件等,都应该放在这个文件夹中。文件或文件夹开头名称为 _
(下划线线)或隐藏的文件会被忽略。
如果文件可以被渲染的话,会经过解析然后储存到 public
文件夹,否则会直接拷贝到 public
文件夹。
发布
当您完成主题后,可以考虑将它发布到 主题列表,让更多人能够使用您的主题。在发布前建议先进行 主题单元测试,确保每一项功能都能正常使用。发布主题的步骤和 更新文档 非常类似。
Fork hexojs/site
把库(repository)复制到电脑上,并安装所依赖的插件。
$ git clone https://github.com/<username>/site.git $ cd site $ npm install
编辑
source/_data/themes.yml
,在文件中新增您的主题,例如:- name: landscape description: A brand new default theme for Hexo. link: https://github.com/hexojs/hexo-theme-landscape preview: http://hexo.io/hexo-theme-landscape tags: - official - responsive - widget - two_column - one_column
在
source/themes/screenshots
新增同名的截图档案,图片必须为 800x500 的 PNG 文件。推送(push)分支。
建立一个新的合并申请(pull request)并描述改动。
模版
模板决定了网站内容的呈现方式,每个主题至少都应包含一个 index
模板,以下是各页面相对应的模板名称:
模板 | 用途 | 回退 |
---|---|---|
index |
首页 | |
post |
文章 | index |
page |
分页 | index |
archive |
归档 | index |
category |
分类归档 | archive |
tag |
标签归档 | archive |
布局(Layout)
如果页面结构类似,例如两个模板都有页首(Header)和页脚(Footer),您可考虑通过「布局」让两个模板共享相同的结构。一个布局文件必须要能显示 body
变量的内容,如此一来模板的内容才会被显示,举例来说:
index.ejsindex
layout.ejs<!DOCTYPE html>
<html>
<body><%- body %></body>
</html>
生成:
<!DOCTYPE html>
<html>
<body>index</body>
</html>
每个模板都默认使用 layout
布局,您可在 front-matter 指定其他布局,或是设为 false
来关闭布局功能,您甚至可在布局中再使用其他布局来建立嵌套布局。
局部模版(Partial)
局部模板让您在不同模板之间共享相同的组件,例如页首(Header)、页脚(Footer)或侧边栏(Sidebar)等,可利用局部模板功能分割为个别文件,让维护更加便利。举例来说:
partial/header.ejs<h1 id="logo"><%= config.title %></h1>
index.ejs<%- partial('partial/header') %>
<div id="content">Home page</div>
生成:
<h1 id="logo">My Site</h1>
<div id="content">Home page</div>
局部变量
您可以在局部模板中指定局部变量并使用。
partial/header.ejs<h1 id="logo"><%= title %></h1>
index.ejs<%- partial('partial/header', {title: 'Hello World'}) %>
<div id="content">Home page</div>
生成:
<h1 id="logo">Hello World</h1>
<div id="content">Home page</div>
优化
如果您的主题太过于复杂,或是需要生成的文件量太过于庞大,可能会大幅降低性能,除了简化主题外,您可以考虑 Hexo 2.7 新增的局部缓存(Fragment Caching) 功能。
本功能借鉴于 Ruby on Rails,它储存局部内容,下次便能直接使用缓存内容,可以减少文件夹查询并使生成速度更快。
它可用于页首、页脚、侧边栏等文件不常变动的位置,举例来说:
<%- fragment_cache('header', function(){
return '<header></header>';
});
如果您使用局部模板的话,可以更简单:
<%- partial('header', {}, {cache: true});
fragment_cache()
将会缓存第一次的渲染结果,并在之后直接输出缓存的结果。因此只有在不同页面的渲染结果都相同时才应使用局部缓存。
比如,在配置中启用了relative_link
后不应该使用局部缓存,因为相对链接在每个页面可能不同。
变量
全局变量
变量 | 描述 | 类型 |
---|---|---|
site |
网站变量 | object ; 见 网站变量 |
page |
针对该页面的内容以及 front-matter 中自定义的变量。 | object ; 见 页面变量 |
config |
网站配置 | object (站点的配置文件) |
theme |
主题配置。继承自网站配置。 | object (主题配置文件) |
path |
当前页面的路径(不含根路径) | string |
url |
当前页面的完整网址 | string |
env |
环境变量 | ??? |
从 Hexo 5.0.0 开始,Lodash 已从全局变量中移除。迁移时 You-Dont-Need-Lodash-Underscore 或许能为你提供帮助。
网站变量
变量 | 描述 | 类型 |
---|---|---|
site.posts |
所有文章 | array of post objects |
site.pages |
所有分页 | array of page objects |
site.categories |
所有分类 | object ,包含了站点全部的分类 |
site.tags |
所有标签 | array ,包含了站点全部的标签 |
页面变量
页面(page
)
变量 | 描述 | 类型 |
---|---|---|
page.title |
页面标题 | string |
page.date |
页面建立日期 | Moment.js 对象 |
page.updated |
页面更新日期 | Moment.js 对象 |
page.comments |
留言是否开启 | boolean |
page.layout |
布局名称 | string |
page.content |
页面的完整内容 | string |
page.excerpt |
页面摘要 | string |
page.more |
除了页面摘要的其余内容 | string |
page.source |
页面原始路径 | string |
page.full_source |
页面的完整原始路径 | string |
page.path |
页面网址(不含根路径)。我们通常在主题中使用 url_for(page.path) 。 |
string |
page.permalink |
页面的完整网址 | string |
page.prev |
上一个页面。如果此为第一个页面则为 null 。 |
string or null |
page.next |
下一个页面。如果此为最后一个页面则为 null 。 |
string or null |
page.raw |
文章的原始内容 | ??? |
page.photos |
文章的照片(用于相簿) | array |
page.link |
文章的外部链接(用于链接文章) | string |
文章 (post
): 与 page
布局相同,但新增以下变量。
变量 | 描述 | 类型 |
---|---|---|
page.published |
如果该文章已发布则为 true | boolean |
page.categories |
该文章的所有分类 | array of ??? |
page.tags |
该文章的所有标签 | array of ??? |
首页(index
)
变量 | 描述 | 类型 |
---|---|---|
page.per_page |
每页显示的文章数量 | number |
page.total |
总页数 | number |
page.current |
目前页数 | number |
page.current_url |
目前分页的网址 | string |
page.posts |
本页文章 (Data Model) | object |
page.prev |
上一页的页数。如果此页是第一页的话则为 0 。 |
number |
page.prev_link |
上一页的网址。如果此页是第一页的话则为 '' 。 |
string |
page.next |
下一页的页数。如果此页是最后一页的话则为 0 。 |
number |
page.next_link |
下一页的网址。如果此页是最后一页的话则为 '' 。 |
string |
page.path |
当前页面的路径(不含根目录)。我们通常在主题中使用 url_for(page.path) 。 |
string |
**归档 (archive
)**:与 index
布局相同,但新增以下变量。
变量 | 描述 | 类型 |
---|---|---|
page.archive |
等于 true |
boolean |
page.year |
年份归档 (4位) | number |
page.month |
月份归档 (没有前导零的2位数) | number |
**分类 (category
)**:与 index
布局相同,但新增以下变量。
变量 | 描述 | 类型 |
---|---|---|
page.category |
分类名称 | string |
**标签 (tag
)**:与 index
布局相同,但新增以下变量。
变量 | 描述 | 类型 |
---|---|---|
page.tag |
标签名称 | string |
国际化(i18n)
若要让您的网站以不同语言呈现,您可使用国际化(internationalization)功能。请先在 _config.yml
中调整 language
设定,这代表的是预设语言,您也可设定多个语言来调整预设语言的顺位。
language: zh-tw
language:
- zh-tw
- en
语言文件
语言文件可以使用 YAML 或 JSON 编写,并放在主题文件夹中的 languages
文件夹。您可以在语言文件中使用 printf 格式。
模板
在模板中,透过 __
或 _p
辅助函数,即可取得翻译后的字符串,前者用于一般使用;而后者用于复数字符串。例如:
en.ymlindex:
title: Home
add: Add
video:
zero: No videos
one: One video
other: %d videos
<%= __('index.title') %>
// Home
<%= _p('index.video', 3) %>
// 3 videos
路径
您可在 front-matter 中指定该页面的语言,也可在 _config.yml
中修改 i18n_dir
设定,让 Hexo 自动侦测。
i18n_dir: :lang
i18n_dir
的预设值是 :lang
,也就是说 Hexo 会捕获网址中的第一段以检测语言,举例来说:
/index.html => en
/archives/index.html => en
/zh-tw/index.html => zh-tw
捕获到的字符串唯有在语言文件存在的情况下,才会被当作是语言,因此例二 /archives/index.html
中的 archives
就不被当成是语言。
代码高亮
Hexo 对 highlight.js 与 prismjs 两种代码高亮库提供内建支持。本篇教程将展示如何将 Hexo 的内建语法高亮组件整合至你的模板中。
如何在文章中插入代码块
Hexo 支持两种代码块写法——代码块标签插件和反引号代码块标签插件:
{% codeblock [title] [lang:language] [url] [link text] [additional options] %}
code snippet
{% endcodeblock %}
{% code [title] [lang:language] [url] [link text] [additional options] %}
code snippet
{% endcode %}
``` [language] [title] [url] [link text] [additional options]
code snippet
```
上面的第三种是 Markdown 的 fenced code block 语法。Hexo 对其进行了扩展,使其支持更多特性。在标签插件文档中你可以找到可用的选项。
提示:Hexo 支持用任何格式书写文章,只需安装相应渲染插件即可。不论文章以何种格式书写(Markdown、EJS、Swig、Nunjuck、Pug、ASCIIDoc),上述三种代码块语法总是可用。
配置
# _config.yml
highlight:
enable: true
auto_detect: false
line_number: true
tab_replace: ''
wrap: true
hljs: false
prismjs:
enable: false
preprocess: true
line_number: true
tab_replace: ''
以上为 Hexo 的默认配置。
禁用
# _config.yml
highlight:
enable: false
prismjs:
enable: false
当 highlight.enable
和 prismjs.enable
均为 false
时,代码块输出的 HTML 由相应的渲染器控制。举个例子:marked.js
(Hexo 的默认 Markdown 渲染器 hexo-renderer-marked
由此驱动)会把语言加入 <code>
标签的 class
中:
```yaml
hello: hexo
```
<pre>
<code class="yaml">hello: hexo</code>
</pre>
如果内建语法高亮器均未启用,你可以安装第三方语法高亮插件,也可以使用浏览器端的语法高亮库(例如 highlight.js
和 prism.js
也都支持在浏览器中运行)。
Highlight.js
# _config.yml
highlight:
enable: true
auto_detect: false
line_number: true
tab_replace: ' '
wrap: true
hljs: false
prismjs:
enable: false
highlight.js
默认开启,用作 Hexo 的服务端高亮组件。如果你需要在浏览器端运行 highlight.js
,请把它关闭。
「服务端高亮」指语法高亮在
hexo generate
或hexo server
时完成。
auto_detect
auto_detect
是 highlight.js
的特性,能够自动检测代码块的语言。
提示:如果你想使用「子语言高亮」功能(例如在高亮 HTML 时同时高亮内部嵌入的 JavaScript 代码),请开启
auto_detect
,并且在文章中插入代码块时不要标注语言。
警告!
auto_detect
十分耗费资源。 如果你不需要使用「子语言高亮」功能,或者不介意在书写代码块时标记语言,请不要启用此功能。
line_number
highlight.js
不支持行号显示。
Hexo 通过用 <figure>
和 <table>
包裹其代码块为其添加了行号显示支持:
<figure class="highlight yaml">
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1</span><br></pre>
</td>
<td class="code">
<pre><span class="line"><span class="attr">hello:</span><span class="string">hexo</span></span><br></pre>
</td>
</tr>
</tbody>
</table>
</figure>
这不是 highlight.js
的行为,因此需要为 <figure>
和 <table>
添加自定义 CSS 代码。部分主题对此提供内建支持。
你大概也注意到了,所有代码块的 class
都没有 hljs-
前缀。我们 为此专门准备了一个章节。
tab_replace
用代码内的 tab (\t
) 替换为给定值,默认值是两个空格。
wrap
为了支持行号显示,Hexo 将输出包裹在了 <figure>
和 <table>
内部。如果要保持 highlight.js
原来的行为,你需要将 line_number
和 wrap
全部关闭。
<pre><code class="yaml">
<span class="comment"># _config.yml</span>
<span class="attr">hexo:</span> <span class="string">hexo</span>
</code></pre>
警告!
因为
line_number
功能依赖wrap
,你无法在配置中关闭wrap
而又开启line_number
。如果你将line_number
设置为true
的话,wrap
将被自动开启。
hljs
当 hljs
设置为 true
时,所有代码块的 HTML 输出均会给 class
添加 hljs-
前缀(无论 wrap
是否开启):
<pre><code class="yaml hljs">
<span class="hljs-comment"># _config.yml</span>
<span class="hljs-attr">hexo:</span> <span class="hljs-string">hexo</span>
</code></pre>
提示:当
line_number
和wrap
为false
,hljs
为true
的时候,你可以在站点上直接应用highlight.js
的主题。
PrismJS
# _config.yml
highlight:
enable: false
prismjs:
enable: true
preprocess: true
line_number: true
tab_replace: ''
PrismJS 默认禁用。启用 PrimeJS 前应设置 highlight.enable
为 false
。
preprocess
Hexo 内建的 PrismJS 支持浏览器端高亮(preprocess
设置为 false
)和服务器端高亮(preprocess
设置为 true
)两种方式。
使用服务器端高亮时(preprocess
设置为 true
),只需要在站点引入 Prismjs 的主题(CSS 样式表)即可;而使用浏览器端高亮时(preprocess
设置为 false
),需要将 JavaScript 文件也引入。
PrismJS 主要是面向浏览器的。因此,在服务器端高亮模式下只有部分插件可用:
- 行号显示:需要引入
prism-line-numbers.css
,无需引入prism-line-numbers.js
。Hexo 将生成其所需的 HTML 代码片段。 - 语言显示:当代码块有标注语言时,Hexo 总会添加
data-language
属性。 - Hexo 也支持其它不需要特殊 HTML 代码格式的 PrismJS 插件,不过你需要引入它们的 JavaScript 文件。
preprocess
设置为 false
时所有 primejs 插件均可用,只需额外注意以下几点:
- 行号显示:当
preprocess
设置为false
时,Hexo 不会生成插件所需的 HTML 代码格式。prism-line-numbers.css
和prism-line-numbers.js
均需被引入。 - 语言显示:当代码块有标注语言时,Hexo 总会添加
data-language
属性。 - 高亮特定行: Hexo 的代码块标签插件和反引号代码块标签插件都支持高亮特定行的语法(即
mark
选项)。当mark
项被设置时,Hexo 将生成其所需的 HTML 代码格式。
line_number
当 preprocess
与 line_number
均设置为 true
时,只需要引入 prism-line-numbers.css
即可启用行号显示。如果 preprocess
和 line_number
均被关闭,则需要将 prism-line-numbers.css
和 prism-line-numbers.js
都引入才能启用行号显示。
tab_replace
用代码内的 tab (\t
) 替换为给定值,默认值是两个空格。
其它参考资料
Hexo 语法高亮部分的源码可参见:
插件
Hexo 有强大的插件系统,使您能轻松扩展功能而不用修改核心模块的源码。在 Hexo 中有两种形式的插件:
脚本(Scripts)
如果您的代码很简单,建议您编写脚本,您只需要把 JavaScript 文件放到 scripts
文件夹,在启动时就会自动载入。
插件(Packages)
如果您的代码较复杂,或是您想要发布到 NPM 上,建议您编写插件。首先,在 node_modules
文件夹中建立文件夹,文件夹名称开头必须为 hexo-
,如此一来 Hexo 才会在启动时载入;否则 Hexo 将会忽略它。
文件夹内至少要包含 2 个文件:一个是主程序,另一个是 package.json
,描述插件的用途和所依赖的插件。
.
├── index.js
└── package.json
package.json
中至少要包含 name
, version
, main
属性,例如:
package.json{
"name": "hexo-my-plugin",
"version": "0.0.1",
"main": "index"
}
工具
您可以使用 Hexo 提供的官方工具插件来加速开发:
- hexo-fs:文件 IO
- hexo-util:工具程式
- hexo-i18n:本地化(i18n)
- hexo-pagination:生成分页资料
发布
当您完成插件后,可以考虑将它发布到 插件列表,让更多人能够使用您的插件。发布插件的步骤和 更新文件 非常类似。
Fork hexojs/site
把库(repository)复制到电脑上,并安装所依赖的插件。
$ git clone https://github.com/<username>/site.git $ cd site $ npm install
编辑
source/_data/plugins.yml
,在档案中新增您的插件,例如:- name: hexo-server description: Server module for Hexo. link: https://github.com/hexojs/hexo-server tags: - official - server - console
推送(push)分支。
建立一个新的合并申请(pull request)并描述改动。