部署hexo到github.io的一些小问题(持续更新)

部署hexo到github.io的一些小问题(持续更新)

Lucas Lv5

1. 操作没问题,但就是部署失败

hexo 在部署主题到 github.io 的时候,会有不小的延迟,如果确信你的操作没问题,但就是主题没有生效,那很有可能是github-Pages正在处理( github-pages 会显示一个 Queued ,意思就是在队列里面,还没处理)

1.png

2. 加载图片

加载图片是一个稍微复杂一点的操作

官方文档推荐了两种方法

  • 自己设置文件夹:应该将图片文件放进 source/img 里面(文件夹名字可以自定义),然后这样写 ![1.png](/img/图片路径)

    但是我在使用这种方法的时候,会出现本地编写的时候,无法识别图片导致实时预览效果很差
    所以我尝试将路径前面加了两个点 -> ![1.png](../img/图片路径) 发现没有问题,预览和 hexo g 都没有出现差错。

  • 自动创建 asset_folder :还有就是将 config.yml 里的 post_asset_folder 设置为 true ,他就会在你 new 一篇文章的时候,自动在 _post 文件夹下创建一个和文章同名的文件夹,来存放你所有的资源文件,然后你引用图片就可以 -> ![1.png](文章名/图片名) 这样做的好处就是可以自动创建文件夹,并按不同文章分类,当然,你可以可以创建一个经常在各个文章调用资源的公共文件夹

  • 相对路径引用的标签插件:这个是一个新功能,但是在本地编写的时候没法预览还是不太方便,详细可以看官方文档,我把链接贴在这里 hexo官方文档

  • 最后也是我在用的,使用 Markdown 嵌入图片,这个也是会在你 new 一篇文章的时候,自动在 _post 文件夹下创建一个和文章同名的文件夹,来存放你所有的资源文件,但是你写地址的时候,会直接将 ![](image.jpg) 解析为 <img src="/2020/01/02/foo/image.jpg"> ,但是如果你在本地编辑, ![](image.jpg) 则无法显示预览,填写 ![1.png](文章名/图片名) 则无法在 html 上正确显示链接,所以我们可以在 hexo 转化的过程中,做一下改动,直接改代码!!!

    • 先看你使用的是哪个渲染器,直接在你博客主目录执行

      1
      npm list
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      $ npm list
      hexo-site@0.0.0 /Users/darkFlameMaster/BlogSpace
      ├── hexo-deployer-git@4.0.0
      ├── hexo-filter-mathjax@0.9.0
      ├── hexo-generator-archive@2.0.0
      ├── hexo-generator-category@2.0.0
      ...
      ├── hexo-renderer-markdown-it@7.1.0
      ...
      ├── ...
      ├── ...
      └── ...

      hexo-renderer-markdown-it 就是我的渲染器

    • hexo-renderer-markdown-it 渲染器

      如果你的渲染器是 hexo-renderer-markdown-it,修改如下内容:

      1
      post_asset_folder: true

      如果你的渲染器是 hexo-renderer-marked

      搜索 post_asset_folder ,改成 true ,然后添加

      1
      2
      3
      4
      post_asset_folder: true
      marked:
      prependRoot: true
      postAsset: true

      如果没有,那就在自己添加一下,但我强烈建议你使用 hexo-renderer-markdown-it

    • 引入 js 代码

      修改源代码是很愚蠢的做法,不要听信别人的教程,直接在你博客的根目录创建 script 文件夹,然后在里面创建一个 fix_img_path.js 粘贴进去

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
            hexo.extend.filter.register('before_post_render', function (data) {
      if (!data.source) return data;

      // 1. 计算前缀
      let urlPrefix = data.path.replace(/\.html$/, '');
      if (!urlPrefix.startsWith('/')) urlPrefix = '/' + urlPrefix;
      if (!urlPrefix.endsWith('/')) urlPrefix += '/';

      // 2. 检查是否跳过
      function shouldSkip(src) {
      return !src || /^(\s*$|https?:|\/\/|\/|data:)/.test(src);
      }

      // 3. 正则表达式
      const regex = /(```[\s\S]*?```|`[^`]*`)|(!\[.*?]\()((?:[^()]|\([^()]*\))+)(\))|(<img\s+[^>]*?src=(["']))([^"']+)(\6[^>]*>)/gi;

      data.content = data.content.replace(regex, function (match, codeBlock, mdPre, mdContent, mdPost, htmlPre, quote, htmlContent, htmlSuffix) {
      if (codeBlock) return match;

      // --- Markdown ---
      if (mdPre) {
      let src = mdContent;
      let title = '';

      // 标题以 空格+" 或 空格+' 或 空格+= 开头
      const titleMatch = mdContent.match(/^(.+?)(\s+["'=].*)$/);
      if (titleMatch) {
      src = titleMatch[1];
      title = titleMatch[2];
      }

      if (shouldSkip(src)) return match;

      const filename = src.split('/').pop();
      return `${mdPre}${urlPrefix}${filename}${title}${mdPost}`;
      }

      // --- HTML ---
      if (htmlPre) {
      if (shouldSkip(htmlContent)) return match;

      const filename = htmlContent.split('/').pop();
      return `${htmlPre}${urlPrefix}${filename}${htmlSuffix}`;
      }

      return match;
      });

      return data;
      });
      ```

      这里有一个小小的缺陷,那就是 本地的图片 只能引入固定位置的资源了,也就是前面所说的自动创建的与文章同名的文件夹

      如果我们想要引用其他位置的资源文件,除了将文件拷贝过来,就只能将文件上传到指定的云端来引入了

      当前大部分情况下我们 **本地文件夹+网络连接** 已经可以覆盖90%的情况了,如果我们有一些公共的资源文件,可以将文件放在 `source/img` 没有就自己新建一个, `hexo d` 提交到 `github` 后,可以直接引用 `博客地址/img/文件名` 来引用了非常好用!!!

      ## 3. 上传 github 报权限问题

      如果你感觉自己配置完全没问题,那你可以试着把代理关掉

      ```text
      Please make sure you have the correct access rights
      and the repository exists.
      FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
      Error: Spawn failed
      at ChildProcess.<anonymous> (/Users/DarkFlameMaster/BlogSpace/node_modules/hexo-util/lib/spawn.js:51:21)
      at ChildProcess.emit (node:events:513:28)
      at ChildProcess._handle.onexit (node:internal/child_process:291:12)

同样我在这里也提到过类似的问题 git 的奇怪问题 kex_exchange_identification: Connection closed by remote host

  • 标题: 部署hexo到github.io的一些小问题(持续更新)
  • 作者: Lucas
  • 创建于 : 2023-04-18 03:57:31
  • 更新于 : 2025-12-23 17:31:40
  • 链接: https://darkflamemasterdev.github.io/2023/04/18/部署hexo到github.io的一些小问题/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
部署hexo到github.io的一些小问题(持续更新)