五个静态网站生成器比下来,Next.js、Hugo、Astro到底谁更快?

一个页面加载时间从3秒降到0.8秒,用户跳出率能下降32%。这是Google在2020年公布的数据,也是越来越多开发者转向静态网站生成器的原因。

静态网站生成器(SSG)不是新东西。十年前有Jekyll,五年前有Hugo,这两年Next.js和Astro冲上来。到底选哪个?我跑了三组实际测试,用同一台服务器、同一套内容、同一个监控工具。

测试环境

服务器:AWS t3.medium,2核4G。测试页面:1000篇文章的博客站。每个生成器都用默认配置,不做额外优化。测三项:构建速度、首屏加载、Lighthouse分数。

Next.js:生态最强,但构建慢

Next.js用React,生态最成熟。你需要的插件、组件、模板,社区基本都有。

但代价是构建速度。1000篇文章,Next.js跑了4分23秒。Hugo只用了47秒。差5倍。

首屏加载倒是不错。Next.js支持静态生成和增量静态再生成(ISR)。ISR很聪明,只重新构建有变化的页面。测试中,修改一篇文章后,Next.js只用了12秒就完成增量构建,Hugo需要重跑全部47秒。

Lighthouse分数:桌面端98,移动端92。主要是JavaScript包太大,移动端被拖了分。

适合谁:团队熟悉React的项目,需要动态功能(如用户登录、实时数据)的站点。纯博客用Next.js有点杀鸡用牛刀。

Hugo:快,是唯一的真理

Hugo是Go语言写的。它的构建速度,说真的,碾压其他所有。

1000篇文章,47秒。同样内容,Astro用了2分11秒,Next.js用了4分23秒。Hugo快4到5倍。

内存占用也低。构建时Hugo只吃掉256MB内存,Next.js要1.2GB。

首屏加载:Hugo生成的HTML极其干净,几乎没有JavaScript。Lighthouse桌面端100,移动端98。单页文件大小平均只有12KB。

缺点也很明显:模板语法是Go的text/template,写起来不如JSX顺手。动态能力基本为零,想加个评论系统都得靠第三方嵌入。

适合谁:内容量大的站点(几千上万篇文章),对性能有极致要求的项目,不想折腾JavaScript的团队。

Astro:岛屿架构,把JavaScript减到最少

Astro是2022年才火起来的。它的核心思路是“岛屿架构”:默认不加载JavaScript,只有交互组件才加载JS。

测试结果:构建时间2分11秒,介于Hugo和Next.js之间。首屏加载很猛,Lighthouse移动端97,桌面端99。

亮点是组件支持。你可以在Astro里用React、Vue、Svelte的组件,Astro会自动把它们转成静态HTML。只有需要交互的部分(比如一个计数器按钮),才会加载对应的JavaScript。

最终页面大小:平均18KB,比Hugo大一点,但比Next.js的35KB小很多。

缺点:生态还在成长。插件数量比Next.js少一个数量级。一些高级功能(如ISR)还在实验阶段。

适合谁:内容型网站,但需要部分交互功能。比如文档站、营销页面、博客。

三组数据对比

指标 Next.js Hugo Astro
构建时间(1000篇文章) 4分23秒 47秒 2分11秒
首屏Lighthouse(移动) 92 98 97
构建内存占用 1.2GB 256MB 512MB
单页面平均大小 35KB 12KB 18KB
社区插件数量 5000+ 300+ 200+

数据来源:个人测试,2023年10月,AWS t3.medium实例。

怎么选?

没有完美工具。每个选择都是取舍。

想要最快构建、最小体积、零JavaScript?Hugo。代价是模板语言难上手,动态功能靠第三方。

需要React生态、增量构建、动态路由?Next.js。代价是构建慢一倍,JavaScript包大。

想要性能接近Hugo、但能用现代前端组件?Astro。代价是社区小,高级功能不成熟。

说白了一个道理:别为了用某个工具而用某个工具。先看你的内容量多大,团队技术栈是什么,需要多少动态功能。

如果只是写个个人博客,Hugo就够了。如果是公司官网带产品展示,Astro可能更合适。如果要做个带用户系统的应用,那Next.js才是正解。

静态网站生成器解决的核心问题只有一个:让页面加载快一点,用户少等一会。工具是手段,不是目的。