和AI浅聊了一下SEO —— 真神Astro

最近菜鸟有点难受,之前开发公司网站时没有考虑需要 SEO,也没有这个需求,所以用的 vue,但是 SPA+Hash 现在直接给我把路都封死了,不管怎么搞也收录不全。

见上一篇文章:从前端工程师的角度将SEO做到极致 -- 菜鸟来实操

尝试把vue+webpack项目改成Nuxt项目,发现根本不会也不懂Nuxt,学习曲线比较陡峭,不像Electron那样,分离得很好!

尝试把vue+webpack项目改成vite-SSG项目,发现照着官网一顿操作,还让Trae给我操作,都是一团糟!

失败

反正菜鸟折腾来折腾去,没有转成功,反而产生了疑惑。

因为之前问了 满神,他说:SEO 里面 SSG 最牛逼 其次 SSR 再其次 CSR!

那为什么官网不用SSG?偏要用SSR?

菜鸟想着一不做二不休,吃一堑长一智,这次失败了,那下次就应该做好,所以就开始了死亡追问模式!

1. 没有Next、Nuxt时,是怎么做SSR、SSG的?

在没有 Next / Nuxt 之前,SSR / SSG 从来不是"框架能力",而是"工程能力 + Node 服务能力 + 构建体系能力"。

Next / Nuxt 只是把原本很脏、很复杂、很容易写错的一整套工程流程封装成了"开箱即用"。

一、先统一概念(避免被框架术语带歪)

1️⃣ 什么叫 SSR / SSG(抛开 Next / Nuxt)

  • SSR(Server Side Rendering)

    • 在服务器上执行 JS
    • 生成完整 HTML
    • 返回给浏览器
  • SSG(Static Site Generation)

    • 在构建阶段执行 JS
    • 生成一堆 .html
    • 部署时直接返回静态文件

👉 核心只有一句话:

JS 代码能不能在"非浏览器环境"执行,并产出 HTML


二、远古时期(2010 ~ 2014):SSR 是"后端的事"

那时的事实是:

  • 前端几乎没有"完整框架"
  • jQuery + 后端模板引擎
  • SSR = PHP / Java / Python 的模板渲染

典型架构

css 复制代码
Controller
  ↓
Model(查数据)
  ↓
Template(JSP / Freemarker / Smarty / ERB)
  ↓
HTML

前端 JS 只是:

  • 绑事件
  • 做表单校验
  • 做简单交互

⚠️ 这一阶段没有"前端 SSR"概念


三、2014 ~ 2016:前端 SPA 崛起,SEO 崩盘

Angular / React / Vue 出现后

出现一个重大问题:

bash 复制代码
浏览器:
  下载 HTML(只有一个 <div id="app"></div>)
  ↓
  下载 JS
  ↓
  执行 JS
  ↓
  才有内容

后果

  • SEO 抓不到内容
  • 首屏白屏
  • 分享链接没内容

于是大家开始问一句话:

"JS 能不能在服务器跑一遍?"


四、没有 Next / Nuxt 时:SSR 是怎么"硬写"的?

这是重点。

核心前提条件(非常重要)

Node.js 出现了

没有 Node:

  • 前端 JS 根本无法在服务器跑

五、React 的原始 SSR(手搓版)

1️⃣ React 官方其实很早就支持 SSR

React 0.12 就有:

scss 复制代码
ReactDOMServer.renderToString(App)

2️⃣ 你要自己搭一个 Node 服务

ini 复制代码
const express = require('express')
const ReactDOMServer = require('react-dom/server')

app.get('*', (req, res) => {
  const html = ReactDOMServer.renderToString(<App />)

  res.send(`
    <html>
      <body>
        <div id="root">${html}</div>
        <script src="/client.js"></script>
      </body>
    </html>
  `)
})

⚠️ 到这里为止,只是最最表面的 SSR


六、真正的地狱:SSR 工程问题(Next 出现前的痛点)

下面这些问题,都是你必须自己解决的。

1️⃣ 路由怎么做?

浏览器有 window.location

Node 没有

你要做:

javascript 复制代码
import { StaticRouter } from 'react-router-dom/server'

<StaticRouter location={req.url}>
  <App />
</StaticRouter>

2️⃣ 数据怎么预取?

客户端可以:

scss 复制代码
useEffect(() => {
  fetchData()
}, [])

服务器不能等 useEffect

于是出现一堆非常丑的方案:

  • 静态方法
ini 复制代码
Page.getInitialProps = async () => {}
  • 或者挂在路由上
ini 复制代码
routes = [
  {
    path: '/user',
    component: User,
    loadData: () => fetchUser()
  }
]

你要在 SSR 前:

  1. 匹配路由
  2. 找到所有 loadData
  3. 并行请求
  4. 塞进 store

3️⃣ 状态同步(Hydration)

服务器渲染了一份 HTML

客户端重新执行 JS 时必须:

"不能重新生成 DOM,只能接管"

于是你要:

xml 复制代码
<script>
  window.__INITIAL_STATE__ = {...}
</script>

客户端:

javascript 复制代码
hydrateRoot(
  document.getElementById('root'),
  <App store={storeFromServer} />
)

