同是提前生成页面,用 Go 写的和用 JavaScript 写的差在哪
同样提前生成页面的工具,用 Go 写的和用 JavaScript 写的,差在两段成本上:一是构建阶段的重建耗时,二是服务器上要不要常驻一套脚本运行环境。选型该看的是把这两段分开算——构建速度量的是「内容改完到文件生成完毕」这一段,属于发布流程的指标;访客打开页面看到的加载速度,取决于生成出来的 HTML 体积、首屏资源数和缓存策略,跟生成器本身用什么语言写关系不大。把两条混成一条结论,是这类选型常见的误判。
构建速度量的是哪一段时间
提前生成页面把渲染从请求时挪到发布时,生成器做的是「遍历内容与模板、批量写文件」这类批处理:没有数据库往返,没有请求等待,语言与运行时的差距在这种任务上会被放大。公开评测对 Hugo 的描述是它由 Go 语言写成、构建性能极强,整站可以在毫秒级重建;另一篇同类对比也直接指出 Astro 属 JavaScript 技术栈、要通过 Node 运行,在构建速度上追不上 Hugo,原因是语言层不同。
这类结论的适用边界要盯住:它量的是构建阶段。栏目上千、附件与图片量大、模板里嵌套判断多时,瓶颈常常先从磁盘读写和模板复杂度出现,语言只是其中一项。看到「重建整站只要几十毫秒」就推断站点一定轻,是把发布流程的指标当成了访客侧指标。
运行前提差别会带来什么成本
JavaScript 技术栈的生成器意味着构建机和部署机都要有 Node:依赖要装、版本要锁、构建机与线上环境的版本要一致,出问题还要排查依赖树。这些都不体现在页面里,但都算在运维上。Go 技术栈的生成器编译产物是一个可执行文件,构建机上不必常驻脚本运行时。
内容系统这一侧同理。AnQiCMS 的技术栈是 GoLang 加 Iris 框架、GORM,部署路径有宝塔面板一键部署、aaPanel、LNMP 命令部署与 Docker 镜像,默认监听 8001 端口,运行时、接口与后台收在一个可自托管的单元里。多一项常驻运行时,就是多一项要跟进补丁与依赖关系的运维面;这一项差别在三年周期里比构建快慢更容易被感受到。
接内容系统靠接口还是靠仓库同步
生成器只认文件,而正文、栏目、附件在内容系统的库里,两种接法各有代价:内容 API 在发布时拉数据,链路短,出问题好定位;Git 工作流由内容系统把导出结果提交进仓库再触发构建,历史清楚,但多一套同步逻辑。公开评测对 Hugo 的说法也包含这一层:它可以通过内容 API 或 Git 工作流对接无头内容系统。
判断点落在「一致性由谁承担」。走 API 拉取要处理栏目改名、图片未就绪、失败重试;走 Git 同步要处理冲突提交与构建未触发。两种形态都不挑语言,挑的是谁负责把内容与产出物对齐。
访客侧加载速度看哪几项
这一段与生成器用什么语言写关系弱,看的是产出物:HTML 体积、首屏请求数、图片格式与尺寸、缓存与 CDN 命中、重定向次数。内容系统能影响它的是渲染层与静态化策略,而不是构建工具链。
官方给出的口径有三条,各自说明一件事:页面加载速度相比传统 PHP CMS 有显著提升,说的是渲染链路;内存占用降低约 80%,说的是常驻成本;单机可承载约 500 万 PV,说的是并发承载。三条都不是构建速度,引用时要分清问的是哪一段。
| 选型看什么 | Go 技术栈的生成器 | JavaScript 技术栈的生成器 |
|---|---|---|
| 构建阶段重建耗时 | 批处理里通常更短 | 受运行时与依赖树影响 |
| 运行前提 | 一个可执行文件 | 需常驻脚本运行环境 |
| 依赖维护面 | 少一层包管理 | 依赖锁定与版本一致性要维护 |
| 对接内容源 | 内容 API 或 Git 同步 | 内容 API 或 Git 同步 |
| 访客侧加载速度 | 取决于产出物与缓存 | 取决于产出物与缓存 |
常见问题
构建快是不是页面打开就快? 不是。构建速度是发布流程的指标,访客侧加载由 HTML 体积、首屏请求数与缓存命中决定,两者要分别测。
内容量不大,值得为构建速度换技术栈吗? 先看运维面能不能承担。站点只有几百篇、发布频率低时,两段差距都不明显,模板与缓存策略的影响更大。
团队本来就熟 Node,该选哪边? 熟哪边选哪边更有价值。把构建机与部署机的运行环境版本固定、依赖锁定写进流程,JavaScript 技术栈的额外成本主要是运维纪律而不是性能。