普通 Vue 项目已经能够完成组件开发、状态管理和页面交互,但公开网站还需要处理搜索引擎收录、页面元数据、路由生成、多语言地址和部署方式。开发者如果逐项组合 Vue Router、预渲染工具、SEO 插件和国际化插件,项目配置会逐渐分散,页面结构与构建规则也容易失去统一约束。
Nuxt 3建立在 Vue 3 之上,将路由、渲染、数据获取、SEO 和服务端能力整合到同一套工程结构中。它适合内容公开、页面结构明确、需要搜索收录的网站 ,也可以继续扩展为包含接口和动态数据的应用。Nuxt 官方将其定位为基于 Vue 的全栈框架 ,并提供文件路由、服务端渲染、静态生成和自动导入等能力。(Nuxt)

一、Nuxt 3的基本结构
Nuxt 3采用约定式目录 。开发者在 pages 目录中创建页面文件,框架会自动生成对应路由;公共组件放入 components,全局布局放入 layouts,静态资源放入 public。这种设计减少了页面文件与路由配置之间的重复关系。
bash
nuxt-app/
├─ app.vue
├─ nuxt.config.ts
├─ pages/
│ ├─ index.vue
│ ├─ about.vue
│ └─ articles/
│ └─ [slug].vue
├─ components/
│ ├─ SiteHeader.vue
│ └─ ArticleCard.vue
├─ layouts/
│ └─ default.vue
├─ assets/
│ └─ css/
└─ public/
└─ images/
文件路径会直接转换为访问地址。
bash
pages/index.vue → /
pages/about.vue → /about
pages/articles/[slug].vue → /articles/:slug
普通 Vue 项目通常需要在 router.ts 中手动声明这些映射。Nuxt 3通过文件结构生成路由,页面新增、移动和删除时,路由能够同步变化。这种约定适合页面数量持续增加的内容网站,也能减少路径配置错误。
二、页面渲染与SEO设计
传统 Vue 单页应用首次加载时,服务器返回的 HTML 通常只有一个应用挂载节点(app)。浏览器下载并执行 JavaScript 后,页面正文才会生成。公开网站如果完全依赖客户端渲染,搜索引擎、链接预览服务和弱性能设备可能无法及时获得完整内容。
Nuxt 3可以在服务端或构建阶段生成 HTML。静态网站使用预渲染后,标题、正文和页面描述会直接进入生成文件,同时继续保留 Vue 的交互能力。Nuxt 官方文档说明,预渲染会在构建阶段生成页面,并将结果写入静态部署目录,以改善性能和部分 SEO 指标 。(Nuxt)
一个页面可以同时编写内容与 SEO 信息。
html
<script setup lang="ts">
const pageTitle = '环境数据智能监测平台'
const pageDescription = '面向多源监测数据的采集、分析与异常识别平台'
useSeoMeta({
title: pageTitle,
description: pageDescription,
ogTitle: pageTitle,
ogDescription: pageDescription,
ogType: 'website'
})
</script>
<template>
<main>
<h1>{{ pageTitle }}</h1>
<p>{{ pageDescription }}</p>
<NuxtLink to="/about">
查看平台介绍
</NuxtLink>
</main>
</template>
构建阶段会将 useSeoMeta 中的内容写入页面头部 。相比在组件加载完成后再修改 document.title,这种方式更适合静态生成和服务端渲染,也便于集中检查每个页面的标题、描述和分享信息。
三、静态生成与多语言场景
对于团队官网、企业门户、项目展示页和技术文档站,页面内容更新频率通常较低,访问者数量却可能出现短期波动 。静态生成可以提前完成页面计算,部署后只需要由 Nginx 返回 HTML、CSS 和 JavaScript 文件,无需长期运行 Node.js 服务。
javascript
// nuxt.config.ts
export default defineNuxtConfig({
ssr: true,
nitro: {
prerender: {
crawlLinks: true,
routes: [
'/',
'/about',
'/articles/nuxt-introduction'
]
}
},
app: {
head: {
titleTemplate: '%s | 技术团队官网',
meta: [
{
name: 'viewport',
content: 'width=device-width, initial-scale=1'
}
]
}
}
})
执行构建命令后,Nuxt 会生成可直接部署的静态文件。
bash
npm install
npm run generate
bash
.output/public/
├─ index.html
├─ about/
│ └─ index.html
├─ articles/
│ └─ nuxt-introduction/
│ └─ index.html
└─ _nuxt/
├─ entry.js
└─ entry.css
国际化公开网站还需要让不同语言拥有稳定地址 。例如默认语言使用 /about,英文使用 /en/about,其他语言继续添加前缀。prefix_except_default 可以保留默认语言的简洁路径,并为其他语言生成独立路由。(Nuxt I18n)
javascript
export default defineNuxtConfig({
modules: ['@nuxtjs/i18n'],
i18n: {
defaultLocale: 'zh',
strategy: 'prefix_except_default',
locales: [
{
code: 'zh',
name: '中文',
language: 'zh-CN',
file: 'zh-CN.json'
},
{
code: 'en',
name: 'English',
language: 'en-US',
file: 'en-US.json'
}
]
}
})
这种设计能够让搜索引擎分别识别不同语言页面,分享链接也会保留当前语言。仅在前端替换文字而不改变 URL,会让多个语言版本共用同一个地址,后续处理站点地图、规范链接和页面统计时会更加困难。
四、为什么采用Nuxt 3
公开内容网站选择 Nuxt 3,主要解决四个问题。第一,构建阶段可以生成完整 HTML,搜索引擎和链接预览服务能够直接读取正文 。第二,文件路由和页面元数据拥有统一结构,页面数量增加后仍然容易维护 。第三,多语言内容可以映射为独立地址 。第四,静态构建产物可以交给 Nginx 或对象存储托管,降低服务器运行和维护成本。
直接使用普通 Vue 也可以完成同类网站,但需要自行配置预渲染、SEO、多语言路由和部署规则。配置遗漏后,常见问题包括页面源码缺少正文、分享卡片信息为空、语言切换后地址不变、直接访问子页面出现 404,以及动态页面没有进入静态构建结果。
静态部署时,Nginx 应优先访问真实生成的文件和目录。
bash
server {
listen 80;
server_name example.com;
root /var/www/site/.output/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /_nuxt/ {
try_files $uri =404;
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Nuxt 3自身也存在需要关注的风险。动态路由如果没有被页面链接发现,也没有显式加入预渲染列表,对应 HTML 可能不会生成;组件同时使用浏览器时间、随机数或客户端专属对象时,可能引发服务端 HTML 与客户端结果不一致;多语言页面如果缺少稳定路由规则,容易出现重复页面。优化时应重点检查构建产物、动态路由清单、页面元数据和深层地址访问结果。
Nuxt 3适合承担公开网站的工程基础。它保留 Vue 3的组件开发方式,同时把内容网站常见的路由、渲染、SEO、多语言和部署问题放入统一框架中,使项目可以用较低的维护成本获得稳定的公开访问能力。