Hexo建站踩坑日志

Hexo建站踩坑日志

前些日子看到了本年级5班搭建的“班级主页”(现在是Cloudreve页面不知道为什么),心血来潮想自己搞自己的博客。搜了HEXO官方文档 知乎的教程 (我觉得写得较好的一篇),却还愣是栽进不明所以的大坑里去。

一番折腾,再折腾,终于从大坑里边爬出来,开始填小坑了。

网络问题

cnpm的安装

npm(Node Package Manager)是node包的管理工具。
cnpm是淘宝做的一个完整的npmjs.org镜像(淘宝镜像),可以用它代替官方版本,国内访问速度很快。

只需要在cmd或鼠标右键再点Git Bash中输入

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

Enter即可!

以后所有的npm命令都可以换成cnpm命令!
妈妈再也不用担心我下不到依赖力

Where is my Git Bash Here

Git是以前想玩AI绘图的时候装的,我平时也不编程,Git Bash Here感觉放在右键菜单里没什么用,于是就,,删掉了。

看网上说还有原因就是没有把Git装在C盘。

其实只要会搜索也不复杂,附教程一篇:鼠标右键没有git bash here,右键添加git bash here并增加图标

初始化

在进行初始化的时候,会用到

1
$ hexo init

因为网络问题,等了很久,文件夹里并没有出现亲爱的node_modules文件夹。

此时正确节省时间的方法是

  1. Ctrl+C结束下载
  2. 使用万能的cnpm输入
    1
    $ cnpm install
    然后文件夹里就会单独安装一个node_modules模块。

其实这个步骤在Hexo文档里是存在的(不过人家用的是npm install),是一个补全dependencies的步骤,是初始化的收尾工作,但是!当初在大陆网络环境下强行使用npm的我,下载的node_modules,是不全的。

其实应该使用的解决方法就是用cnpm重新下载。但当时我并不知道,于是就多了巨多折腾的工夫,并给24年7月的重新部署埋下了祸根。

以下是我当时的错误示范,仅供参考

无论如何,安装目录下`\node_modules\.store`一般都是下全了的。

翻这个\.store可以找到相应包的版本号,即图中划红线部分
然后用

1
$ cnpm i xxxx@xx.xx.xx

进行安装,“@”后面为版本号。

而如果遇到蓝色框中的情况,则推荐用最旧的版本,反正能用就行

或者在npm官网 找到对应的包,然后找下载数最多的版本安装。

一个名为timed-out的npm包的官网页面
一个名为timed-out的npm包的官网页面

报错情况

诀窍:认真去看ERROR后面到底跟着些什么东西+会用搜索引擎。

Error: cannot find module'xxxx'

node.js版本18.16.0,在更换主题时,首先遇到了这个报错。

一眼顶针,node_modules缺包。(其实也是网络问题埋的雷)

Git Bash中输:

1
$ cnpm i xxxx

原则:缺啥装啥。

require() of ES Module

首先上原文

报错全文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cnpm install hexo-all-minifier
> hexo-all-minifier@0.5.7 › imagemin-mozjpeg@9.0.0 › mozjpeg@^7.0.0 postinstall D:\Hexo\node_modules\.store\mozjpeg@7.1.1\node_modules\mozjpeg
> node lib/install.js
D:\Hexo\node_modules\.store\decompress-tarbz2@4.1.1\node_modules\decompress-tarbz2\index.js:3
const fileType = require('file-type');
^

Error [ERR_REQUIRE_ESM]: require() of ES Module D:\Hexo\node_modules\.store\file-type@18.4.0\node_modules\file-type\index.js from D:\Hexo\node_modules\.store\decompress-tarbz2@4.1.1\node_modules\decompress-tarbz2\index.js not supported.
Instead change the require of D:\Hexo\node_modules\.store\file-type@18.4.0\node_modules\file-type\index.js in D:\Hexo\node_modules\.store\decompress-tarbz2@4.1.1\node_modules\decompress-tarbz2\index.js to a dynamic import() which is available in all CommonJS modules.
at Object.<anonymous> (D:\Hexo\node_modules\.store\decompress-tarbz2@4.1.1\node_modules\decompress-tarbz2\index.js:3:18)
at Object.<anonymous> (D:\Hexo\node_modules\.store\decompress@4.2.1\node_modules\decompress\index.js:5:26)
at Object.<anonymous> (D:\Hexo\node_modules\.store\bin-build@3.0.0\node_modules\bin-build\index.js:2:20)
at Object.<anonymous> (D:\Hexo\node_modules\.store\mozjpeg@7.1.1\node_modules\mozjpeg\lib\install.js:4:18) {
code: 'ERR_REQUIRE_ESM'
}