任何一个字段不一致 → hydration 报错


4️⃣ 打包直接裂开(Webpack 地狱)

你必须维护:

  • client bundle
  • server bundle

而且要解决:

  • window 在 server 不存在
  • document 在 server 不存在
  • CSS 怎么处理?
  • 图片路径怎么映射?

webpack 配置示例(简化版):

ini 复制代码
module.exports = [
  {
    target: 'web',
    entry: './client.js'
  },
  {
    target: 'node',
    entry: './server.js'
  }
]

现实中:

  • loader 条件分支
  • externals
  • publicPath
  • manifest 映射

👉 90% 的团队在这一步崩溃


5️⃣ 异常 / 超时 / 流式渲染

  • 某个接口慢 → SSR 卡死
  • 某个组件 throw error → 整页 500
  • 想要 streaming → 再写一套

七、Vue 在 Nuxt 之前:也是一样"手搓"

Vue 2 时代:

scss 复制代码
const renderer = createRenderer()
renderer.renderToString(app, context)

你同样要:

  • 自己管理路由
  • 自己处理 asyncData
  • 自己搞 hydrate
  • 自己分 client / server build

Vue 官方甚至有一个:

vue-server-renderer 官方示例仓库

那不是教程,那是"劝退文档"。


八、SSG 在没有框架前是怎么做的?

本质一句话:

用 Node 跑一遍路由,生成 HTML 文件

典型做法

javascript 复制代码
const routes = ['/','/about','/post/1']

for (const route of routes) {
  const html = render(route)
  fs.writeFileSync(`dist${route}/index.html`, html)
}

问题:

  • 路由怎么枚举?
  • 动态路由怎么生成?
  • 多语言?
  • 增量构建?
  • CDN?

于是诞生了:

  • Gatsby(React)
  • Hexo / Hugo(非 SPA)
  • VuePress

👉 SSG 比 SSR 更早被"工程化"


九、Next / Nuxt 本质上干了什么?

非常冷静地总结一句:

Next / Nuxt 并没有"发明 SSR",只是把下面这些东西"标准化 + 强约束"。

它们帮你做了什么?

问题 手搓时代 Next / Nuxt
Node 服务 自己写 内置
路由 自己配 文件即路由
数据预取 自定义协议 getServerSideProps / asyncData
hydration 手动 自动
双端打包 webpack 地狱 封装
错误处理 自己兜 内置
SSG 自己写脚本 getStaticProps

👉 它们解决的是"工程确定性",不是技术不可能


十、真实行业判断(给你一句实话)

为什么老项目不自己写 SSR?

因为维护成本 > 技术收益

SSR 手搓项目:

  • 新人进来 2 个月才能理解
  • 改一次 webpack 冒烟测试 1 天
  • Debug SSR bug 非常痛苦

为什么大厂敢手写?

  • 专职 infra 团队
  • 专职 SSR 框架组
  • 长期维护

十一、我的前瞻判断(直说)

SSR 本身正在被"边缘化",而不是"消失"

趋势是:

  • SSG + ISR
  • Edge Rendering
  • Streaming + Partial Hydration
  • Server Components(RSC)

SSR 正在从:

"整页在 Node 渲染"

变成:

"必要的部分在合适的位置渲染"

2. 官网不就是要SSR? ------ NO!NO!NO!

官网"需要的不是 SSR",而是「首屏可被搜索引擎理解 + 打开够快 + 稳定」
SSR 只是其中一个历史方案,而且现在已经不是最优解。

下面我会把这句话彻底拆开,把很多人(包括不少前端)长期存在的误解一次性掰正。


一、为什么大家会条件反射地说「官网 = 必须 SSR」?

这是一个历史遗留认知,不是技术真理。

1️⃣ 这个结论来自 2014~2018 年

那时的现实是:

  • 搜索引擎 几乎不执行 JS
  • SPA 官网 = 空白页面
  • 分享链接无 meta
  • 首屏白屏 2~3 秒

于是行业经验总结出一句话:

"要 SEO → 必须 SSR"

⚠️ 这句话在当时是对的

⚠️ 但它已经过期了


二、先把"官网"拆解(这是关键)

你说「官网」,但官网并不是一个单一需求。

我们拆成 4 种典型官网:

1️⃣ 品牌展示型官网(最常见)

  • 首页
  • 产品介绍
  • 定价
  • 关于我们
  • 联系方式

👉 几乎 100% 静态内容


2️⃣ 营销 / 落地页官网

  • 投放页
  • 活动页
  • 多版本 AB Test
  • 表单收集

👉 极少动态内容


3️⃣ 文档型官网

  • 技术文档
  • API 文档
  • 博客
  • 帮助中心

👉 内容更新频率低、结构稳定


4️⃣ 应用型官网(容易被误判)

  • 官网 + 登录
  • 官网 + 控制台
  • 官网 + dashboard

👉 只有「官网部分」需要 SEO


三、官网真正"必须满足"的 5 个指标

你记住这 5 个,比记"SSR"有用 10 倍。

① 搜索引擎能直接看到内容

② 首屏时间快(FCP / LCP)

③ 分享链接 meta 正确

④ 稳定(不容易挂)

⑤ 成本可控、可维护

