Hexo搭建/部署个人博客教程 - 实践

news/2025/10/2 17:26:15/文章来源:https://www.cnblogs.com/wzzkaifa/p/19123770

Hexo搭建/部署个人博客教程

前言

参考:

也是一时兴起,花了两三天时间使用Hexo搭建了一个个人博客,个人博客链接:https://www.halfmantou.xyz/。目前已经将CSDN所有的博客迁移过去了。当然为了通用性,CSDN的博客还是会持续同步更新。

搭建和部署的过程当中也是或多或少遇到了一些奇奇怪怪的问题,于是特意写此篇阅读来记录一些点点滴滴。

Hexo博客搭建

需要预先准备的环境如下:

  • Node.js v18.19.0(我当前电脑本身装的是这个版本,版本其实不做什么要求!)
  • Git(不限版本)
  • Win11

本文是Hexo教程,默认用户是了解Git的,所以对于Git、Nodejs环境搭建和使用不做任何讲解!!!

搭建hexo博客命令如下:

# 创建一个目录work,进入work目录执行如下命令:
# 安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 安装hexo
cnpm install -g hexo-cli
# hexo 初始化
hexo init hexo-blog
cd hexo-blog
# 安装依赖
cnpm install

网站生成与测试:

# 网站生成
hexo generate
# 网站启动
hexo server

根据日志提示在浏览器当中输入localhost:4000可以访问到一个最简单的hexo欢迎页。

目前项目结构如下:

在这里插入图片描述

  • public: hexo generate 命令生成的html静态网页。
  • source: 我们.md博客存放的目录。主要放在_posts文件夹下。
  • themes: 主题代码存放目录,后面我们会给hexo换主题。
  • _config.yml: hexo的一些配置信息。

本小节参考自:https://blog.csdn.net/weixin_45019350/article/details/121901433。该文当中还讲解了如何将hexo部署到github。最终是将hexo生成的pulibc目录部署到了github,可以通过形如:https://用户名.github.io/方式去访问。并且也提到了由于github访问速度过慢,采用国内的gitee page的方式部署hexo,但是gitee page 机制在2024年已停止使用。所以找来找去,我采用了 花7块钱买了一个国内域名 + vecerl + github的部署方式。成功保证国内可以流程访问我的个人博客,具体部署方式在后面小结进行详细讲解。

移植主题

挑来挑去,我最终选择了NextT主题:https://github.com/theme-next/hexo-theme-next,具体主题的移植方式可以参考github仓库docs当中的 文档。该文档是对linux用户友好的,使用的是curl命令组合。在win用户可以直接把发布的最新版本下载下来,然后解压到themes目录,重命名为next。然后修改顶层_config.yml文件:

theme: next

使用 hexo clean && hexo server 命令可以看到博客页面主题效果。

一眼看去,你一定会觉得不太对劲,为啥导航栏可能只要 首页/归档 两个页面?和想像的不一样啊?这是因为主题配置文件默认配置比较简单,并且我们的source目录下本来就没有创建关于/标签/分类/归档页面。

NexT主题使用配置教程文档有你想要的关于next配置一切问题的解答,这里就不过多废话。

博客迁移

博客迁移的过程当中,最大的问题是就是markdown文件当中图片路径问题。经过一番搜索,需要改顶层的_config.json

post_asset_folder: true
marked:
prependRoot: true
postAsset: true

这样按道理hexo会在xxx.md文件同级目录下生成xxx目录,用于存放图片。此时md当中可以使用./xxx/p.png的方式使用相对路径用于图片。

但是,图片还是加载不出来,调试半天发现网页在请求图片时,路径不太对。使用浏览器调试抓包请求路径如下:

http://localhost:4000/.com//photo/PipelineAndFlow.png

这肯定就不对,经过一番搜寻网上大部分结果都是建议将hexo-blog/node_modules/hexo-asset-image/index.js当中的:

$(this).attr('src', config.root + link + src);
console.info&&console.info("update link as:-->"+config.root + link + src);

修改为:

$(this).attr('src',  src);
console.info&&console.info("update link as:-->"+ src);

这么改确实可以解决在我们点进文章后,图片加载失败的问题。但是我后来发现,在首页预览文章时,如果带有图片,图片还是没加载出来,经过浏览器抓包,文章内部图片请求路径没有问题,但是首页请求图像路径还是存在问题。最终调试hexo-asset-image的代码发现首页请求的路径居然是相对路径。

在这里插入图片描述

其实应该这么改:

