Nuxt.js 详解(一):Vue 开发者为什么要关注 Nuxt
这是 Nuxt 系列的第一篇。如果你已经在用 Vue 开发,但对"要不要上 Nuxt"还有疑问,这篇文章帮你把认知理清楚。
一、从一个真实场景说起
假设你用 Vue 写了一个内容站------博客、电商商品页、文档站,都行。项目跑起来了,功能没问题。然后你遇到三个怎么也绕不过去的坎:
- 首屏白屏:用户打开页面,先盯着空白屏幕看两秒,等 JS 加载完才渲染出内容。
- SEO 糟糕 :百度、Google 的爬虫来抓页面,看到的是一个空
<div id="app"></div>,内容全靠 JS 渲染,爬虫根本抓不到。 - 想写个接口得另起后端:前端 Vue + 后端 Express/Node,两个项目两套部署,维护成本翻倍。
这三个问题,Nuxt 全都帮你解决了。而且解决的方式不是"给你一个插件",而是从框架层面重新设计。
二、Nuxt 究竟是什么
一句话定义:
Nuxt 是基于 Vue 的全栈框架。 它在 Vue 之上封装了服务端渲染、路由系统、布局系统、自动导入、后端接口能力,让你用一个项目就能搞定从前端到后端的完整 Web 应用。
打个比方:Vue 是发动机,Nuxt 是整辆车。你当然可以自己买发动机、配底盘、装轮子(用 Vite + Vue + Vue Router + Pinia 手搭),但 Nuxt 直接给你一辆装配好的车,钥匙一拧就能开。
目前主流版本是 Nuxt 3,底层基于 Vite 构建,服务端引擎用 Nitro。
三、Nuxt 的核心能力
1. 服务端渲染(SSR)
Vue 默认是客户端渲染(CSR):浏览器下载空 HTML + JS bundle,在浏览器里执行 JS 渲染页面。
Nuxt 开启 SSR 后:用户请求 URL,服务器先把 Vue 组件渲染成 HTML 字符串,直接返回一个有内容的页面。浏览器拿到 HTML 就能立刻显示,然后再"注水"(hydration)把交互事件绑定上去。
效果:首屏从"白屏两秒"变成"秒开" ,爬虫抓到的是完整 HTML,SEO 直接解决。
2. 静态站点生成(SSG)
如果你的内容不常变(博客、文档站),Nuxt 可以在构建时把每个页面预渲染成静态 HTML 文件。部署到任何静态服务器(Nginx、CDN)即可,性能极好,成本极低。
3. 混合渲染
这是 Nuxt 最灵活的地方------同一个项目里,不同路由可以用不同渲染模式。
比如:
- 首页、商品详情页走 SSR(需要 SEO、实时数据)
- 关于我们走 SSG(静态内容)
- 后台管理走 CSR(不需要 SEO)
- 某些页面走 ISR(增量静态再生,定时更新)
ts
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true }, // 静态预渲染
'/products/**': { swr: 3600 }, // 1小时增量缓存
'/admin/**': { ssr: false }, // 纯客户端
'/news/**': { isr: true }, // 增量静态再生
}
})
一段配置搞定,不用为不同渲染模式维护多个项目。
4. 约定式路由
Vue 里你要手动写路由配置:
js
// Vue Router 手动配置
const routes = [
{ path: '/', component: () => import('./views/Home.vue') },
{ path: '/about', component: () => import('./views/About.vue') },
{ path: '/user/:id', component: () => import('./views/User.vue') },
]
Nuxt 里你只要在 pages/ 目录放文件,路由自动生成:
bash
pages/
├── index.vue → /
├── about.vue → /about
└── user/
└── [id].vue → /user/:id
删掉一整块路由配置代码,少维护一个文件。
5. 自动导入
在 Vue 里,你每个文件都要 import:
vue
<!-- Vue:每个文件都要 import -->
<script setup>
import { ref, computed } from 'vue'
import MyButton from '@/components/MyButton.vue'
import { useUserStore } from '@/stores/user'
</script>
Nuxt 自动导入 Vue API、components/ 下的组件、composables/ 下的组合式函数:
vue
<!-- Nuxt:直接用,不用 import -->
<script setup>
const count = ref(0) // ref 自动导入
const double = computed(() => count.value * 2) // computed 自动导入
const user = useUserStore() // composables/ 下自动导入
</script>
<template>
<MyButton @click="count++" /> <!-- components/ 下自动导入 -->
</template>
少打字,多干活。
6. 全栈能力(server/api)
Nuxt 项目自带 server/ 目录,直接写后端接口,不用单独起 Express:
ts
// server/api/users.get.ts
export default defineEventHandler(async (event) => {
const users = await db.user.findMany()
return users
})
前端调用:
ts
const { data } = await useFetch('/api/users')
一个项目,前后端通吃。部署也只需要一个进程。
7. SEO 与 head 管理
vue
<script setup>
// 自动设置页面 title、meta 标签,SSR 时渲染到 HTML
useSeoMeta({
title: '商品详情 - 我的商城',
ogTitle: '商品详情',
description: '这是一款优质商品',
ogImage: 'https://example.com/cover.jpg'
})
</script>
爬虫和社交分享都能拿到正确的 meta 信息。
四、渲染模式对比
| 模式 | 全称 | 首屏速度 | SEO | 服务器成本 | 适用场景 |
|---|---|---|---|---|---|
| CSR | 客户端渲染 | 慢 | 差 | 无 | 后台管理系统 |
| SSR | 服务端渲染 | 快 | 好 | 高 | 电商、内容站 |
| SSG | 静态生成 | 最快 | 好 | 无 | 博客、文档站 |
| 混合 | Hybrid | 按需 | 按需 | 按需 | 大型应用 |
五、Nuxt vs 纯 Vue(Vite + Vue)
| 维度 | 纯 Vue | Nuxt |
|---|---|---|
| 渲染 | 仅 CSR | SSR / SSG / CSR / 混合 |
| 路由 | 手动配置 | 文件约定式 |
| 组件导入 | 手动 import | 自动导入 |
| 后端接口 | 需另起服务 | 内置 server/api |
| SEO | 差 | 好 |
| 首屏 | 慢 | 快 |
| 学习成本 | 低 | 中 |
| 灵活度 | 高 | 约定优先 |
简单说:小项目、后台管理用纯 Vue 就够了;内容站、对 SEO 和性能有要求的项目,Nuxt 值得用。
六、Nuxt vs Next.js
- Nuxt :Vue 生态,语法是 Vue 的
.vue单文件组件 - Next.js:React 生态,JSX 语法
两者设计理念类似(都是全栈 + SSR 框架),选哪个主要看你团队用 Vue 还是 React。
七、什么时候用 Nuxt
推荐用:
- 内容驱动型网站(博客、新闻、文档)
- 电商网站(需要 SEO + 首屏快)
- 需要前后端一体的小到中型项目
- 对首屏性能有要求的 C 端应用
没必要用:
- 内部后台管理系统(不需要 SEO,首屏要求不高)
- 纯工具型 Web App(如在线编辑器、设计工具)
- 团队完全不想碰 Node 服务端部署
八、结语
Nuxt 不是要取代 Vue,而是在 Vue 之上加了一层工程化封装。你的 Vue 知识在 Nuxt 里完全用得上------.vue 组件、Composition API、<script setup> 语法,全都一样。Nuxt 做的是把"你自己要搭的那些东西"提前帮你装好了。
下一篇,我们会从零开始搭建一个 Nuxt 项目,走完从创建到部署的完整流程。
本系列共三篇:
- 第一篇:Vue 开发者为什么要关注 Nuxt(本文)
- 第二篇:从零搭建一个 Nuxt 项目
- 第三篇:迁移踩坑与最佳实践