👉 SSR 只是其中一种达成方式


四、现在 2026 年:搜索引擎真实能力(关键事实)

1️⃣ Google / Bing

  • 可以完整执行 JS
  • 有两阶段索引(HTML → JS)
  • 延迟渲染,但能抓到

2️⃣ 国内搜索引擎(实话)

  • 执行 JS 能力仍然弱

  • 但:

    • 静态 HTML = 100% 稳
    • CSR + 动态数据 = 风险

👉 所以国内官网最稳方案 是: "首屏 HTML 静态化"


五、所以:官网 ≠ 一定要 SSR

我们来看三种方案的真实对比。


✅ 方案一:纯 SSG(现在的最优解)

这是 90% 官网的最优方案

特点
  • 构建时生成 HTML
  • 部署到 CDN
  • 无服务器 / 极低成本
优点
  • SEO = 满分
  • 首屏 = 极快
  • 稳定性 = 极高
  • 成本 = 极低
缺点
  • 不适合高频动态内容

👉 品牌官网 / 文档官网:首选


⚠️ 方案二:SSR(不是不行,是没必要)

优点
  • 数据实时
  • 路由灵活
缺点(实话)
  • Node 服务
  • 冷启动
  • 压力成本
  • 异常放大

👉 除非你真的有"必须实时"的内容


⚡ 方案三:混合方案(现实中最常见)

SSG + 局部 CSR / Edge

示例
  • 首页:SSG
  • 产品页:SSG
  • 登录后:CSR
  • 个性化模块:CSR
  • 国家区分:Edge

👉 这是 Next / Nuxt 真正的价值所在


六、为什么"官网 SSR"是一个被过度神话的概念?

因为大家把三个东西混为一谈了:

被混淆的概念 实际含义
SSR 服务端执行 JS
SEO 搜索引擎可理解内容
首屏快 性能优化

👉 SSR ≠ SEO ≠ 快


七、说句不好听但真实的话

很多官网上 SSR,只是因为「用了 Next」而不是「需要 SSR」

真实情况是:

  • 用了 Next
  • 顺手就 SSR
  • 没人评估收益 vs 成本

八、如果你现在问我:官网到底该怎么选?

我给你一个非常工程化的判断标准。

✅ 你应该用 SSG,如果:

  • 内容可提前生成
  • 更新频率 ≤ 每天
  • 不依赖用户身份
  • 追求极致稳定 & 成本

👉 大多数官网


⚠️ 你才应该用 SSR,如果:

  • 页面内容高度实时
  • 严重依赖请求上下文
  • 内容无法提前枚举
  • SEO 是核心商业指标

👉 少数业务


九、一句给你当"判断锚点"的话

官网不是"技术炫技场",而是"ROI 场"。
能用 SSG 解决的,永远不要上 SSR。

3. 把vue项目变成SSG很复杂

你这个判断一半对,一半被"历史经验"误导了。

"把一个【已经成型的】Vue SPA 项目直接改成 SSG,确实很复杂;
但如果你觉得'SSG 本身复杂',那是因为你把'项目问题'错算成了'技术问题'。"

复杂的不是 SSG,复杂的是:

  • 项目设计时就默认 CSR
  • 页面逻辑和「运行时状态」深度耦合
  • 数据获取没有边界

下面我会从为什么复杂 → 到底复杂在哪 → 如何把复杂度拆掉 → 现实可行路线,一步一步讲。


一、为什么你会觉得「Vue → SSG 很复杂」?

因为你现在面对的,通常是这种项目 👇

典型老 Vue SPA 项目特征

  1. 所有页面都当成"应用页"

    • 首页 = 应用
    • 官网页 = 应用
    • 文档页 = 应用
  2. 数据全在 onMounted / created 里拉

    scss 复制代码
    onMounted(() => {
      fetchHomeData()
    })
  3. 强依赖运行时环境

    • window
    • localStorage
    • navigator
    • location
  4. 路由是"用户态驱动"的

    • 登录后才有内容
    • 权限在前端算

👉 这种项目不是"不适合 SSG",而是"压根不是为内容渲染设计的"


二、SSG 对 Vue 项目的"隐性要求"(没人明说)

SSG 本质只有一句话:

页面在"没有浏览器"的情况下,也必须能跑完一遍。

这意味着:

1️⃣ 生命周期限制

生命周期 CSR SSG
setup ✅ ✅
created ⚠️ ⚠️
onMounted ✅ ❌

👉 一切放在 onMounted 的数据,SSG 都拿不到


2️⃣ 环境限制

SSG 阶段:

  • ❌ window
  • ❌ document
  • ❌ localStorage
  • ❌ cookie(除非你自己 mock)

3️⃣ 数据限制

SSG 要求:

  • 数据 可预测
  • 数据 可枚举
  • 数据 与用户无关

👉 这直接打脸很多 SPA 的写法。


三、真正复杂的不是"SSG",是你现在的 Vue 写法

说句扎心的:

如果一个 Vue 页面"无法被 SSG",它在本质上也很难被 SSR 正确支持。

只是 SSR 在"运行时"帮你兜了底。


四、为什么"新项目 SSG 很简单,老项目很难"?

