起因是今天晚上比较闲,于是给自用的 Bot 加了个小功能,我的 Bot 是基于 webhook 的,整个代码都放在 Firebase Functions 上,然后我改了一半手痒痒,给我的博客也升级了一波依赖,于是碰到了奇葩的问题。
我的博客是基于 Vuepress 的,以前 0.x 的时候还不支持 Blog 插件,我断断续续把博客的必须功能给填上了,当时用着挺好,然而后来 1.0 正式 release 了,切换过去之后主题出现了点小问题:渲染之后的页面刚开始加载的时候样式是烂的(现在也没去修复,因为下班时间都搞另一个项目了)。
当然,这是小问题,所以我就一直鸽着没管,然而上了 1.x 之后我一直都不太爽,这玩意渲染得太慢了,三十来篇的文章要渲染十几分钟(有部分是特定账号登录才能看到)。
然后今天更新了一波依赖之后,GG,push 到服务器后 CI 跑一半直接报了个JavaScript heap out of memory
的错误,这错误之前我司的前端项目也出现过,后来加了个参数给 node 就搞定了,远程回公司看了下项目的project.json
,在cross-env
后面加一段NODE_OPTIONS=\"--max-old-space-size=4096\"
就行了,我寻思 4G 渲染个页面怎么也能渲染完了吧,结果继续翻车,加到 8192,总算好了。
最后本地跑了一回,最高会吃到 5G,没截到图,一瞬间就掉回 4G 了,经过一番无聊的 debug,猜测可能是 Vuepress 每次渲染新页面的时候都会创建一个新实例,然后我用的 Vuetify 这个 UI 框架必须要塞一堆东西到 Vue 实例里,而且内存占用特别高,然后每次渲染完之后 Vue 的实例里有部分数据没有释放掉,导致内存越来越多,本来渲染一页就要 2、3 百 M,里面有一部分释放不了,就越积越多了。
所以现在有两个解决方案,一是把 UI 框架换掉,看了下 Quasar 这个好像好像,二是把 Vuepress 换成 Hexo 或者 Hugo,不过最近打算考点证之类的,晚上都在看书做题,看看周末有没有空把主题迁移过去吧,这周的中午就先调研下哪个好使点吧。
25 号更新:
这两天调查了下,感觉换成别的静态博客生成器有点麻烦,主要是我不想用别人的主题,现在自己写的主题要移植过去又比较麻烦,于是决定换个小巧点的 UI 框架算了。
试了几个库,感觉 VueMaterial 还行,挺轻量,博客用到的组件也基本都有,花了两个中午把组件和样式改好了,现在编译相当快,十几秒就好了,之前内存爆表果然是 Vuetify 的锅。
不过 VueMaterial 也有点问题,有些 Vuetify 里有的东西东西都没有,譬如说没有响应式的图片框,旧版主题的图片全屏显示功能就有用到,点开之后可以拖动和放大。
现在换了 UI 框架后,我自己封了一个小组件实现了部分功能,但是大概 Vuetify 上面那个会捕捉部分事件,我实现这个没有,所以导致缩放图片失效了,拖动现在也有点问题。
不过我有点想砍掉这功能了,因为感觉没啥用,毕竟我配置了 webpack 会把太大的图片缩小,所以也没必要去放大图片了。
还有 VueMaterial 的表单组件跟 Vuetify 有点不一样,旧版主题的评论组件我自己封装了个表单组件调用,虽然小改一下换成 VueMaterial 的问题不大,但是有点麻烦,先鸽了吧。
顺带一提没记错的话换 UI 框架之前我的博客冷加载需要下载 700 多 k 的数据,这还是压缩后的,从打开到能看到内容要两三秒,现在的框架挺小巧,冷加载 300 多 K,一秒左右就能看到内容了,也算是做了个小优化吧。