Nuxt.js 模板
基于 Nuxt 3 + TypeScript 的现代化全栈应用开发模板,支持 SSR、SSG、多语言和完整的开发工具链。
技术栈
- Nuxt 3 - 基于 Vue 3 的全栈框架
- Vue 3 - 渐进式 JavaScript 框架,使用 Composition API
- TypeScript - JavaScript 的超集,提供完整的类型安全
- Vite - 下一代前端构建工具
- Pinia - Vue 3 官方状态管理库
- @nuxtjs/i18n - Nuxt 官方国际化模块
- Tailwind CSS - 实用优先的 CSS 框架
- SCSS - CSS 预处理器,增强样式编写能力
快速开始
创建项目
bash
# 初始化项目
vup init my-project
# 进入项目目录
cd my-project
# 添加 Nuxt 应用
vup add my-nuxt-app
# 选择 Nuxt.js 模板
开发
bash
# 安装依赖
pnpm install
# 启动开发服务器
pnpm dev
开发服务器将在 http://localhost:9303
启动
构建
bash
# 构建生产版本
pnpm build
# 生成静态站点
pnpm generate
# 预览构建结果
pnpm preview
项目结构
my-nuxt-app/
├── src/
│ ├── assets/ # 静态资源
│ │ └── images/
│ │ └── nuxt.svg
│ ├── components/ # Vue 组件
│ │ └── Demo.vue
│ ├── composables/ # 组合式函数
│ ├── layouts/ # 布局组件
│ ├── middlewares/ # 中间件
│ ├── pages/ # 页面组件(文件路由)
│ │ ├── demo.vue
│ │ └── index.vue
│ ├── utils/ # 工具函数
│ └── app.vue # 根组件
├── i18n/ # 国际化文件
│ └── locales/ # 语言包
│ ├── zh-CN.json # 中文语言包
│ └── en-US.json # 英文语言包
├── public/ # 公共静态资源
│ ├── favicon.ico
│ └── robots.txt
├── nuxt.config.ts # Nuxt 配置
├── package.json # 项目配置
├── tsconfig.json # TypeScript 配置
└── tsconfig.build.json # 构建时 TypeScript 配置
核心特性
🎯 TypeScript 支持
完整的 TypeScript 支持,提供类型安全和智能提示:
typescript
// 页面组件中使用 TypeScript
<script setup lang="ts">
interface User {
id: number;
name: string;
email: string;
}
const user = ref<User>({
id: 1,
name: 'John Doe',
email: 'john@example.com'
});
</script>
🚀 Nuxt 3 全栈框架
基于 Nuxt 3 的强大功能:
- 服务端渲染 (SSR) - 更好的 SEO 和首屏性能
- 静态站点生成 (SSG) - 预渲染静态页面
- 文件系统路由 - 基于文件结构自动生成路由
- 自动导入 - 无需手动导入 Vue API 和 Nuxt 功能
- 中间件支持 - 路由中间件和插件系统
🎨 样式系统
使用 Tailwind CSS + SCSS 的组合方案:
vue
<template>
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold text-blue-600">
{{ $t('page.title') }}
</h1>
</div>
</template>
<style lang="scss" scoped>
.container {
@apply bg-white rounded-lg shadow-md;
h1 {
@apply text-blue-600;
}
}
</style>
🌍 国际化支持
内置完整的多语言支持:
vue
<template>
<div>
<h1>{{ $t('page.title') }}</h1>
<p>{{ $t('page.description') }}</p>
</div>
</template>
<script setup lang="ts">
// 使用 useI18n 组合式函数
const { t, locale } = useI18n();
// 切换语言
const switchLanguage = (lang: 'zh-CN' | 'en-US') => {
const { $i18n } = useNuxtApp();
$i18n.setLocale(lang);
};
</script>
🏪 状态管理
使用 Pinia 进行状态管理:
typescript
// stores/counter.ts
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', () => {
const count = ref(0);
const increment = () => {
count.value++;
};
const decrement = () => {
count.value--;
};
return {
count,
increment,
decrement,
};
});
🛣️ 文件系统路由
基于文件结构自动生成路由:
pages/
├── index.vue # / 路由
├── demo.vue # /demo 路由
├── about.vue # /about 路由
└── blog/
├── index.vue # /blog 路由
└── [slug].vue # /blog/:slug 动态路由
开发工具
代码质量
- ESLint - 代码质量检查
- Prettier - 代码格式化
- TypeScript - 类型检查
开发命令
bash
# 开发服务器
pnpm dev
# 构建项目
pnpm build
# 生成静态站点
pnpm generate
# 预览构建结果
pnpm preview
# 代码检查
pnpm lint
pnpm lint:fix
# 代码格式化
pnpm format
pnpm format:check
自动导入
Nuxt 3 提供强大的自动导入功能:
vue
<template>
<div>
<h1>{{ title }}</h1>
<button @click="handleClick">点击我</button>
</div>
</template>
<script setup lang="ts">
// 无需导入 ref, computed, onMounted 等 Vue API
// 无需导入 useI18n, useRouter 等 Nuxt 功能
const title = ref('Hello Nuxt 3');
const count = computed(() => title.value.length);
const handleClick = () => {
console.log('Button clicked!');
};
onMounted(() => {
console.log('Component mounted');
});
</script>
最佳实践
组件开发
- 使用 Composition API
- 优先使用
<script setup>
语法 - 合理使用 TypeScript 类型定义
- 遵循 Vue 3 和 Nuxt 3 风格指南
页面开发
- 利用文件系统路由
- 使用
<Head>
组件管理 SEO - 合理使用中间件
- 优化服务端渲染性能
样式开发
- 优先使用 Tailwind CSS 类
- 复杂样式使用 SCSS
- 保持组件样式的作用域
- 使用 CSS 变量进行主题定制
状态管理
- 使用 Pinia 进行状态管理
- 合理拆分 store
- 使用 TypeScript 定义 store 类型
- 避免在组件中直接修改状态
部署
静态部署
bash
# 生成静态站点
pnpm generate
# 部署到静态托管服务
# 如 Vercel、Netlify、GitHub Pages 等
服务端部署
bash
# 构建生产版本
pnpm build
# 启动生产服务器
pnpm preview
部署到 Vercel
Nuxt 应用可以轻松部署到 Vercel。详细的部署配置和步骤请参考 Vercel 部署指南。