新项目(从 0 开始)

  • 页面 = 内容
  • 数据 = 构建期
  • 逻辑 = 展示逻辑

👉 SSG = 顺手的事


老项目(SPA 改造)

你要同时解决 5 件事:

  1. 页面职责拆分
  2. 数据拉取前移
  3. 运行时逻辑隔离
  4. 路由可枚举
  5. 构建体系调整

👉 这不是技术复杂,是"架构债务在还"


五、把复杂问题拆开,你就会发现 SSG 可控了

Step 1:先别碰"整个项目"

这是最容易踩坑的一步。

❌ 不要:

  • "把整个项目改成 SSG"

✅ 正确做法:

  • 只改"官网页 / 内容页"

Step 2:把页面分成两类(这是关键)

A 类:内容页(SSG 候选)
  • 首页
  • 产品介绍
  • 关于我们
  • 博客
  • 文档
B 类:应用页(继续 CSR)
  • 登录
  • 控制台
  • 表单
  • 个性化页面

👉 你不需要让 B 类支持 SSG


Step 3:数据获取迁移(最痛但最关键)

错误写法(典型 SPA)
scss 复制代码
onMounted(async () => {
  data.value = await fetchData()
})
SSG 友好写法
csharp 复制代码
const { data } = await useAsyncData('home', fetchData)

或(VitePress / Nuxt):

javascript 复制代码
export async function load() {
  return fetchData()
}

👉 数据必须在"渲染前"完成


Step 4:运行时逻辑"包一层"

你不用删逻辑,只要隔离。

arduino 复制代码
if (import.meta.env.SSR) {
  // SSG / SSR 阶段
} else {
  // 浏览器
}

或者:

javascript 复制代码
if (typeof window !== 'undefined') {
  // 浏览器逻辑
}

Step 5:路由枚举(SSG 最核心)

你必须能回答一句话:

"这个页面一共有多少种 URL?"

  • 博客:文章列表
  • 产品页:产品 ID
  • 文档:目录树

👉 枚举不了 = 不适合 SSG


六、为什么很多人觉得「Nuxt SSG 也很麻烦」?

因为他们犯了 2 个错:

  1. 想"一键 SSG 整个应用"
  2. 不愿意改数据流

SSG 不是"打包模式",是运行模型变化。


七、现实中可行的"低风险路线"(我建议你用这个)

路线建议(务实版)

  1. 保留现有 Vue SPA

  2. 新建一个:

    • VitePress / Nuxt Content
    • 或独立的 SSG 项目
  3. 官网域名:

    复制代码
    example.com        → SSG
    app.example.com    → SPA

👉 这是大量公司真实在用的方案


八、一句给你兜底的判断

如果你觉得"SSG 很复杂",
那你现在的 Vue 项目,十有八九也不适合 SSR。

这不是你能力问题,是项目历史包袱。

4. 用vue3+webpack开发的官网,很难转成SSG,本来想用viteSSR,也很难转

你这个结论非常真实,而且不是你菜 。

我先给你一句定性判断 ,然后我会把为什么"几乎转不动"这件事拆到架构层 ,你看完会发现:你现在卡住是必然的。

Vue3 + Webpack 的"纯 SPA 官网",如果一开始不是按「可预渲染」设计的,
那么无论你转 SSG,还是转 Vite SSR,本质上都是一次"半重写级别"的工程。

这不是工具问题,也不是 Vue 问题,是架构出生点就不一样。


一、你现在为什么会"两头都难":SSG 难、Vite SSR 也难?

我们一个个拆。


二、Vue3 + Webpack 项目,对 SSG 天生不友好的 5 个点

① Webpack 项目 = 默认"浏览器唯一运行时"

你现在的代码,十有八九有这些东西:

javascript 复制代码
window
document
localStorage
location
navigator

在 Vue SPA 里这是合法的

但在 SSG / SSR 里,这是致命的

Webpack 项目从一开始,就假设"只有浏览器会执行 JS"


② 数据获取写在了「onMounted / 副作用生命周期」

这是最常见、也是最致命的一点

scss 复制代码
onMounted(async () => {
  homeData.value = await fetchHome()
})

这意味着什么?

  • SPA:✅ 没问题
  • SSR:⚠️ 首屏拿不到
  • SSG:❌ 构建阶段直接没有数据

👉 你不是"缺一个配置",而是"数据流方向错了"


③ 路由是"应用路由",不是"内容路由"

官网页面,本来应该是:

  • /
  • /product
  • /pricing

但 SPA 官网经常变成:

  • 首页也依赖登录态
  • 页面逻辑混在一起
  • 参数是 runtime 才算的

👉 SSG 要的是"可枚举 URL",而你的是"用户态 URL"


④ Webpack 的 SSR 成本极高(这点很少人敢明说)

Webpack 做 SSR 会遇到:

  • client / server 双配置
  • loader 条件分支
  • CSS / asset 注入
  • externals / target: node
  • hydration 不一致问题

说句难听的:

Webpack SSR 能跑 ≠ 适合长期维护

这也是为什么:

  • Vue 官方
  • 社区
  • 新项目

已经事实上放弃 Webpack SSR


⑤ 你想用 Vite SSR,但你不是 Vite 项目

