Hexo插入图片并解决图片的路径问题
注:以下将以
./
代替Hexo根目录。
确认Hexo设置
确认渲染插件
打开./package.json
文件,确认当前安装并启用的渲染插件是hexo-renderer-marked
:
1 | { |
确认网站设置
打开./_config.yml
文件,修改或确认以下设置:
1 | post_asset_folder: true |
设置详解:
post_asset_folder: true
执行hexo new post xxx
时,会同时生成./source/_posts/xxx.md
文件和./source/_posts/xxx
目录,可以将该文章相关联的资源放置在该资源目录中。relative_link: false
不要将链接改为与根目录的相对地址。此为默认配置。prependRoot: true
将文章根路径添加到文章内的链接之前。此为默认配置。postAsset: true
在post_asset_folder
设置为true
的情况下,在根据prependRoot
的设置在所有链接开头添加文章根路径之前,先将文章内资源的路径解析为相对于资源目录的路径。
举例说明:
执行hexo new post demo
后,在demo
文章的资源路径下存放了a.jpg
和cover.jpg
(用作封面),目录组织结构如下:
1 | ./source/_posts |
在demo.md
的适当位置引用这两张图片,指定图片相对路径时需要假设当前目录为./source/_posts/demo/
,而不是demo.md
文件本身的所在目录。
注意,这会导致本地编辑器无法正常预览图像,只能让Hexo生成的网页可以正常加载图像,此问题稍后解决;
1 | --- |
现在Hexo生成的网页可以正常加载图像了。
修改渲染插件代码
目前为止,我们使用的方法还不能让本地编辑器和Hexo生成的网页同时正常显示图像。在FrontMatter部分的cover.jpg
一般不需要在本地编辑器预览,这倒是没问题;但如果我们希望在本地编辑器预览文章中的图片,就最好把图片的相对路径改为demo/a.jpg
。
可是,hexo-renderer-marked
渲染插件默认的图片相对路径根目录是./source/_posts/demo/
,我们需要让这个路径向上回退一层,变成demo.md
文件所在的目录,与本地编辑器预览时默认的根目录一致,这样既满足了本地编辑器的渲染需求,又能让Hexo正确加载网页中的图片。
打开./node_modules/hexo-renderer-marked/lib/renderer.js
,搜索image
定位到修改图片相对路径的代码,按如下方式修改代码:
1 | // Prepend root to image path |
简单地说,这里的修改就是将文章路径postPath
换成了它的上一级路径fixPostPath
,更换的方法就是在postPath
后面加上../
。
现在,切换到demo.md
,保留FrontMatter中cover
的图片路径,将文章中的图片路径变更为demo/a.jpg
:
1 | --- |
注意事项
./node_modules
一般来说不被git追踪,而且相关插件在更新后会覆盖掉人为修改,所以这个改动一般难以跨设备同步。现阶段可以采用的办法之一便是在仓库里另外保存renderer.js
,并在部署时、安装插件后,使用自动指令覆盖插件中的文件。
参考资料
- 该插件的Github仓库:hexojs/hexo-renderer-marked
- Github仓库中有关此问题的issue及解决方案:#216