'use strict';
var cheerio = require('cheerio');
// http://stackoverflow.com/questions/14480345/how-to-get-the-nth-occurrence-in-a-string
function getPosition(str, m, i) {
return str.split(m, i).join(m).length;
}
hexo.extend.filter.register('after_post_render', function(data){
var config = hexo.config;
if(config.post_asset_folder){
var link = data.permalink;
var beginPos = getPosition(link, '/', 3) + 1;
var appendLink = '';
// In hexo 3.1.1, the permalink of "about" page is like ".../about/index.html".
// if not with index.html endpos = link.lastIndexOf('.') + 1 support hexo-abbrlink
if(/.*\/index\.html$/.test(link)) {
// when permalink is end with index.html, for example 2019/02/20/xxtitle/index.html
// image in xxtitle/ will go to xxtitle/index/
appendLink = 'index/';
var endPos = link.lastIndexOf('/');
}
else {
var endPos = link.lastIndexOf('/');
}
link = link.substring(beginPos, endPos) + '/' + appendLink;
var toprocess = ['excerpt', 'more', 'content'];
for(var i = 0; i < toprocess.length; i++){
var key = toprocess[i];
var $ = cheerio.load(data[key], {
ignoreWhitespace: false,
xmlMode: false,
lowerCaseTags: false,
decodeEntities: false
});
$('img').each(function(){
if ($(this).attr('src')){
// For windows style path, we replace '\' to '/'.
var src = $(this).attr('src').replace('\\', '/');
if(!(/http[s]*.*|\/\/.*/.test(src)
|| /^\s+\//.test(src)
|| /^\s*\/uploads|images\//.test(src))) {
// For "about" page, the first part of "src" can't be removed.
// In addition, to support multi-level local directory.
var linkArray = link.split('/').filter(function(elem){
return elem != '';
});
var srcArray = src.split('/').filter(function(elem){
return elem != '' && elem != '.';
});
if(srcArray.length > 1)
srcArray.shift();
src = srcArray.join('/');
$(this).attr('src', config.root + link + src);
console.info&&console.info("update link as:-->"+config.root + link + src);
}
}else{
console.info&&console.info("no src attr, skipped...");
console.info&&console.info($(this));
}
});
data[key] = $.html();
}
}
});

和源码对比,其实就改了一行:

将原来的:

var endPos = link.lastIndexOf('.');

改成了:

var endPos = link.lastIndexOf('/');

至此图片路径问题就解决了。

博客部署到Vercel

前面提到我的部署方式为: 花7块钱买了一个国内域名 + vecerl + github的部署方式

首先在github创建一个仓库名为hexo-blog(可以任意取名),然后需要将我们创建的 hexo-blog 目录推送到GitHub,命令如下:

echo "# hexo-blog" >> README.md
git init
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/LunarStore/hexo-blog.git
git push -u origin main

然后就是注册vercel账号、创建vercel项目、购买一个国内域名、为域名设置记录等操作,具体流程可以参考:vercel部署hexo。根据链接一步步来按道理是没有问题。每次更新博文后注意忽略pulibc等目录,最好将无需推送的文件放到ignore目录。仅将md和配置更新部分推送到github,vercel会自动到github仓库拉取最新代码,然后编译部署。

但总是有意外,vercel拉取仓库后,在 Hexo build 阶段报错:

sh: line 1: /vercel/path0/node_modules/.bin/hexo: Permission denied Error: Command "hexo generate" exited with 126

也是各种尝试,最终是修改了在vercel项目创建阶段设置的build命令,并且在 hexo-blog 项目根目录添加了build.js脚本,绕过了使用/vercel/path0/node_modules/.bin/hexo,解决了该问题。

目前我的Vercel项目 Build Command、Output Directory、 Install Command配置如下:

在这里插入图片描述

build.js脚本如下:

const Hexo = require('hexo');
async function build() {
const hexo = new Hexo(process.cwd(), {
silent: false
});
try {
await hexo.init();
await hexo.call('generate', {});
await hexo.exit();
console.log('Hexo build completed!');
} catch (error) {
console.error('Hexo build failed:', error);
process.exit(1);
}
}
build();

本章完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技公司网站php源码游戏建模培训

持续创作文章&#xff0c;只是为了更好的思考 这里不多介绍了&#xff0c;我放一张图大家就明白是什么接口了。这里只介绍整体加密逻辑&#xff0c;有些细的地方大家自行调整。 本次逆向的网址是 aHR0cHM6Ly90cGFzcy5qaWxpbi5jaGluYXRheC5nb3YuY246ODQ0My8jL2xvZ2luP3JlZGly…

微信网站开发人力资源做网站的好处

今天继续和大家一起来学习初中数学&#xff0c;初一的相关知识&#xff0c;在前面已经介绍了正数和负数&#xff0c;对于有理数也有了清楚的认识&#xff0c;今天我们来学习相反数&#xff0c;相反数的概念和表示是中考命题的热点之一&#xff0c;经常结合其他知识点一起考察&a…

做题记录(Part 1. 基础算法)

P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断能否达到即可。复杂度 \(O(n\log V)\)。 关联题目:[2025国庆集训Day2C] course点击查看代码 signed main(){ read(n), read(m); for(register int i = 1; …

河南艾特网站建设2二级域名免费

定义 树是节点的优先集合度&#xff1a;孩子的数量&#xff0c;度为0 就是终端节点&#xff0c;不为零就是根节点有序树&#xff1a;有顺序&#xff0c;不可以替换无序树&#xff1a;无顺序&#xff0c;可以替换深度 和 树的深度相反&#xff0c;第一层深度为1 树的深度为 3 二…

实用指南:零基础学AI大模型之Prompt提示词工程

实用指南:零基础学AI大模型之Prompt提示词工程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

县城做网站的多么开网上授课的网站应该怎么做

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…

详细介绍:2023 美赛C Predicting Wordle Results(上)

详细介绍:2023 美赛C Predicting Wordle Results(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

Android项目实现自动获取手机号一键登录功能

功能概述 在 Android 应用中实现自动获取本机手机号进行一键登录,同时支持手动登录和历史账号选择功能。这个功能大大提升了用户体验,减少了用户输入成本。 1. 权限配置 首先在 AndroidManifest.xml 中添加必要的权限…

电商网站程序做引流去那些网站好

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种编程技术&#xff0c;使得开发者能够像调用本地函数一样调用位于不同进程、不同主机上的函数或服务。这种技术隐藏了底层网络通信细节&#xff0c;使得分布式系统中的组件能够无缝协作&#xf…

互联网+政务服务平台广告优化

5 月 8 日凌晨消息&#xff0c;微软 Build 2018 开发者大会在今天正式来开帷幕。很明显整场发布会被分为了上下两个部分&#xff0c;上半场如果说是聊一些技术实现和愿景&#xff0c;那下半场就应该说是实战说明了。跨平台云端编程了解下微软在现场展示了 Visual Studio&#x…

深圳 网站 传播自己建设网站模版

【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09;1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

做试客需要去哪些网站比比西旅游网站建设

本文已发表在《程序员》杂志2016年10月期。 如果在使用App时遇到闪退&#xff0c;你可能会选择卸载App、到应用商店怒斥开发者等方式来表达不满。但开发者也同样感到头疼&#xff0c;因为崩溃可能意味着用户流失、营收下滑。为了降低崩溃率&#xff0c;进而提升App质量&#xf…

python必背入门代码天河网站 建设seo信科分公司

定义外键之后&#xff0c;数据库的每次操作都需要去检查外键约束。对于插入来说&#xff0c;影响了插入速度&#xff1b;对于更新来说&#xff0c;级联更新是强阻塞&#xff0c;存在数据库更新风暴&#xff08;Database Update Storm&#xff09;的风险。 所谓 Database Updat…

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析

打造优雅的用户体验:自定义jQuery程序提示插件开发全解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

免费股票API接口全面指南 - 详解

免费股票API接口全面指南 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

广州英铭网站建设北京丰台区做网站公司

一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像&#xff0c;然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像&#xff0c;通过信道传输后再利用算法的逆过程提出秘密信息。而生…

Multi-Arith数据集:数学推理评估的关键基准与挑战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做电脑网站用什么软件好用吗企业管理系统作用

随着计算机控制系统在人们生活中的普及,软件自身的可靠性也越来越受到重视.在航空、高铁、核电及军事等高安全要求领域的软件系统——安全关键系统(safety-critical system,简称SCS)更是受到高度的重视.而随着软件系统的复杂度越来越高,软件系统的安全性保证也变得越来越困难.这…

西宁平台网站建设学信网 的企业网站给你做认证

一、镜像基础命令&#xff1a; $ docker info # 查看docker信息 $ docker system df # 查看镜像/容器/数据卷所占的空间。 $ ip addr #查看容器内部网络地址。 $ docker images # 查看镜像 $ docker search 镜像名称 # 搜索镜像 --limit :只列出N个镜像&#xff0c;默认为25个…

福田企业网站优化排名昆山公司网站建设电话

1 需求 加密算法分类如下&#xff1a; 可逆加密算法&#xff1a;加密和解密使用相同密钥的加密算法。常见的对称加密算法有DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。不可逆加密算法&#xff1a;数据加密后就不能被解密&#xff0c;常用的算法有MD5、SHA1。非对称…