这一步看起来最合理,其实最痛

你以为是:

Webpack → Vite → SSR

实际上是:

Webpack SPA → Vite SPA → 再改成 SSR 架构

👉 中间不是迁移,是重构


三、为什么你"转 Vite SSR 也很难"(这是很多人踩的坑)

Vite SSR 的前提条件(非常关键)

Vite SSR 假设你:

  1. 项目是 ESM
  2. 模块无副作用
  3. 数据获取可前置
  4. 页面可在 Node 运行
  5. 不依赖浏览器全局对象

而你的项目:

  • 是 Webpack 构建思维
  • 写法是"浏览器优先"
  • 生命周期全是 onMounted

👉 Vite SSR 不是"帮你兜底",而是"要求你先自律"


四、说句非常现实的话(你现在的处境)

你不是在"选技术方案",
你是在"决定要不要为一个官网付出一次重构成本"。

这是一个商业决策,不是技术判断。


五、我给你一个清醒的判断公式(很重要)

你可以直接用下面这个来判断值不值。

判断公式

复制代码
官网页面数量 × 单页复杂度 × 数据依赖程度

如果:

  • 页面 < 20
  • 数据 mostly 静态
  • SEO 很重要

👉 重构值得

如果:

  • 页面逻辑复杂
  • 数据全 runtime
  • 官网只是"门面"

👉 不值得,换方案


六、给你 3 条"现实世界可走的路",不是教科书方案

✅ 路线一(我最推荐):官网"拆出去",别改原项目

这是大量公司真实在用的方案。

架构
复制代码
原项目(Vue3 + Webpack SPA)
  → 只负责应用

新项目(SSG)
  → 只负责官网
  • 用 VitePress / Nuxt Content / Astro
  • API 复用
  • UI 可以复用一部分组件

👉 成本最低,风险最小


⚠️ 路线二:只"半 SSG",别碰全站

你可以只做:

  • 首页:预渲染
  • 产品页:预渲染
  • 其余:继续 SPA

甚至:

  • 用 prerender-spa-plugin
  • 或 Puppeteer 静态快照

👉 不优雅,但能交差


❌ 路线三(我不建议你走):硬转 Vite SSR

除非:

  • 你是唯一维护者
  • 有 2~3 周完整时间
  • 能接受大量代码修改

否则这是技术理想主义路线。


七、你现在卡住,其实说明你判断是对的

你能明确说出:

"很难转"

说明你已经意识到:

  • SSR / SSG 不是"加配置"
  • 而是"运行模型变了"

这比盲目上 Next / Nuxt要成熟得多。

5. 官网不用登录,SEO很重要,就想每个界面都被搜录 ------ Astro(推荐)

一、先给你结论(非常明确)

在你的前提下:

  • 官网
  • 不需要登录
  • SEO 很重要
  • 希望每个页面都能被搜录

👉 继续死磕"把现有 Vue3 + Webpack 项目转 SSG / Vite SSR",是性价比极低、风险极高的选择。

👉 最优解不是"转",而是"替换官网渲染层"。

这不是技术逃避,是工程理性。


二、为什么你这个场景「不值得硬转」?(核心原因)

我们用结果导向来拆,而不是框架立场。


1️⃣ 你的官网目标是「被搜录」,不是「复用原项目」

这一点非常关键。

搜索引擎只关心三件事:

  1. HTML 里有没有完整内容
  2. title / meta / heading 是否合理
  3. 页面是否稳定、可抓取

👉 它完全不关心你是不是 Vue3 + Webpack 写的。

也就是说:

你现在这个 Vue SPA,本质上对 SEO 是"负资产"

转 SSG 只是想"止血",而不是"发挥它的优势"。


2️⃣ "每个界面都被搜录"=典型「内容站」需求

你描述的不是"应用",而是:

  • 多页面
  • 静态内容为主
  • URL 稳定
  • 内容可预期

👉 这是 SSG 的"主场",不是 SPA 的。

把 SPA 硬改成内容站,本身就违背初始设计。


3️⃣ Vue3 + Webpack SPA 转 SSG 的真实成本(说实话)

你至少要面对这些"不可避免"的事:

  • 把 onMounted 数据前移
  • 清理所有 window / document
  • 拆路由 & 枚举 URL
  • 重构构建链
  • 修 hydration 不一致
  • 处理构建期接口异常

👉 这不是"技术升级",是"架构纠错"

而且最关键的是:

你改完以后,SEO ≈ 一个原生 SSG 项目

并不会更好。


三、那你真正"应该做"的是什么?

一句话版本

保留原 Vue 项目(哪怕只当开发参考),
新建一个「纯 SSG 官网层」,彻底为 SEO 服务。

下面我给你拆成最现实、最容易落地的版本。


四、你这个场景的「最优架构」长什么样?

推荐架构(真实世界版本)

erlang 复制代码
example.com          → SSG 官网(SEO 100%)
app.example.com      → 原 Vue3 + Webpack(如果有)

你现在甚至可以是:

复制代码
example.com          → SSG 官网

原项目:

  • 当素材库
  • 当设计稿
  • 当业务逻辑参考

五、为什么这是"SEO 最稳"的方案?

