- 正如在之前文章抱怨的那样,Gatsby 之类的网站生成器由于 JavaScript 技术栈的原因,构建速度并不让人满意,在 Netlify 平均一次从 Build 到 Deploy 要 1 分 30 秒左右。Netlify 也有一个缺点,limit 一过就会自动扣钱并添加一个 Extra Build Time 包,关键是 limit 快超过时也没有特别的警告之类的。
- 另外一个是搜索速度。由于数据在页面状态内,事实上每次页面加载时才会构建搜索用的索引,加上 JavaScript 的搜索库效率并不高,即使是只有 2k 不到的条目,搜索也会感觉卡顿。我尝试使用 LazyLoad 懒加载,效果并不理想。
所以呢,就想针对这两点优化一下。其实标题党了😂,因为减少构建时间的手段非常直白:换个快速的静态网站生成器。
用 Zola 构建网站
之前有过 Hugo 和 Zola 构建网站的经历,极快的构建速度让我印象深刻,而且需要的依赖也很少。这次就选择用 Zola 构建。Zola 的类 Jinja2 模版系统 - Tera 用起来简单,从 Gatsby 的模版迁移过来很方便,基本上直接挪过来就能用。
Netlify 也支持 Zola,因此整个构建 workflow 可以和 Gatsby 的保持一致,就是喜欢这种省心的。弄完简单测试了一下,不带搜索的页面 build 时间下降到了 30s。
页面内搜索要如何集成?
对之前的 JavaScript 搜索库并不满意,因此准备换个其他高效的实现。
- 一个方案是使用 Stork 这种用 Rust 转 WebAssembly 的页面搜索库。Stork 的用例试用下来速度很快,缺点是加载索引完的 WebAssembly 模块需要时间。
- 另一个方案是使用搜索服务如 tantivy、Sonic、typesense 以及 algolia 等。前面几个都需要自建服务。图方便我就直接使用 algolia 的 API。
使用 algolia 的问题是需要在构建网站时更新 Buckets 数据索引。一开始我准备用 Netlify 提供的 Serverless Function,构想是在构建网站的时候 trigger serverless functions 获取 Buckets 数据并更新 algolia 上的索引。后来想偷懒使用 atmoic-algolia 等 npm 包,在 serverless function 里搞包管理实在折腾,同时又发现了简单的方法,于是就再次放弃了 serverless function (为什么是再次)。
简单的方法就是利用 package.json 在里面注入复杂构建命令就可以:更改 Netlify 的 build command 为 npm run build,整个构建过程是
虽然最后还是为了自己省心用了 npm 的包管理,但并不是用 JavaScript 的一套构建网站,所以相对于之前还是省了不少构建时间 – 差不多 50s。
具体实现可以移步:
Scoop Buckets Search: https://scoop.airbrain.app/
GitHub Repo: https://github.com/yibum/scoop-buckets-web-netlify