DanLevy.net

博客升级经验总结

Astro、Tailwind、MDX、Pagefind 及更多!

最近,我开始着手升级我那个运行了 8 年之久的 Gatsby v1 站点。

这篇文章将分享我在这个过程中学到的一些经验,以及我所探索的那些有趣的技術。

目录

项目需求

在开始升级之前,我确立了一系列需求:

由于我博客的日均访问量波动很大,我认为静态预生成的站点能在不增加额外复杂性的情况下,提供我想要的性能。

此外,我需要保留站点现有的内容和功能,包括:

选择合适的技术栈

这些年来,我使用过许多静态站点工具,从 Jekyll、Hugo、Slate 到 Gatsby;也接触过不少前端框架:Ember、Knockout、Angular、Vue,当然还有 React。

所以,我的选项实在太多了,最终我将范围缩小到了 RemixNext.jsAstro

关于评估过程,我完全可以写一整个博客系列,但在这里我简要总结一下:

我选择 Astro 是因为我能极快地用它 做出实实在在的东西

他们的 API 设计简洁得令人耳目一新。它在灵活性和优秀的架构主张之间取得了极佳的平衡

让人感到踏实的是,Astro 没有任何明显的云厂商偏好或框架私货。

Astro 并不是我使用的唯一技术,以下是完整的技术栈清单:

Astro:学习曲线与核心特性

Astro 迅速成为了我这次升级的基石。

以下是我发现特别好用的一些核心特性:

有些地方确实让人意外,比如围绕 Astro 注入的标记进行样式开发,以及 display:contents 的影响。

<style>astro-island,astro-slot,astro-static-slot{display:contents}</style>

.astro 组件 vs. 客户端组件

Astro 组件基本上是带有强大组件和 Props 模式的 HTML 模板。它们可以在构建时获取数据、访问后端资源,并保持敏感信息的隐藏。

理解 Astro 的 .astro 组件最好的方法,就是将其与客户端组件(React、Vue、Svelte 等)进行对比。

你需要做什么?.astro 组件客户端组件
使用强大的模板+组件模式生成 HTML
在构建时获取数据
(直接)访问后端资源
隐藏敏感信息(访问令牌、API 密钥等)
减少客户端 JavaScript
使用客户端组件(React、Vue、Svelte 等)
添加交互和事件监听器(onClick()onChange() 等)
使用状态和生命周期副作用(useState()useEffect() 等)
使用浏览器专属 API
使用依赖状态、副作用或浏览器 API 的自定义 Hook

现代 CSS:令人惊叹

重回前端开发,我被原生 CSS 的进步惊艳到了:

搜索:Pagefind

在不使用第三方服务或托管数据库的情况下实现站点搜索,听起来是个有趣的挑战。毕竟,我还没有 10,000 篇文章需要索引(目前还没有)。

在浏览 Astro 社区集成时,我偶然发现了一个相见恨晚的神器:Pagefind

很少有工具能像 Pagefind 解决本地站点搜索那样,如此完美地解决一个问题。

Pagefind 的实现过程极其简单,令人愉悦。它可以集成到任何静态站点内容中,你可以选择使用默认 UI,也可以根据需要构建任何自定义界面。

它完美地解决了我的所有需求。集成只花了不到几分钟,大部分工作只是添加一个 <div id="search"></div> 标签并进行一些样式调整!

评论:Utterances

遗憾的是,我不得不告别 Disqus 以及多年来积累的评论。

我希望对站点上的第三方脚本拥有更好的控制权和透明度。

此外,它必须简单且易于维护。

这促使我选择了出色的 Utterances 服务。其基于 GitHub Issues 的评论系统与我的受众群体非常契合。而且,它配置简单,完全免费。

Tailwind:遗憾

只有一项技术让我越来越感到后悔:Tailwind。

随着时间的推移,我能明显感觉到“编写”与“维护”之间的成本差异。Tailwind 编写起来确实飞快,但一旦复杂度达到一定程度,阅读和扩展就会变得非常乏味。

结论

将我陈旧的 Gatsby v1 站点升级到以 Astro 为核心的现代技术栈是一次有趣的体验。满分推荐。

如果你正考虑升级旧站点或构建新的静态(或混合)站点,我强烈建议关注一下 Astro。虽然学习曲线有时可能比较陡峭,但在性能、开发体验以及项目前瞻性方面的收益绝对值得这些投入。