1️⃣ 搜索引擎看到的是「纯 HTML」

  • 不等 JS
  • 不怕执行失败
  • 不怕 hydration

👉 国内搜索引擎尤其友好


2️⃣ 每个页面天然就是「独立可抓取实体」

  • /product/a
  • /solution/b
  • /pricing

👉 不存在 SPA 的"内容藏在 JS 里"问题。


3️⃣ meta / title / heading 精准控制

你可以做到:

  • 每页不同 title
  • 每页独立 description
  • 每页结构化数据

这是 SPA 非常难做到极致的。


六、你最关心的问题:那我不是要"重写官网吗"?

实话实说:是的,但没你想的那么惨

原因有 3 个:


1️⃣ 官网页面,逻辑其实很少

大多数官网页面:

  • 文案
  • 图片
  • 模块组合
  • 少量接口数据

👉 不是"应用逻辑",是"内容渲染"


2️⃣ UI / 组件是可以复用"思想",不必复用代码

说句大实话:

SPA 组件 ≠ SSG 组件

强行复用代码,反而会拖累你。


3️⃣ 重写官网 ≠ 推倒重来

你可以:

  • 文案直接复用
  • 接口继续用
  • 设计稿不变
  • 路由结构沿用

👉 重写的是"渲染方式",不是"业务本身"


七、那用什么 SSG?我直接给你建议(不绕)

结合你的情况,我给你务实推荐:

🥇 第一优先:Astro(非常适合你)

为什么?

  • 天生 SSG
  • 默认零 JS
  • SEO 极友好
  • Vue 组件可"局部嵌入"
  • 学习成本低

👉 这是为"官网 / 内容站"而生的工具


🥈 次优:VitePress(如果你偏文档)

  • 极稳
  • 极简单
  • SEO 好
  • 但不太适合复杂官网结构

🥉 Nuxt SSG(不是不行,但你会累)

  • 功能强
  • 但你刚从"转 SSR 的痛苦"出来
  • 没必要再背一套心智负担

八、一个你可能没意识到的"反直觉点"

"全部页面可被搜录" ≠ "所有页面都要动态生成"

搜索引擎最喜欢的,反而是:

  • 稳定 URL
  • 稳定 HTML
  • 长期不变的内容

👉 SSG 天然比 SSR 更"讨好搜索引擎"

6. 那既需要SEO,又需要有客服,但是不需要登录的官网,应该用什么技术?可以用Astro+什么吗?还是用Nuxt+什么?还是用Next+什么?

你这个场景非常标准 ,所以技术选型其实是有明确优先级的。


一、先给你一句话结论(可直接拍板)

「SEO + 官网 + 无登录 + 有客服」这种站点,
技术优先级是:
👉 Astro(SSG) > Nuxt(SSG 模式) > Next(SSG 模式),
客服一律走"纯客户端模块"。

不是模棱两可,这是工程最优解排序。


二、为什么 Astro 排第一?(不是新潮,是匹配度)

1️⃣ 你的核心需求回顾

需求 是否核心
SEO ⭐⭐⭐⭐⭐
全站可搜录 ⭐⭐⭐⭐⭐
不需要登录 ⭐⭐⭐⭐
客服 ⭐⭐⭐
实时性 ⭐
个性化 ⭐

👉 这是一个"内容型官网 + 功能外挂"的典型模型


2️⃣ Astro 天生就是为这个模型设计的

Astro 的核心理念只有一句话:

"先有 HTML,再谈 JS。"

这对 SEO 意味着什么?

  • 构建期 100% HTML
  • 搜索引擎零成本抓取
  • 不依赖 JS 执行

这是 Next / Nuxt 无法天然做到的(它们默认仍是"应用思维")。


3️⃣ Astro 对客服这种功能的处理方式是"完美隔离"

客服有三个特性:

  • 不参与 SEO
  • 必须依赖 JS
  • 可以延迟加载

Astro 正好提供:

xml 复制代码
<ClientOnly>
  <CustomerService />
</ClientOnly>

👉 SEO 和功能彻底解耦


三、Nuxt 和 Next 在这个场景下的问题是什么?

我不是说它们不能用,而是性价比不如 Astro。


Nuxt(Vue 系)

什么时候 Nuxt 是"合理但非最优"?

  • 你团队 已经非常熟 Vue
  • 官网组件和 Vue 项目 高度复用
  • 有少量动态数据

为什么排第二?

  • 你仍然在维护:

    • Node 能力
    • 双端心智
  • 很容易不小心写成 SSR

  • 构建产物 JS 偏重

👉 Nuxt 更像"轻应用",而不是"纯内容站"


Next(React 系)

什么时候 Next 可以考虑?

  • 公司 React 技术栈统一
  • 官网和 Web App 共仓库
  • 有后续登录 / 应用扩展计划

为什么排第三?

  • 默认 JS 较多
  • SEO 强依赖约定
  • 很容易过度工程化

👉 Next 不是为"官网"而生,是为"Web App"而生


四、客服到底"+ 什么"?我直接告诉你最优解

一句话结论

客服 = 纯客户端,不要进入渲染体系


方案优先级

