Contents
  1. 1. 问题
  2. 2. 解决方案
    1. 2.1. 方案 A
    2. 2.2. 方案 B
    3. 2.3. 方案 C
      1. 2.3.1. Install
      2. 2.3.2. Options
      3. 2.3.3. 安装
      4. 2.3.4. 配置插件
  3. 3. 总结:方案选择

问题

我在学术主页里放了一些 paper 相关的 project 网页。因为 hexo 编译的时候,会把 source 文件夹下的所有 md 文件和 html 文件都给渲染了。结果就把我的一个 html 文件给渲染出错了,导致关键的可视化图表没显示出来。这个问题隐藏地很深,费了好一番功夫才找到原因。
怎么解决呢?最直接的方法就是每次编译后,把这个不想更改的文件夹手动 copy 到 public 文件夹下了。因为常常要编译,即使可以用命令行来完成 copy,也还是太麻烦了。拖了好久,今天我要立志解决这个问题!
经过一番检索,发现官方解决方案是用

1
2
layout: false
---

来防止单个 html 被渲染,但是,经测试,只是在一定程度上减少了渲染,但是还是有渲染!不行!

解决方案

再经过一番更深的检索,发现如下方法:

方案 A

http://riny.net/2014/move-blog-to-github/
修改 hexo 的源码

原作者测试用的 hexo 版本是 2.5.2
具体方法:
在 node 安装目录 \node_modules\hexo\lib\plugins\generator 下有个 page.js 文件 (ps: 测试的系统是win7 64 位),找到以下代码:

1
2
3
4
5
6
7
if (!layout || layout === 'false'){
route.set(item.path, function(fn){
fn(null, item.content);
});
} else {
render(item.path, [layout, 'page', 'post', 'index'], item);
}

将其修改为:

1
2
3
4
5
6
7
8
9
10
var notRender = ['test1', 'test2']; // 设置不被 render 的目录
var dir = path.substring(0, path.indexOf('/'));
if (!layout || layout === 'false' || notRender.indexOf(dir) > -1){
route.set(item.path, function(fn){
fn(null, item.content);
});
} else {
render(item.path, [layout, 'page', 'post', 'index'], item);
}

notRender 中的 test1, test2 目录即为不需要被 render 的目录,保存后,重新执行 hexo g 命令就会发现 source 中的 test1test2目录下的 html 文件没有被 render.

提示:其实在我的系统中,这个文件在 C:\Users\Yourname\AppData\Roaming\npm\node_modules\hexo\lib\plugins\generator 下。我都不记得当初安装的时候是怎么安装到这个文件夹下的了。

方案 B

http://xuanwo.org/2014/08/14/hexo-usual-problem/
放在主题的 source 目录下。

利用主题的 source 目录,也就是 themes/themes-name/source。因为这个文件夹里面的所有文件都会被复制到网站的根目录中去,正好满足我们的需求。
其实这个解决方案可以这么理解,那些不需要编译的页面是我们想要直接展示给用户的,这跟主题的目标是一样的。

方案 C

https://github.com/f111fei/hexo-processor-copyassets
Processor CopyAssets Plugin

这是最终采用的解决方案

This is a processor copyAssets plugin for Hexo.You can customize what files are not rendered but can direct copy while executing hexo generate.

Install

$ npm install hexo-processor-copyassets --save

Options

You can configure this plugin in _config.yml. ForExample:

1
copyAssets: project

or

1
copyAssets: CNAME,project,resource/img
  • copyAssets - The files or folders path in source folder that you want to direct copy to public folder.

为保持原 README.md 的结构,也附上中文:

这是一个 Hexo 的文件处理插件,能自定义 source 中的指定文件或文件夹,在执行 generate 命令的时候能直接复制到 public 文件夹中而不经过渲染。比如,这个文件source/project/index.html,我不想被渲染,那么你就可以使用这个插件。

安装

$ npm install hexo-processor-copyassets --save

配置插件

你可以在 _config.yml 中配置这个插件,例如:

1
copyAssets: project #表示 project 文件夹中的文件不被渲染,直接复制到 public 文件夹。

或者

1
copyAssets: CNAME,project,resource/img #可以指定文件和文件夹,用 "," 号隔开

总结:方案选择

至此,问题解决。优劣分析:方案 A 每次添加新的目录,都要修改底层的东西,不太好。方案 B 和 C 都很省事儿。不过方案 B,把文件放在 themessource文件夹下,换主题就会不方便。
推荐方案 C

如果觉得帮到了你,打赏一下吧!

Contents
  1. 1. 问题
  2. 2. 解决方案
    1. 2.1. 方案 A
    2. 2.2. 方案 B
    3. 2.3. 方案 C
      1. 2.3.1. Install
      2. 2.3.2. Options
      3. 2.3.3. 安装
      4. 2.3.4. 配置插件
  3. 3. 总结:方案选择