手写静态博客生成器
AI 摘要从零实现一个静态博客生成器,覆盖解析、路由、资源处理与性能优化。
今天我们来写一个静态页面生成器。静态网站有很多好处,静态数据搭配CDN 可以提供更快的访问速度。
世面上已经存在非常多的静态博客生成器,比如 Hexo、VuePress。我想捯饬一个前后端分离的生成器,这样可以用任何框架写前端页面。
核心逻辑
使用 markdown-it 和 front-matter 把 markdown 文本转换成 json。
如果目录中存在 list.json,就生成目录下所有文件的索引,生成 Restful API 风格的路由。
路径问题
使用 md5 来计算文件 ID。设计了一个简单的 ID 分配算法:检查头部是否存在 ID,没有则计算 md5,检查池中唯一性。
可以给 markdown-it 写插件处理图片路径,类似于 babel 生成 AST 进行修改。但 markdown-it 插件不支持异步函数,不如直接手挫正则。
性能优化
绝大多数问题都可以归结为缓存与缓存失效问题。
搜索优化
生成列表给前端,网站加载后后台下载好数据。引入局部性原理,最近修改的文章标记为 hot,不参与列表计算。实测带来 10% 性能提升。
提高并发
避免一个接一个文件读取(和同步函数性能一样),应该一次性全部读完。定义 init 函数先把全部小文件放进内存。
不做额外计算
给 md5 设计缓存函数。在 turbo.init 之后不应该直接调用 fs.readFile,而是使用自己的 readFile 函数。
计算性能优化
一张图片的 md5 计算,直接使用 JS 可能要 10 多毫秒。给 node.js 增加 C++ 扩展。
总结
得益于严谨的设计,Vector 在 i7-9750H、100M 带宽环境中,同步一次修改仅需 1.173 秒。相同逻辑使用 Hexo,最简单的官方页面都要 4.066 秒。
Vector 后续还会继续发展,着重解决协作相关内容。