和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 的主战场。

相关推荐
胆大如牛白展堂2 小时前
自动刷新token登录
前端·设计模式
Charon_super2 小时前
html语法笔记
前端·笔记·html
JeffreyTaiT2 小时前
根据binlog恢复SQL
前端·mysql
Anita_Sun2 小时前
Lodash 源码解读与原理分析 - Lodash 静态方法与原型方法
前端
明月_清风2 小时前
Async/Await:让异步像同步一样简单
前端·javascript
听风说图2 小时前
从 JavaScript 到 WGSL:用渐变渲染理解 GPU 编程思维
前端
float_六七2 小时前
CSS行内盒子:30字掌握核心特性
前端·css
倔强的钧仔2 小时前
拒绝废话!前端开发中最常用的 10 个 ES6 特性(附极简代码)
前端·javascript·面试
喔烨鸭2 小时前
vue3中使用原生表格展示数据
前端·javascript·vue.js