摘取重点可以看出,报错的中心在于第八行,新加入的插件(由报错看,是file-type的18.4.0版本)与原软件在规范(CommonJs/ES)的处理上起了冲突(此系本人有效使用搜索引擎得出的结果(骄傲))

原因在于使用install命令时,会自动安装最新版本(@latest版本)。先用uninstall卸载,再查看文档等,重新安装一些旧版本。

或者像上文所说,“在npm官网 找到对应的包,然后找下载数最多的版本安装。”

非法字符

报错全文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cnpm i @iktakahiro+markdown-it-katex@4.0.1
C:\Users\Admin\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\npa.js:17
throw newError;
^

Error: Invalid package name "@iktakahiro+markdown-it-katex": name can only contain URL-friendly characters package: root › @iktakahiro+markdown-it-katex@4.0.1
at npa (C:\Users\HP\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\npa.js:15:22)
at exports.parsePackageName (C:\Users\HP\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\lib\alias.js:4:13)
at Object.<anonymous> (C:\Users\HP\AppData\Roaming\npm\node_modules\cnpm\node_modules\npminstall\bin\install.js:165:7)
at Module._compile (node:internal/modules/cjs/loader:1254:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
at Module.load (node:internal/modules/cjs/loader:1117:32)
at Module._load (node:internal/modules/cjs/loader:958:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47 {
code: 'EINVALIDPACKAGENAME'
}

Node.js v18.16.0

这个问题就出现在第1行,@iktakahiro+markdown-it-katex@4.0.1出现了不合适的+。第16行也写得很清楚。把包名改成npm官网 上的@iktakahiro/markdown-it-katex@4.0.1就好。

Markdown问题


  本博客现在使用的Markdown渲染器为hexo-renderer-marked使用的公式渲染器为hexo-fliter-mathjax由于该插件会报错并且我难以解决,所以公式类书写换用JS方式实现。

Markdown

Typora还是太好用了,兼容各种Markdown扩展语法,和它一比,原版渲染器相形见绌。

也不是没有考虑过换用更高级的Markdown渲染器,也参考有几篇文章(Hexo的多种Markdown渲染器对比分析 [Hexo]选择更高级的Markdown渲染器 ),但是折腾来折腾去,还是换回了默认款。

  1. 很多Markdown渲染器对于中文文本的适配十分差劲

    一个删除线在中文语境下识别渲染失败的例子
    一个删除线在中文语境下识别渲染失败的例子

    这个问题无论换哪个渲染器都没有解决。

    不过也不能太过苛责,毕竟中文没有那么多空格在文章里。但这确实是一个需要去解决的问题啊。

  2. 其它渲染器自带的CSS样式不!好!看!

    本来用它的配件就是为了省事,结果你跟我说我还要自己写样式,不如不用。

  3. 配件繁多,难折腾,还冗余。

综上,我还是换回了默认的渲染器hexo-renderer-marked,转而通过自己写CSS样式表来实现提示、引用等功能。

所以现在就是,Markdown能解决的先用Markdown,其次用博客主题的配件,再不济上Html、CSS,最后上JS,缝合怪吗

写在后面

搭建这个博客,也是跟着文档一步一步走,跟着知乎上的教程一步步来的。但是,毕竟每个人的网络不一样,每个人的设备也不一样,遇到的问题也会是千奇百怪的。

以上遇到的问题,有的有些教程提到了,有的却连搜索引擎都找不到结果。实在是本人资源匮乏,真要去翻Issue可以翻个天长地久还经常无功而返,而要去Issue上提问题,那真的还不如自己找(而且最后发现大部分都是我自己的问题),所以只好一步一步,跟着经验和知乎、博客园、CSDN上零碎的只言片语慢慢来。

我其实并不会编程,而且因为学业的关系,前前后后花了近两个月,才把博客基本调教好。

不知道是不是真的没有人遇到过类似的问题,还是没有人愿意写这种文章,至少举目所及,我掉进的坑里,人迹罕至T_T

但回头一想,这一个个“踩坑”的过程,其实也是一次次锻炼耐心的过程。耐心是好东西,自古至今,可现代人最缺的东西之一好像就是耐心。

像是现在,知道“图种”是什么的人少之又少,之前在Bilibili还看到过一句话:

以前的伸手党给个链接还会自己下;现在的伸手党真的只会伸手。

还是希望这篇文章能够让有需要的人在自食其力的道路上,多一些成就感,少一些挫败感吧!

  • 标题: Hexo建站踩坑日志
  • 作者:
  • 创建于 : 2023-06-17 23:49:30
  • 更新于 : 2024-07-21 22:22:31
  • 链接: https://astralun.top/知识、经验与技巧/Hexo建站踩坑日志/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论