🥇 第一优先:第三方客服 SDK(90% 官网)
  • Udesk
  • 美洽
  • Intercom
  • Crisp
  • Zendesk Chat

优点:

  • 零后端
  • 稳定
  • 不影响 SEO
  • 不影响构建

🥈 第二优先:自建客服(如果你有定制需求)

架构:

markdown 复制代码
Astro / Nuxt / Next(SSG)
  └─ ClientOnly 客服组件
        └─ API / WebSocket

重点:

  • 客服永远不 SSR
  • 不参与 SSG
  • 不参与 SEO

五、你真正该做的技术决策(我帮你总结)

如果你只做官网(现在)

👉 Astro + 第三方客服

这是综合成本最低、风险最低、SEO 最稳的方案。


如果你未来可能加登录 / 应用模块

👉 Astro + 客服 + 子域名 App(Vue / React SPA)

而不是现在就上 SSR 框架。


如果你已经是 Vue 全家桶

👉 Nuxt(SSG 模式)+ 客服

但你要刻意避免 SSR 滑坡。


六、一个"反直觉但非常重要"的点

"能 SSR ≠ 应该 SSR"

在官网这个领域:

  • SSR 是"历史补丁"
  • SSG 是"天然优势"

七、我给你一个最终的决策表(直接用)

场景 推荐
SEO 为王、纯官网 Astro + 客服
Vue 重度复用 Nuxt(SSG)+ 客服
React 统一 Next(SSG)+ 客服
高实时性 SSR(少数)

7. 那为什么很少看见有人说用Astro搭建官网?

你已经发现了一个真实存在但很少被明说的现象。

不是 Astro 不适合官网,
而是:
👉 Astro 正好适合"真正的官网",
👉 但行业话语权长期掌握在"做应用的人"手里。

所以你"很少看见有人说",不是技术问题,是叙事权问题。


一、为什么你在网上"几乎看不到 Astro 官网方案"?

原因不是一个,而是一整套行业惯性。


二、第一层原因:大多数人眼里的"官网",其实是"Web App"

这是最根本的误解。

现实情况是:

很多人说的"官网"是这样的:

  • 有登录
  • 有用户态
  • 有控制台
  • 有表单
  • 有大量交互

👉 这根本不是官网,是 Web App 的入口页。


在这种认知下:

  • Next / Nuxt = 正确
  • Astro = "玩具" / "不够强"

但如果你把"官网"还原成它真正的形态:

  • 内容展示
  • SEO
  • 稳定
  • 低成本

👉 Astro 反而是"刚好合身"


三、第二层原因:Astro "不讨好前端程序员"

这点非常现实,但很少人敢说。

1️⃣ Astro 写起来"没有技术快感"

  • 没复杂状态管理
  • 没服务端渲染技巧
  • 没 hydration 调优

你写 Astro 官网时,大部分时间在:

  • 写 HTML
  • 写文案结构
  • 调 SEO

👉 这不符合很多前端的"成就感模型"


2️⃣ Astro 把 JS "剥夺"得太彻底

Astro 的设计哲学是:

"默认不运行 JS"

而前端社区的长期叙事是:

"一切皆组件,一切皆 JS"

这在心理层面是冲突的。


四、第三层原因:Astro 不能"顺带做别的事"

这是它工程上的优点,但传播上的缺点。

Next / Nuxt 的宣传方式是:

"你可以先做官网,

以后还能加登录、加后台、加 SSR、加 API。"

Astro 的态度是:

"我只把官网这件事做好。"

👉 这对"规划型思维"的技术选型很不友好


五、第四层原因:Astro 没有"巨头背书"

这点你得看清楚现实。

框架 背后
Next Vercel
Nuxt Vue 官方
Astro 独立团队

后果是什么?

  • 企业更容易相信"有大厂兜底"
  • 培训、文章、案例更多
  • 招聘 JD 更敢写

👉 Astro 技术好,但生态传播弱


六、第五层原因:Astro 不"卖 SSR 故事"

而前端社区,非常爱 SSR 故事。

  • SSR 很"高级"
  • Edge / Streaming 很"前沿"
  • Server Components 很"性感"

Astro 却说:

"大部分官网根本不需要 SSR。"

👉 这在流量逻辑里是"反卖点"


七、一个你可能没意识到的事实

真正大量使用 Astro 的团队,
往往不写文章、不发分享、不当 KOL。

他们的特点是:

  • 做企业官网
  • 做营销页
  • 做内容站
  • 做 SEO 项目

👉 他们更关心转化率,而不是技术曝光


八、为什么你反而"该"用 Astro?

因为你描述的官网,正好是 Astro 的主场:

  • 不登录
  • SEO 为王
  • 每页可抓取
  • 有客服
  • 稳定优先

👉 Astro 是"反流行,但正解"


九、你可以怎么判断自己是不是"少数派正确"?

问自己 3 个问题:

  1. 我的网站主要目标是「被用户使用」还是「被搜索引擎看到」?
  2. JS 失败会不会影响核心价值?
  3. 我是否真的需要 SSR 的能力?

如果答案是:

  • SEO > 交互
  • 内容 > 状态
  • 稳定 > 灵活

👉 Astro 就是为你准备的


十、给你一句"冷静但很准"的总结

