自动化构建
参考:Github Pages 部署。
手动构建
本项目实际上就是一个普通的 Next.js 项目,通过在环境变量中指向博客的目录,在构建时进行读取,最后借助于 SSG 模式生成博客的静态文件。
创建配置文件
Note 此步骤可选,不提供也可以,但是可能会有部分功能上的影响。
本博客框架最大的特点就是无侵入,你只需要拉取代码后,安装依赖并配置好相关环境变量后就可直接打包,但仍然需要你创建一个配置文件。
在你的博客根目录创建一个 _config.yaml
,然后提供下面的配置:
title: 博客标题
subtitle: 子标题
description: 描述
yaml
配置环境变量
从 Hexo 迁移
如果你打算从 Hexo 博客迁移,只需要提供一个环境变量即可无侵入迁移。
-
如果你是 Linux 系统,你也可以通过
export
关键字来临时暴露这个环境变量:export BLOG_PATH=/path/to/your/hexoshell -
如果你是 windows,可以在本项目的根目录中创建一个
.env.local
文件:# .env.local BLOG_PATH=/path/to/your/hexoenv
从其它任意 Markdown 博客迁移
支持从任意 Markdown 类型的博客迁移,只要你的博客文件是由 Markdown 文件编写的,就可以进行迁移。
迁移时,除了基础的 BLOG_PATH
需要提供外(详见上面的 从 Hexo 迁移),还需要额外提供下面三个环境变量:
BLOG_HOME_POST_DIRECTORY
: 首页文章文件夹,这些文件将会在首页和归档中展示。BLOG_RESOURCE_DIRECTORY
: 资源文件夹,访问前缀固定为images
。BLOG_POST_DIRECTORY
:存放所有页面的文件夹,将会为这些页面构建 web 静态页面。
BLOG_HOME_POST_DIRECTORY
可以是 BLOG_POST_DIRECTORY
的子目录,但是反过来不行!除此之外,这两个目录也可以单独分开指定。
以 hexo 博客为例,上面三个参数应该分别配置为:
BLOG_HOME_POST_DIRECTORY
:source/_posts
BLOG_RESOURCE_DIRECTORY
:source/images
BLOG_POST_DIRECTORY
:source
在 hexo 中,source
目录中存放了所有的 Markdown 文档,source/_post
存放了首页文章的 Markdown 文档。
再例如,以下面的博客目录结构为例:
blog-root ├── ROOT │ ├── java_guide.md │ └── javascript_guide.md ├── javascript │ └── javascript_advance.md ├── img │ └── coffee.png ├── hello_world.md ├── java_advance.md └── _config.yamltext
其中 ROOT 目录中的 md 文件为 首页文章
,其它文件均为普通的 文章
(嵌套页面)。
相应的配置为:
BLOG_HOME_POST_DIRECTORY
:ROOT
BLOG_RESOURCE_DIRECTORY
:img
BLOG_POST_DIRECTORY
:./
BLOG_PATH
:/xxx/xxx/blog-root
注意 BLOG_POST_DIRECTORY
不能为空字符串。
Important 提示:这里的静态资源目录虽然为
img
,但实际访问前缀会被替换为images
,例如这里的img/coffee.png
,访问路径为images/coffee.png
. 这是 next.js 的限制,目前没有很优雅的方法解决。
开始构建
在完成上面的配置后,直接运行下面的命令就可以开始构建了:
npm run install npm run buildshell
运行完成后,会在 out
目录生成所有的静态文件。
常见问题
文章元数据
元数据类似于 Hexo 中的机制,需要你在 Markdown 文件的顶部提供文章相关的配置,例如:
---
title: async/await 异步编程
date: 2024-07-01 22:56:28
categories:
- Rust
tags: Rust
seo:
title: async/await 异步编程 | Rust
description: 使用 async/await 进行异步编程。
keywords:
- rust
- async
- await
---
# title
# sub-title
xxxx
md
详见 文章元数据
分支选择
应该优先考虑以 v<version>-stabled
分支作为基础来对博客进行构建,例如 v1-stabled
,我们会持续对这个分支进行稳固更新。
这样你就可以不用考虑频繁的小版本的更新是否需要应用到自己的博客上,你只需要关注当有新的大版本发布时是否需要更新就可以了。
添加图片
强烈建议使用 CDN 保存你的图片,而不是直接和博客静态文件一起分发。
由于 next.js 限制 (其实有解,但是不太优雅),所有的图片必须放到 images
目录中,可以手动配置,但是访问的路径前缀将始终为 images
。
例如在 hexo 中,图片必须全部放到 source/images
中,放在其它任何地方的图片都会被忽略。
所有的图片都使用了原生懒加载 loading="_lazy"
。
设置网站图标
对于网站图标 favicon.ico
可以直接放在根目录中。
例如在 hexo 中需要放在 source/favicon.ico
中。
提示: 小心使用 < 和 >
当你需要使用 >
和 <
时,请万分小心,如果这两个符号没有被 `、```、或转移符号包括或修饰的话,在构建时将会报错:
<hello> # illegal, will cause build failed.
<hello> # ok
\<hello\> # ok
`<hello>` # ok
``` # ok
<hello>
```
markdown
配置评论组件
配置评论组件需要设置两个环境变量:
NEXT_PUBLIC_COMMENT_SCRIPT_INJECT
NEXT_PUBLIC_COMMENT_CONTAINER_IDENTIFIER
下面以 giscus 为例进行演示。
进入 giscus 配置网站:https://giscus.app/zh-CN 。按照要求配置完成后获取到一段 script 脚本:
<script src="https://giscus.app/client.js"
data-repo="nextjs-particlex-theme/nextjs-particlex-theme.github.io"
data-repo-id="R_kgDOMcWxsw"
data-category="Announcements"
data-category-id="DIC_kwDOMcWxs84Chidp"
data-mapping="pathname"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="preferred_color_scheme"
data-lang="zh-CN"
data-loading="lazy"
crossorigin="anonymous"
async>
html
同时 giscus
要求网页中必须要拥有一个类名为 giscus
元素来作为评论组件的容器,所以最终的环境变量的值为:
NEXT_PUBLIC_COMMENT_SCRIPT_INJECT
:<上面那串脚本>
NEXT_PUBLIC_COMMENT_CONTAINER_IDENTIFIER
:.giscus
以 Github Pages 为例,在构建阶段,配置文件就要这么写:
- name: Build
env:
NEXT_PUBLIC_COMMENT_SCRIPT_INJECT: |
<script src="https://giscus.app/client.js"
data-repo="nextjs-particlex-theme/nextjs-particlex-theme.github.io"
data-repo-id="R_kgDOMcWxsw"
data-category="Announcements"
data-category-id="DIC_kwDOMcWxs84Chidp"
data-mapping="pathname"
data-strict="0"
data-reactions-enabled="1"
data-emit-metadata="0"
data-input-position="top"
data-theme="preferred_color_scheme"
data-lang="zh-CN"
data-loading="lazy"
crossorigin="anonymous"
async>
</script>
NEXT_PUBLIC_COMMENT_CONTAINER_IDENTIFIER: '.giscus'
yaml
配置 CDN
如果需要配置 CDN,你需要缓存项目中 public 目录中所有内容到你的 CDN 中,并最终在构建阶段提供环境变量。例如在 Github Actions中:
- name: Build run: 'snip...' env: NEXT_PUBLIC_CND_PUBLIC_PATH_BASE_URL: 'https://your.cdn/prefix'plaintext
Tip public 目录在一个 stable 分支中不会发生变动,当你使用新的分支时建议参考迁移指南来判断是否需要更新你的 CDN 数据。