Scoop 自带的搜索会搜索默认的 Main Bucket。有些时候,我要找的软件不在其中,我就会去 Extra Bucket 找找看。大家呢又在 GitHub 维护着好几个不同的 Buckets,如此反复在不同 Buckets 中寻找软件既不直观也很折腾。 于是我就想整合不同 Buckets 的软件列表到一个页面上搜索。粗暴的方法就是把数据扔进数据库,搞个搜索界面。但是这样太折腾,也没必要。要是能定时抓取 Buckets 的数据,放进静态页面,整个页面内搜索就好了。想了一下应该挺简单,可以搭一个(事实上我东搞搞西弄弄,这玩意也折腾了一整天)。
在哪里部署页面?
终于要点题了吗?😂
我的构想是弄一个简单的静态页面,包含搜索和结果展示。部署静态页面的方法也非常多:
- 复古点就放在自己的服务器。可能会多一些维护成本。在有服务器的情况下,对于不频繁更新的页面,这种方法可能是最简单直接的。
- 部署在更专业的静态网站服务器商。例如 Netlify,ZEIT,Surge 等等。这类服务通常都有 CDN,SSL,Git Hooks,很友好的入门 Plan,甚至还有 Serverless Functions 的功能(Netlify 还有 Identity 和 Forms 这些非常实用的功能)。
Netlify 我自己比较熟悉,这次就部署在 Netlify 图省事。每次有更新就 push 到 GitHub,Netlify 可以利用 Hooks 自动构建部署页面。
如何构建页面?
一个静态单页面,直接手写也应该不难。考虑到之后的更新维护,我决定还是用静态网站框架来搭页面。 现在流行而且相对成熟的静态框架也很多 Hugo,Gatsby,Hexo 等等。Gatsby 的数据流模式和插件系统很有意思,虽然我之前没用过,这次还是由于好奇心的驱使决定用 Gatsby。
数据要放哪里呢?首先不弄数据库,也不想持久化到文件(也挺麻烦的)。 考虑到数据就是简单的软件罗列信息,数据量很小,那么存到页面状态可能是个不错的方案。 这样就涉及到获取数据的频率的问题:一个是每次打开页面的时候获取数据。这样的好处是能获取实时的数据,但是缺点就比较多了,数据获取速度问题,还可能要为搜索建索引。 另一个是定时获取数据并构建页面,然后发布。事实上 Buckets 数据更新并不频繁,定时获取数据没什么损失。
这次就是利用 Gatsby 的数据流模式,在构建页面的时候获取 Buckets 列表数据。不过后来发现 Gatsby 也有些问题,一个问题就是 build 的效率。在 Netlify 平均一次从 Build 到 Deploy 要 1 分 30 秒左右(可能更多的是 npm 包管理的问题)。我用 Hugo 或者 Zola 建的多页面向来都是几秒以内就搞定。以后有空试试看能不能替换成 Hugo 或者 Zola 生成页面,希望能节省下不少 Netlify Build Minutes。
如何定时抓取 Buckets 数据?
对于如何定时获取数据和构建页面,
- 如果部署在自己服务器上,那么
cron设置定时执行脚本就行。 - 如果部署在 Netlify 这些服务提供商上,那要折腾一下定时构建的机制。
Netlify 虽然提供了 Serverless Functions 的,但是我还是嫌麻烦。恰好去年搞这个网页的时候,GitHub 推出了 Actions 的功能,可以写好配置文件像 cron 那样执行。这就简单了,写好配置文件,扔上去就可以。
具体实现可以移步:
Scoop Buckets Search: https://scoop.airbrain.app/