Astro 不流行,是因为它解决的是"已经被误解的问题"。

真正需要 Astro 的人,往往已经不在"追逐技术话题"的阶段了。

8. 我首页和导航,都会点击跳转,是不是不好用Astro做? ------ NO!NO!NO!

这个问题问得非常关键 ,而且你已经触碰到Astro 被误解最多的一点。

我先给你一句斩钉截铁的结论,然后把"为什么很多人会误判 + Astro 真正的工作方式 + 你该怎么选"讲清楚。


先给你结论(直接打掉顾虑)

首页和导航需要点击跳转,
❌ 完全不是"不适合 Astro",
反而是 Astro 最擅长的场景之一。

"点击跳转 ≠ 必须 SPA"

这是一个被前端社区严重放大的误解。


一、你现在担心的,其实是这件事(我帮你点破)

你心里想的多半是:

"Astro 是静态的,

那点击跳转是不是就整页刷新?

体验会不会很差?"

对吧?


二、先纠正一个根本性误解

🔴 误解:

"现代网站的跳转,应该是 SPA 那种无刷新跳转。"

🟢 真相:

"对于官网,'整页跳转'不仅不差,反而是最稳定、最符合预期的行为。"


三、为什么「整页跳转」在官网里是正确行为?

1️⃣ 用户心理预期本来就是"换页面"

当用户从:

  • 首页 → 产品页
  • 产品页 → 解决方案
  • 关于我们 → 联系我们

他们本来就预期页面会变。

👉 不是在"同一个应用里操作"


2️⃣ 搜索引擎"最喜欢"的就是这种跳转

  • <a href="/product">
  • 独立 HTML
  • 清晰 URL

👉 这是 SEO 的黄金路径


3️⃣ CDN + SSG 下,整页跳转非常快

现实情况是:

  • CDN 命中
  • HTML < 20KB
  • 首屏几乎瞬间出现

👉 体感并不比 SPA 慢


四、那 Astro 是不是"只能整页刷新"?不是。

Astro 有 3 种导航模式,你可以按需用。


模式一:纯 HTML 跳转(默认,最推荐)

ini 复制代码
<a href="/product/">产品</a>

特点

  • SEO 最优
  • 稳定性最高
  • 复杂度最低
  • 非常快(CDN)

👉 90% 官网用这个就够了


模式二:Astro View Transitions(无刷新体验)

Astro 内置支持 View Transitions API:

yaml 复制代码
---
import { ViewTransitions } from 'astro:transitions';
---
<html>
  <head>
    <ViewTransitions />
  </head>
</html>

效果

  • 点击导航
  • 页面平滑过渡
  • 类似 SPA 的体验
  • 仍然是多页 HTML

👉 SEO 不受影响


模式三:局部 SPA(只在需要的地方)

比如:

  • 导航高亮
  • 搜索框
  • 客服弹窗
xml 复制代码
<ClientOnly>
  <NavBar client:load />
</ClientOnly>

👉 交互 ≠ 整站 SPA


五、你这个官网,用 Astro 的"最佳实践组合"

我直接帮你选:

对你最合理的组合是:

  • 页面:多页 SSG
  • 跳转:HTML 跳转
  • 过渡:View Transitions(可选)
  • 交互:局部 Vue / React
  • 客服:ClientOnly

六、为什么你"反而不该用 SPA 导航"?

这点很反直觉,但非常重要。

SPA 导航在官网里的真实问题:

  1. JS 必须先加载
  2. 网络慢时白屏
  3. hydration 失败风险
  4. SEO 复杂度上升
  5. 错误放大(一个 bug 全站挂)

👉 这是官网完全不需要承担的风险


七、你现在的 Vue SPA 官网,其实是在"用重武器打轻目标"

  • SPA:为复杂状态而生
  • 官网:内容展示

👉 不匹配


八、给你一个简单的"判断法则"(记住它)

如果一个点击,只是"去看另一个内容页",就不应该用 SPA 跳转。


九、所以回答你的问题

❓ 首页和导航需要点击跳转,是不是不好用 Astro?

答案是:

不但不冲突,而且正是 Astro 的主战场。

相关推荐
zach7 小时前
前端落地实战:Next.js 项目 Nginx + PM2 生产部署全流程(附踩坑总结)
前端·pm2·next.js
overmind7 小时前
oeasy教h5前端001 修改的乐趣_直接修改在线网页
前端
只睡四小时7 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
恋猫de小郭7 小时前
Android 原生的 Compose A2UI 也来了,你还抱着 XML 养老吗?
android·前端·flutter
庄园特聘拆椅狂魔7 小时前
从连连看到粒子消散——前端小游戏与视觉特效的技术选型
前端
JudithHuang7 小时前
React 常用 Hooks
前端·react.js·前端框架
sycmancia8 小时前
Qml——Window元素使用
前端
每天都好困9 小时前
03 AR 投影与误差修正:把地图上的点贴到视频画面上
前端
每天都好困9 小时前
04 地图图层封装:像管理 Photoshop 图层一样管理地图元素
前端
去伪存真9 小时前
构建你的第一个 DevOps AI Agent:自动化捕获、分析并修复 CI 故障
前端·agent