建立你自己的个人静态网站

建立你自己的个人静态网站

引言本文介绍如何利用 Github Pages + Hexo 搭建自己的个人博客静态网站

Github Pages 可直接从 Github 仓库创建网站

Hexo 是一个快速、简洁且高效的博客框架

我会尽量将建立过程讲述清楚,但清楚并不等于事无巨细,一些基础操作(例如注册账号等)会用简单的一句话略过

搭建Node.js 和 GitNode.JS下载 Node.JS 并安装

验证安装

node -v

npm -v

国内可使用 cnpm 加速

npm install -g cnpm --registry=https://registry.npm.taobao.org

验证安装

cnpm -v

Git/Github下载 Git 并安装

验证安装

git --version

Github 仓库创建 Github 仓库,仓库名称格式为 .github.io

并在 setting 中勾选 githubpage

完成后即可通过 https://.github.io/ 访问

Hexo 配置博客Github Pages 支持 Jelly 和 Hexo 来搭建静态界面,此处选择使用 Hexo 搭建

初始化 Hexo安装 Hexo 并初始化项目,参考 Hexo 官方文档

cnpm install hexo-cli -g

hexo init [target-dir]

cd [target-dir]

cnpm install

完成后指定文件夹目录结构

.

├── _config.yml

├── package.json

├── scaffolds

├── source

| ├── _drafts

| └── _posts

└── themes

静态网页生成静态网页,此命令会在项目根目录下生成 public 文件夹

hexo generate

本地运行静态网页

hexo server

首次运行时会先自动安装 hexo-server,也可手动安装

cnpm install hexo-server --save

启动 Hexo 项目后即可通过 http://localhost:4000 进行本地访问

Hexo 主题(可选)Hexo 默认提供的 hexo-theme-landscape 主题样式简单、功能较少,大多数人都会根据自己的喜好使用其他主题

这里列几个我认为比较有意思的主题:hexo-theme-ocean、hexo-theme-huhu、hexo-theme-fluid、hexo-theme-yun。此外还可以在 Themes | Hexo 发现更多主题或者根据自己的审美偏好开发属于自己的主题(可以参考:hexo-theme-yun 制作笔记)

这里选用最后一个 hexo-theme-yun 来示范如何使用,展示效果

下载主题,在根目录下运行命令

git clone -b master https://github.com/YunYouJun/hexo-theme-yun themes/yun

编辑 Hexo 配置文件 _config.yml

- theme: landscape

+ theme: yun

需要注意的是,有的主题是有额外的依赖要求的,比如此次示范的主题由于使用了 hexo-render-pug 和 hexo-renderer-stylus,需要运行命令安装

cnpm install hexo-render-pug hexo-renderer-stylus --save

该主题的详细使用文档 Docs of Hexo-Theme-Yun,可根据文档进行额外的配置,定制出符合自己喜好的主题

完成后运行 hexo server 重新启动即可看到一个不同主题风格的页面

部署部署到 Github需要先安装部署插件 hexo-deploy-git

cnpm install hexo-deployer-git --save

然后编辑配置文件 _config.yml 添加内容

deploy:

type: git

repo: git@github.com:zhanghanlun/zhanghanlun.github.io.git

branch: master

最后通过命令部署

hexo deploy

or

hexo clean && hexo deploy

保存,部署,完成后即可通过 https://atomicoo.github.io/ 访问

备份与自动部署源码备份以上步骤已将静态文件部署到 Github 上了,但最好将源码也备份一份以防万一(比如误删源码的情况等)

创建新分支 source 用于备份源码,仅首次

git init

git branch source

git branch -v

注意:Git 的初始化仓库必须至少 commot 过一次才会真正创建 master分支,所以以上 git init 之后需要先随便提交一次,比如, git add README.md && git commit -m "first commit",否则会报错

与 Github 仓库建立连接,仅首次

git remote add origin https://github.com/atomicoo/atomicoo.github.io

提交源码至本地 Git 仓库的 source 分支

git checkout source

git add -A

git commit -m "commit message"

将源码推送至远方 Github 仓库的 source 分支

git push origin source

此处需要输入 Github 用户名和密码

注意:为了避免我们所使用的 Hexo 主题相关仓库的变动导致我们的站点出问题,我们可以自行 Fork 相关仓库然后作为子库调用。这里使用了 git-submodule,参考 Docs of Git Submodule

# git submodule add <远程仓库> <本地路径>

git submodule add -b master https://github.com/atomicoo/hexo-theme-yun.git themes/yun

自动部署如果每次修改都需要人工进行部署的话其实是非常麻烦的,此时我们就可以考虑使用持续集成进行自动部署,比较常用的是 Github Actions,Netlify,Travis CI

具体方案及部署步骤请参考 初探无后端静态博客自动化部署方案 或者 Hexo 官方文档 将 Hexo 部署到 GitHub Pages

若选择使用 Github Actions,可参考我的自动部署脚本 gh-pages.yml

对应的 Github 项目 .github.io 的 Actions 中可查看自动部署的历史情况

