为什么你应该自己编写静态网站生成器

我以前使用过很多静态网站生成器,包括 JekyllHugo11tyZolaNext.jsAstro。 它们各自都有自己的功能和特点,但最重要的是,你必须根据框架的期望来架构你的网站。

从昨天开始,我的个人网站由我自己的SSG1驱动。 它并不意味着可重用性,它只是普通的代码 - 解析和生成这个特定网站的文件。

哦,我真的喜欢它。

为什么?

最近,当Vercel发布了 Next.js 14 时,我一些通过过的朋友还在使用 Next.js 12,并且真的感到了升级的压力,以免落后得更多。 这使我思考了我的网站的持久性和健壮性,所以我决定我不想依赖于其他人的决策,并追随我不关心的版本升级。

而且,即使你的内容只是Markdown和媒体,但几乎围绕它的所有东西在切换框架时都需要进行更新-有时甚至在升级时也是如此。 当我之前使用Astro时,我想要静态生成OG图像,并经过一些研究,设法构建了它,甚至写了一篇文章来解释如何做到这一点。 你失去了所有这些自定义逻辑。

另外,你可以选择自己的技术栈。 想用AsciiDoc来写你的内容?没有人能阻止你!

我知道你在想什么,你是对的,它比使用已经存在的东西要复杂得多。 但它也更有趣。 你可以用它做任何事情,而且你不需要阅读文档或尝试理解其他人的架构决策—只需开始编写代码!

好的,告诉我你是如何做到的

在考虑要使用不需要JavaScript的动态生成搜索功能2之后,我决定继续使用静态网站。 它更快,你不必担心安全性或稳定性。 当然,我选择了地球上最好的编程语言,Rust(我所钟爱的)。 等等,回来,这不是一篇关于Rust的文章!

一个静态网站生成器主要需要进行五件事:

  1. 将Markdown转换为HTML
  2. 渲染HTML模板
  3. 编译CSS
  4. 生成RSS订阅源
  5. 生成网站地图

其中后三项可能您甚至都不需要。 你喜欢的编程语言肯定有一个Markdown解析器和一个模板引擎。

对于Rust,我选择了这些包3

  • comrakgray_matter 用于解析Markdown和frontmatter
  • maud 用于编译时模板
  • grass 用于SCSS编译
  • rss 用于(你猜对了)生成RSS订阅源
  • quick-xml 用于生成网站地图

一旦我得到了所需的工具,我就开始编写软件了。 我构建了一个用于解析我的内容的工具,一个用于渲染所有不同模板的工具,一个用于生成RSS的工具,一个用于生成网站地图的工具...真的就是这样!

当需要为这个网站添加OG图像时,我可以选择最好的库并构建它。

现在怎么办?

我希望这篇文章或者让你确信自己编写自己的生成器没有价值,你想继续使用框架,或者让你对另一边的事物感兴趣。

更新: 这篇文章在Lobste.rsHackernews上引起了一些讨论。

  1. SSG是指静态网站生成器,如果你还没有创作出这个关联。

  2. 亵渎!

  3. 如果我选择Go语言,我可能会看一下 goldmarkgoldmark-frontmatterhtml/templateencoding/xml