前言 前些时间一直在写博客,整理记录信息等,一直没有关心过博客架构版本的问题。
最近的一篇博文需要用到 MathJax ,我原以为 MarkDown 是支持 MathJax 的,在本地编写时没有遇到任何问题。
但发布到GitHub上后,直接导致我整个blog挂掉了,检查发现Hexo 如果要完美支持 MathJax ,需要hexo-renderer-kramed
等等东西。
还要修改blog架构的一些源码,感觉很复杂,并且配置也不是十分友好。
在浏览过程中,我发现 Hexo 版本已经发布到5.4.0了,我使用的 NexT 主题也已经到了7.x的版本。
心想一不做二不休,趁此次机会升级下blog架构。
开始以为很简单,结果直接导致我的blog没法启动/没法使用了,中间升级的过程特此记录下,希望能给也想升级Hexo blog的人一些帮助。
正文 起始 本次想要升级的最终结果如下:
名称 当前版本 升级版本 NodeJs v10.2.0 v16.2.0 Hexo v3.9.0 v5.4.0 NexT v5.1.4 v7.8.0
其中还伴随这一些插件的升级,由于一些低版本插件过时,可能存在被删除的风险,这也是本次升级的一个主要原因。
NodeJs的升级十分简单,直接在官网 NodeJs 上下载最新版安装即可。
当然如果想安装其他版本,直接在 NodeJs 以往的版本 上下载即可。
安装好最新版后,直接使用命令即可显示Node版本。
1 2 D:\blog\newblog>node -v v16.2.0
我们安装npm-upgrade
插件,使用npm-upgrade
命令,可以看到依赖可以更新到的最新版本。
1 2 3 npm install -g npm-upgrade npm-upgrade
开始我直接更新所有依赖,直接导致了Hexo blog不能正常启动。
新建Hexo博客框架 这儿我们从新搭建一个博客来解决blog框架的升级问题。
优点:
重新搭建,所有依赖都依据比较新的版本,且不会出现不兼容的情况。 NexT v5.x 和 NexT v7.x 变化巨大,甚至仓库地址都发生了变化,我们需要重新拷贝主题文件。 我们之前搭建blog在里面修改了很多代码实现某些功能,很混乱,不方便查找和修改,升级后我们可以统一处理了。(这也是我升级的一个主要原因) 新版本NexT新增了一些功能,我们一些手动实现的效果现在可以直接使用配置false
或者true
解决了。 据说新版本blog加载速度有所提升,不知道真的假的。 说到这儿,那我们开始吧,开始当然要检查下 Hexo 命令,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 D:\blog\blog>hexo -v INFO Validating config hexo: 5.4.0 hexo-cli: 4.2.0 os: Windows_NT 10.0.19042 win32 x64 node: 16.2.0 v8: 9.0.257.25-node.16 uv: 1.41.0 zlib: 1.2.11 brotli: 1.0.9 ares: 1.17.1 modules: 93 nghttp2: 1.42.0 napi: 8 llhttp: 6.0.1 openssl: 1.1.1k+quic cldr: 39.0 icu: 69.1 tz: 2021a unicode: 13.0 ngtcp2: 0.1.0-DEV nghttp3: 0.1.0-DEV
hexo-cli: 4.2.0 , hexo: 5.4.0 即为当前最新版本,不是的需要升级下 Hexo 。
Hexo 升级可以直接卸载重装即可。
1 2 3 4 5 npm uninstall hexo -g npm install hexo -g npm uninstall hexo-cli -g npm install hexo-cli -g
升级好后,使用以下指令:
① hexo init blog
② cd blog
③ npm install
④ hexo s
可以看到一个v5.4.0版本的 Hexo 博客初始化框架在 http://localhost:4000/ 启动了。
打开blog文件夹下的package.json
文件,可以看到blog的基本配置。
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 { "name" : "hexo-site" , "version" : "0.0.0" , "private" : true , "scripts" : { "build" : "hexo generate" , "clean" : "hexo clean" , "deploy" : "hexo deploy" , "server" : "hexo server" }, "hexo" : { "version" : "" }, "dependencies" : { "hexo" : "^5.0.0" , "hexo-generator-archive" : "^1.0.0" , "hexo-generator-category" : "^1.0.0" , "hexo-generator-index" : "^2.0.0" , "hexo-generator-tag" : "^1.0.0" , "hexo-renderer-ejs" : "^1.0.0" , "hexo-renderer-marked" : "^4.0.0" , "hexo-renderer-stylus" : "^2.0.0" , "hexo-server" : "^2.0.0" , "hexo-theme-landscape" : "^0.0.3" } }
这儿我们把 hexo 版本手动改成5.4.0,同时移除hexo-theme-landscape
,这儿主题对我们没用。
我们观察我们原来的配置文件。
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 { "name" : "hexo-site" , "version" : "0.0.0" , "private" : true , "hexo" : { "version" : "3.9.0" }, "dependencies" : { "gulp" : "^3.9.1" , "gulp-htmlclean" : "^2.7.22" , "gulp-htmlmin" : "^4.0.0" , "gulp-imagemin" : "^4.1.0" , "gulp-minify-css" : "^1.2.4" , "gulp-uglify" : "^3.0.0" , "hexo" : "^3.9.0" , "hexo-admin" : "^2.3.0" , "hexo-autonofollow" : "^1.0.1" , "hexo-deployer-git" : "^0.3.1" , "hexo-generator-archive" : "^0.1.4" , "hexo-generator-baidu-sitemap" : "^0.1.2" , "hexo-generator-category" : "^0.1.3" , "hexo-generator-feed" : "^1.2.2" , "hexo-generator-index" : "^0.2.0" , "hexo-generator-searchdb" : "^1.0.8" , "hexo-generator-sitemap" : "^1.2.0" , "hexo-generator-tag" : "^0.2.0" , "hexo-helper-live2d" : "^3.1.1" , "hexo-renderer-ejs" : "^0.3.0" , "hexo-renderer-marked" : "^0.3.0" , "hexo-renderer-stylus" : "^0.3.1" , "hexo-server" : "^0.2.0" , "hexo-tag-aplayer" : "^3.0.4" , "hexo-wordcount" : "^3.0.2" } }
首先我们添加如下插件:
1 2 3 4 5 6 7 8 9 10 11 12 npm install hexo-admin --save npm install hexo-deployer-git --save npm install hexo-excerpt --save npm install hexo-generator-baidu-sitemap --save npm install hexo-generator-feed --save npm install hexo-generator-searchdb --save npm install hexo-generator-sitemap --save npm install hexo-helper-live2d --save npm install hexo-related-popular-posts --save npm install hexo-symbols-count-time --save npm install hexo-tag-aplayer --save npm install hexo-autonofollow --save
添加好后,我们需要下载NexT
主题,新版的NexT主题可以在 https://github.com/theme-next/hexo-theme-next 找到,旧版本的为 https://github.com/iissnan/hexo-theme-next 需要注意。
我们直接copy到我们项目。
1 2 $ cd blog $ git clone https://github.com/theme-next/hexo-theme-next themes/next
弄好后,我们开始配置blog下的_config.yml
。
这个配置直接按照我们原先的blog,根据key对应过来就行。注意主题选择NexT。 theme: next
遇到的问题:
问题1 : language: zh-CN 原来blog是 zh-Hans
更改后,需要在 blog\themes\next\languages\zh-CN.yml
添加没有被翻译的文字。
问题2 : avatar 头像
Hexo v5.4.0 移除了这个参数,这个参数现在由NexT主题控制,并可以通过配置实现旋转,十分方便。
问题3 : excerpt 阅读更多功能
1 2 3 4 5 excerpt: depth: 5 excerpt_excludes: [] more_excludes: [] hideWholePostExcerpts: true
PS: NexT 配置里也可以进行相关配置,但是涉及到具体显示多少行,只能在此配置。
下面主要说一下NexT的_config.yml
配置,位置blog\themes\next_config.yml
。
问题4 : creative_commons 参数
1 2 3 4 5 6 7 8 9 10 creative_commons: license: by-nc-sa sidebar: true post: true language: deed.zh
这个参数会在文章结束后为自动为文章署名协议,不用我们改代码配置了。
问题5 : menu配置图标变化
1 2 3 4 5 6 7 8 menu: home: / || fa fa-home about: /about/ || fa fa-user tags: /tags/ || fa fa-tags categories: /categories/ || fa fa-th archives: /archives/ || fa fa-archive support: /support/ || fa fa-bookmark photos: /photos/ || fa fa-camera
图标配置均变为fa fa-home
这种格式,不注意会直接不显示图标,十分坑。
问题6 :avatar 头像配置
1 2 3 4 5 6 7 avatar: url: https://sakuratears.oss-cn-beijing.aliyuncs.com/blog/others/avatar.jpg rounded: true rotated: true
头像可以实现接触旋转,不用再手动修改NexT源代码了。
问题7 : 阅读更多
1 2 3 4 5 6 excerpt_description: true read_more_btn: true
主要由上面两项控制,hexo的配置文件里可以配置显示行数。
问题8 : 文章字数统计
1 2 3 4 5 6 symbols_count_time: separated_meta: true item_text_post: true item_text_total: true
改用symbols_count_time
插件了,需要注意。
问题9 :reward和follow me 也有变化,原来follow_me只支持微信公众号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 reward_settings: enable: true animation: true comment: 您的支持就是我创作的动力! reward: wechatpay: https://sakuratears.oss-cn-beijing.aliyuncs.com/blog/others/wechatpay.png alipay: https://sakuratears.oss-cn-beijing.aliyuncs.com/blog/others/alipay.jpg follow_me: WeChat: https://sakuratears.oss-cn-beijing.aliyuncs.com/blog/others/qrcode_wechat_subscriber.jpg || fab fa-weixin RSS: /atom.xml || fa fa-rss
问题10 : 标签云
1 2 3 4 5 6 7 8 tagcloud: min: 18 max: 36 start: "#ADD8E6" end: "#FFB6C1" amount: 300
原来是更改NexT主题代码写死的,现在只要配置就可以了。
问题11 : 有用的小功能
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 back2top: enable: true sidebar: true scrollpercent: true reading_progress: enable: true position: top color: "#37c6c0" height: 3px bookmark: enable: true color: "#222" save: manual github_banner: enable: true permalink: https://github.com/javazwt title: Follow me on GitHub
可以添加快速回到顶部的按钮back2top,阅读进度条reading_progress,书签bookmark还有github_banner。
原来要实现均要改源码。
问题12 : needmoreshare2
安装 hexo-next-share
插件。
1 npm install theme-next/hexo-next-share
进行如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 needmoreshare: enable: true cdn: js: //cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.js css: //cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.css postbottom: enable: false options: iconStyle: box boxForm: vertical position: bottomCenter networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook float: enable: true options: iconStyle: default boxForm: horizontal position: topRight networks: Weibo,Wechat,Douban,QQZone,Twitter,Facebook
分享图标便会出现在左下角。
问题13 : theme-next-pace
引入pace插件,使页面加载的时候显示进度条
1 2 cd themes/nextgit clone https://github.com/theme-next/theme-next-pace source /lib/pace
开启配置
1 2 3 4 5 6 pace: enable: true theme: mac-osx
问题14 : 用户自定义实现 custom_file_path
这是我要重点说的,该配置可以让用户有规则的配置其他内容,也方便我们以后的blog迁移,尽量做到无侵入。
1 2 3 4 5 6 7 8 9 10 11 12 13 custom_file_path: sidebar: source/_data/sidebar.swig postBodyEnd: source/_data/post-body-end.swig bodyEnd: source/_data/body-end.swig style: source/_data/styles.styl
比如我们想在侧边栏添加音乐,想在文末添加阅读结束标记,添加背景,添加鼠标点击效果等,以前的做法参见这几篇文章。
搭建自己的Hexo博客(1) 搭建自己的Hexo博客(2) 搭建自己的Hexo博客(3) 搭建自己的Hexo博客(4)
现在只要在source/_data
文件夹下(也可以不是这个文件夹,但是强烈建议放在source
文件夹下,这里面存放着的都是与框架无关的东西)即可。
最终效果如下:
SakuraTears’blog
博文压缩优化 原来我们blog使用的是gulp管理,还写了一些代码,不方便管理,现在我们引入hexo-neat
来压缩博文。
1 npm install hexo-neat --save
同时在Hexo配置文件里配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 neat_enable: true neat_html: enable: true exclude: neat_css: enable: true exclude: - '**/*.min.css' neat_js: enable: true mangle: true output: compress: exclude: - '**/*.min.js'
配置就不详解了,我们使用hexo g
命令,可以看到public
文件夹下的内容已被压缩。
其它不足 问题1 : 音乐栏不对齐
这个问题我也比较诧异,原来博客是好的,我在这块没做改动,还要看看CSS样式仔细研究一下。
问题2 :阅读更多上面没法正好兼容图片
问题3 :整体上感觉字体过大。
问题处理 阅读更多图片问题 对于上面的第二个问题,后面我在查找资料时看到如下文章:
Hexo excerpt <!—- more –> not working after update
因此我想到查看hexo-excerpt
代码是否有对于阅读更多的处理,搜索hexo-excerpt.js
,在node_modules
里找到该类。
可以看到是有对阅读更多进行处理的。
后面我想到是不是depth过深导致问题的原因,我把配置的depth改为了3。
1 2 3 4 5 excerpt: depth: 3 excerpt_excludes: [] more_excludes: [] hideWholePostExcerpts: true
重新启动blog果然好了。
但引发的另一个问题就是其他一些文字摘要显示的太少了……
后面我仔细想了下,原来配置用的auto_excerpt
。
1 2 3 4 5 auto_excerpt: enable: true length: 150
其摘要是查找150个字后显示阅读更多。不会考虑格式,因此基本就是3行,所以我原来的blog没有出现这种问题。
hexo-excerpt
在检索时保留了原文的格式,按照深度来进行处理。
但是如果没有图片,只有文字的话,比如深度是5,我在深度3的位置添加 more 标签,只显示深度3的部分,说明插件是没问题的。
后面我终于想到了一种解决办法。
就是如果文章开头就是图片,而且只想要摘要显示这张图片,depth又比较深的话,摘要里会显示文字部分。
我在图片后面加了两个more解决问题。
1 2 3 ![](https://sakuratears.oss-cn-beijing.aliyuncs.com/blog/title/show1.jpg) <!-- more --><!--more-->
canvas_nest 支持 下载canvas_nest插件。
1 2 cd themes/nextgit clone https://github.com/theme-next/theme-next-canvas-nest source /lib/canvas-nest
使用用户自定义的方式引入:
新建 footer.swig
1 2 3 {% if theme.canvas_nest %} <script color="0,0,255" opacity="0.5" zIndex="-1" count="99" src="/lib/canvas-nest/canvas-nest.min.js" ></script> {% endif %}
在NexT主题的_config.yml
配置如下:
1 2 3 4 5 custom_file_path: footer: source/_data/footer.swig canvas_nest: true
并将footer.swig
放到Hexo的source/_data
文件夹下。
如果不想在本地,也可以使用cdn。
1 2 3 {% if theme.canvas_nest %} <script color="0,0,255" opacity="0.5" zIndex="-1" count="99" src="https://cdn.jsdelivr.net/npm/canvas-nest.js@1/dist/canvas-nest.js" ></script> {% endif %}
添加网站底部建站时间支持 同上,将如下代码放置footer.swig
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 {% if theme.time_date %} <br > <span id ="timeDate" > 载入天数...</span > <span id ="times" > 载入时分秒...</span > <script > var now = new Date (); function createtime ( ) { var grt= new Date ("05/20/2018 00:00:00" ); now.setTime(now.getTime()+250 ); days = (now - grt ) / 1000 / 60 / 60 / 24 ; dnum = Math .floor(days); hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math .floor(hours); if (String (hnum).length ==1 ){hnum = "0" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum); mnum = Math .floor(minutes); if (String (mnum).length ==1 ){mnum = "0" + mnum;} seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum); snum = Math .round(seconds); if (String (snum).length ==1 ){snum = "0" + snum;} document .getElementById("timeDate" ).innerHTML = "本站已运行 " +dnum+" 天 " ; document .getElementById("times" ).innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒" ; } setInterval ("createtime()" ,250 );</script > {% endif %}
在NexT主题的_config.yml
配置如下:
1 2 3 4 5 custom_file_path: footer: source/_data/footer.swig time_date: true
总结 关于blog框架的更新基本就到这儿了,后面如果再有更新我会继续更新到此博文里。
原来的blog源码我没有删除,而是进行了备份。