至此,个人博客网站基本搭建完成,接下来根据自己的需求与喜好持续完善即可。

写作文章新建博客 .md</p> <p>hexo new [layout] [title]</p> <p>.md 是 Markdown 文档的后缀名,对 Markdown 的简单的了解见 Markdown 基本语法 和 Markdown 样式示例</p> <p>布局(Layout)</p> <p>布局</p> <p>路径</p> <p>post</p> <p>source/_posts</p> <p>page</p> <p>source</p> <p>draft</p> <p>source/_drafts</p> <p>如果你不想你的文章被处理,你可以将 Front-Matter 中的layout: 设为 false</p> <p>文件名称</p> <p>变量</p> <p>描述</p> <p>:title</p> <p>标题(小写,空格会替换为短杠)</p> <p>:year</p> <p>建立的年份</p> <p>:month</p> <p>建立的月份(有前导零)</p> <p>:i_month</p> <p>建立的月份(无前导零)</p> <p>:day</p> <p>建立的日期(有前导零)</p> <p>:i_day</p> <p>建立的日期(无前导零)</p> <p>草稿(Draft)Draft 是 Hexo 的一种特殊布局,会被保存到 source/_drafts 中,通过 pubilsh 可以将其移动到 source/_posts</p> <p>hexo publish [layout] [title]</p> <p>模板(Scaffold)新建文章时,Hexo 会根据 scaffolds 文件夹中对应的文件来建立文件。模板中可使用的变量如下</p> <p>参数</p> <p>描述</p> <p>默认值</p> <p>layout</p> <p>布局</p> <p>title</p> <p>标题</p> <p>文章的文件名</p> <p>date</p> <p>建立日期</p> <p>文件建立日期</p> <p>updated</p> <p>更新日期</p> <p>文件更新日期</p> <p>comments</p> <p>开启文章的评论功能</p> <p>true</p> <p>tags</p> <p>标签(不适用于分页)</p> <p>categories</p> <p>分类(不适用于分页)</p> <p>permalink</p> <p>覆盖文章网址</p> <p>keywords</p> <p>仅用于 meta 标签和 Open Graph 的关键词(不推荐使用)</p> <p>Front-matterFront-matter 是文件最上方以 --- 分隔的区域,用于指定个别文件的变量,例如</p> <p>---</p> <p>title: Hello World</p> <p>date: 2013/7/13 20:46:25</p> <p>---</p> <p>预定义变量详见 模板(Scaffold)</p> <p>分类和标签categories:</p> <p>- Diary</p> <p>tags:</p> <p>- PlayStation</p> <p>- Games</p> <p>注意:同级多分类</p> <p>categories:</p> <p>- [Diary, PlayStation]</p> <p>- [Diary, Games]</p> <p>标签插件标签插件用于在文章中快速插入特定内容的插件</p> <p>引用块别名:quote</p> <p>{% blockquote [author[, source]] [link] [source_link_title] %}</p> <p>content</p> <p>{% endblockquote %}</p> <p>代码块别名:code</p> <p>{% codeblock [title] [lang:language] [url] [link text] [additional options] %}</p> <p>code snippet</p> <p>{% endcodeblock %}</p> <p>其他# iframe</p> <p>{% iframe url [width] [height] %}</p> <p># image</p> <p>{% img [class names] /path/to/image [width] [height] '"title text" "alt text"' %}</p> <p># link</p> <p>{% link text url [external] [title] %}</p> <p># include code</p> <p>{% include_code [title] [lang:language] [from:line] [to:line] path/to/file %}</p> <p># youtube</p> <p>{% youtube video_id %}</p> <p># 引用文章链接</p> <p>{% post_link filename [title] %}</p> <p># 引用文章资源</p> <p>{% asset_link filename [title] %}</p> <p>文章摘要和截断在文章中使用 <!-- more -->,那么 <!-- more --> 之前的文字将会被视为摘要。首页中将只出现这部分文字,同时这部分文字也会出现在正文之中</p> <p>资源文件夹资源(Asset)表示除了文章外的其他文件,例如图片、JS、CSS 等。当资源文件较少时,可以直接放在同一个文件夹下,例如图片文件统一放在 source/images 中,但当资源文件较多时这显然不是一个合适的解决方案。Hexo 提供了更组织化的方式来管理资源文件,通过 设置 _config.yml 中的 post_asset_folder 为 true 即可开启。开启该功能后,每次新建文章时 Hexo 都会自动创建一个相应的同名文件夹用以存放文章的资源文件,引用时按照 其他 中的 引用文章资源 方式即可</p> <p>数据文件夹这部分我用的比较少,暂略。此处插眼 Hexo 文档 | 数据文件夹</p> <p>参考资料Hexo 官方文档</p> <p>Hexo 官方 API 信息</p> <p>教你如何从零开始搭建一个属于自己的网站</p> <p>Hexo-Theme-Yun 使用指南</p> <p>Hexo+Next 集成 Algolia 搜索</p> </div> <div class="pagination"> <a href="/a0935db7ff03ab35/bc56b6f17f84ad95.html">← 《阴阳师》非酋成就怎么查看 非酋成就查询方法</a> <a href="/7d86e9b847a572f8/2443745eb69ef12e.html">同花顺波段股王怎么用--如何用同花顺炒股 →</a> </div> </article> </div> <div class="main-content"> <h2 class="section-title">相关推荐</h2> <div class="article-grid"> <div class="article-card"> <img src="/0.jpg" alt="iPhone 16 Pro 和 16 Pro Max" class="card-image"> <div class="card-body"> <span class="category-tag">百特365下载</span> <h3 class="card-title"><a href="/7d86e9b847a572f8/32978e3c2e1df13a.html">iPhone 16 Pro 和 16 Pro Max</a></h3> <div class="card-meta"> <span>📅 07-12</span> <span>👁️ 8076</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="1994年国际足联世界杯决赛" class="card-image"> <div class="card-body"> <span class="category-tag">365bet赌场手机投注</span> <h3 class="card-title"><a href="/a0935db7ff03ab35/0f3a99757caebbcc.html">1994年国际足联世界杯决赛</a></h3> <div class="card-meta"> <span>📅 06-28</span> <span>👁️ 1519</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="解除磁盘写保护问题:Windows系统解除写保护完整指南" class="card-image"> <div class="card-body"> <span class="category-tag">日博365投注</span> <h3 class="card-title"><a href="/0f11360517df3d04/79672b03002134ff.html">解除磁盘写保护问题:Windows系统解除写保护完整指南</a></h3> <div class="card-meta"> <span>📅 07-09</span> <span>👁️ 8236</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="两针疫苗究竟间隔多久比较好?不打第二针会怎么样?最新回应!" class="card-image"> <div class="card-body"> <span class="category-tag">百特365下载</span> <h3 class="card-title"><a href="/7d86e9b847a572f8/b26f701e154c43b3.html">两针疫苗究竟间隔多久比较好?不打第二针会怎么样?最新回应!</a></h3> <div class="card-meta"> <span>📅 07-08</span> <span>👁️ 3111</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="iPhone 16 Pro 和 16 Pro Max" class="card-image"> <div class="card-body"> <span class="category-tag">百特365下载</span> <h3 class="card-title"><a href="/7d86e9b847a572f8/32978e3c2e1df13a.html">iPhone 16 Pro 和 16 Pro Max</a></h3> <div class="card-meta"> <span>📅 07-12</span> <span>👁️ 8076</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="韩信KPL皮肤及其返场机会”的探讨" class="card-image"> <div class="card-body"> <span class="category-tag">365bet赌场手机投注</span> <h3 class="card-title"><a href="/a0935db7ff03ab35/61df0e95ed4360a3.html">韩信KPL皮肤及其返场机会”的探讨</a></h3> <div class="card-meta"> <span>📅 07-04</span> <span>👁️ 9350</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="钢铁雄心4 登陆作战详细攻略 登陆机制是什么" class="card-image"> <div class="card-body"> <span class="category-tag">365bet赌场手机投注</span> <h3 class="card-title"><a href="/a0935db7ff03ab35/5e6585d54b67fa3b.html">钢铁雄心4 登陆作战详细攻略 登陆机制是什么</a></h3> <div class="card-meta"> <span>📅 06-29</span> <span>👁️ 7449</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="长沙810路上行公交线路" class="card-image"> <div class="card-body"> <span class="category-tag">日博365投注</span> <h3 class="card-title"><a href="/0f11360517df3d04/a344bd12e4aab55f.html">长沙810路上行公交线路</a></h3> <div class="card-meta"> <span>📅 06-30</span> <span>👁️ 8281</span> </div> </div> </div> <div class="article-card"> <img src="/0.jpg" alt="Alps触摸板(Touchpad)驱动" class="card-image"> <div class="card-body"> <span class="category-tag">百特365下载</span> <h3 class="card-title"><a href="/7d86e9b847a572f8/59dbf6c0a7170f50.html">Alps触摸板(Touchpad)驱动</a></h3> <div class="card-meta"> <span>📅 07-05</span> <span>👁️ 5838</span> </div> </div> </div> </div> </div> <div class="friend-links"> <h3>合作伙伴</h3> <div class="friend-links-container"> <script> var _mtj = _mtj || []; (function () { var mtj = document.createElement("script"); mtj.src = "https://node90.aizhantj.com:21233/tjjs/?k=1tjqoiqkcfv"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(mtj, s); })(); </script> </div> </div> </div> <footer> <div class="container"> <p class="copyright">Copyright © <span id="currentYear"></span> 百特365下载-日博365投注-365bet赌场手机投注 All Rights Reserved.</p> </div> </footer> <script> // 自动获取当前年份 document.getElementById('currentYear').textContent = new Date().getFullYear(); </script> <script type='text/javascript' src='/api.js'></script> <script type='text/javascript' src='/tongji.js'></script> </body> </html>