最近菜鸟有点难受,之前开发公司网站时没有考虑需要 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 前:
- 匹配路由
- 找到所有
loadData - 并行请求
- 塞进 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 项目特征
-
所有页面都当成"应用页"
- 首页 = 应用
- 官网页 = 应用
- 文档页 = 应用
-
数据全在
onMounted / created里拉scssonMounted(() => { fetchHomeData() }) -
强依赖运行时环境
windowlocalStoragenavigatorlocation
-
路由是"用户态驱动"的
- 登录后才有内容
- 权限在前端算
👉 这种项目不是"不适合 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 件事:
- 页面职责拆分
- 数据拉取前移
- 运行时逻辑隔离
- 路由可枚举
- 构建体系调整
👉 这不是技术复杂,是"架构债务在还"
五、把复杂问题拆开,你就会发现 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 个错:
- 想"一键 SSG 整个应用"
- 不愿意改数据流
SSG 不是"打包模式",是运行模型变化。
七、现实中可行的"低风险路线"(我建议你用这个)
路线建议(务实版)
-
保留现有 Vue SPA
-
新建一个:
- VitePress / Nuxt Content
- 或独立的 SSG 项目
-
官网域名:
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 假设你:
- 项目是 ESM
- 模块无副作用
- 数据获取可前置
- 页面可在 Node 运行
- 不依赖浏览器全局对象
而你的项目:
- 是 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️⃣ 你的官网目标是「被搜录」,不是「复用原项目」
这一点非常关键。
搜索引擎只关心三件事:
- HTML 里有没有完整内容
- title / meta / heading 是否合理
- 页面是否稳定、可抓取
👉 它完全不关心你是不是 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 个问题:
- 我的网站主要目标是「被用户使用」还是「被搜索引擎看到」?
- JS 失败会不会影响核心价值?
- 我是否真的需要 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 导航在官网里的真实问题:
- JS 必须先加载
- 网络慢时白屏
- hydration 失败风险
- SEO 复杂度上升
- 错误放大(一个 bug 全站挂)
👉 这是官网完全不需要承担的风险
七、你现在的 Vue SPA 官网,其实是在"用重武器打轻目标"
- SPA:为复杂状态而生
- 官网:内容展示
👉 不匹配
八、给你一个简单的"判断法则"(记住它)
如果一个点击,只是"去看另一个内容页",就不应该用 SPA 跳转。
九、所以回答你的问题
❓ 首页和导航需要点击跳转,是不是不好用 Astro?
答案是:
不但不冲突,而且正是 Astro 的主战场。