基于 Nuxt 4 + Vue 3 构建的前端 SPA 应用,通过 API 与 Django Ninja 后端服务交互。
zhenxijs-fontend-vue/
├── .cnb.yml # CNB 构建配置
├── .env.example # 环境变量示例
├── .gitignore # Git 忽略文件
├── .install_claude.sh # Claude安装脚本
├── IFLOW.md # 项目流程文档
├── app.vue # 根组件
├── nuxt.config.ts # Nuxt 配置文件
├── package.json # 项目依赖配置
├── package-lock.json # 依赖锁定文件
├── performance-test.js # 性能测试脚本
├── README.md # 项目说明文档
├── seo-check.js # SEO 检测脚本
├── assets/ # 静态资源文件
│ ├── logo.svg # 项目 Logo
│ └── reset.css # 全局CSS重置
├── components/ # 公共组件
│ ├── PublicFooter.vue # 公共底部
│ ├── PublicHeader.vue # 公共头部
│ └── SearchBox.vue # 搜索框组件
├── composables/ # 组合式函数
│ └── useSearch.js # 搜索功能
├── markdow/ # 简单 Markdown 渲染器
│ ├── README.md # Markdown 渲染器说明
│ ├── components/ # 组件
│ │ └── ObsidianRenderer.vue
│ └── utils/ # 工具函数
│ └── obsidian-parser.ts
├── pages/ # 页面路由
│ ├── docs/ # 文档路由
│ │ ├── [...slug].vue # 动态文档路由
│ │ └── index.vue # 文档列表页面
│ ├── index.vue # 首页
│ ├── schema-demo.vue # Schema演示页面
│ └── seo-test.vue # SEO 测试页面
└── public/ # 静态文件
└── docs/ # Markdown文档
├── index.md
└── JavaScript教程.md
# 安装项目依赖
npm ci
# 或使用 npm install
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 预览构建结果
npm run preview
# 生成静态站点
npm run generate
# 运行 SEO 检测
npm run seo
环境变量配置
# .env
NUXT_PUBLIC_API_BASE=http://localhost:8000/api
API 客户端配置
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE || 'http://localhost:8000/api'
}
}
})
API 调用示例
<script setup>
const { data } = await $fetch('/users', {
baseURL: useRuntimeConfig().public.apiBase
})
</script>
构建后可部署到任何静态托管服务:
# 构建静态文件
npm run build
# 预览静态站点
npx serve .output/public
生成的静态文件可部署到:
项目内置完整的 SEO 优化:
<script setup>
useSeoMeta({
title: '页面标题 - 网站名称',
description: '详细的页面描述,包含关键词和核心信息',
keywords: 'Vue3, Nuxt4, Django, API, 关键词1, 关键词2',
author: 'ZhenxiJS',
robots: 'index,follow',
// Open Graph 标签
ogTitle: '社交媒体标题',
ogDescription: '社交媒体描述',
ogType: 'website',
ogUrl: '/page-url',
ogImage: '/og-image.jpg',
ogSiteName: '网站名称',
// Twitter Card 标签
twitterCard: 'summary_large_image',
twitterTitle: 'Twitter 标题',
twitterDescription: 'Twitter 描述',
twitterImage: '/twitter-image.jpg'
})
// 设置页面语言和其他属性
useHead({
htmlAttrs: {
lang: 'zh-CN'
},
meta: [
{ name: 'format-detection', content: 'telephone=no' },
{ name: 'theme-color', content: '#00DC82' }
]
})
</script>
# 运行 SEO 质量检测
npm run seo
# 检测内容包括:
# - 页面标题和描述
# - 关键词密度
# - 图片 alt 属性
# - 链接结构
# - 页面加载速度
export default defineNuxtConfig({
ssr: true, // 构建时预渲染 HTML(SSG 必需),生成包含完整内容的静态文件
nitro: {
preset: "static", // 静态文件生成模式
prerender: {
routes: ["/", "/about"] // 需要预渲染的页面路由
}
},
// 优化 SEO 和静态生成
experimental: {
payloadExtraction: false // 禁用 payload 提取,减少文件分割
},
// 减少 JavaScript 分割,提升 SEO
vite: {
build: {
rollupOptions: {
output: {
manualChunks: (id) => {
// 将所有代码打包到一个文件中,减少文件分割
if (id.includes('node_modules')) {
return 'vendor'
}
return 'main'
}
}
}
}
},
// 优化 HTML 输出
app: {
head: {
charset: 'utf-8',
viewport: 'width=device-width, initial-scale=1'
}
}
})
重要: 项目使用 SSG (静态站点生成) 模式,不是传统的 SSR:
ssr: true: 在构建时预渲染 HTML,生成包含完整内容的静态文件ssr: false: 生成 SPA 模式,HTML 中只有空的 <div>,内容需 JavaScript 渲染为什么需要 ssr: true:
最终产物: 纯静态文件 + Vue 交互功能,无需服务器运行。
本地开发
npm run dev # 启动前端开发服务器 (http://localhost:3000)
API 联调
http://localhost:8000构建部署
npm run generate # 推荐:生成优化的静态文件(SSG)
npm run build # 或者:标准构建
npm run seo # 检测页面 SEO 质量
| 命令 | 用途 | 输出 | 推荐场景 |
|---|---|---|---|
npm run generate | SSG 静态生成 | 完整预渲染的 HTML | 推荐,SEO 友好 |
npm run build | 标准构建 | 服务端渲染模式 | 需要服务器部署时 |
项目集成了基于文件系统的文档路由系统,可以轻松地通过 URL 访问 public/docs 目录下的 Markdown 文档。
public/docs/ → 页面路由
├── index.md → /docs 或 /docs/index
└── JavaScript教程.md → /docs/JavaScript教程
/docs - 文档列表页面,显示所有可用文档/docs/index - 渲染 public/docs/index.md 文件/docs/JavaScript教程 - 渲染 public/docs/JavaScript教程.md 文件/docs/任意路径 - 尝试渲染 public/docs/任意路径.md 文件public/docs 目录自动加载 .md 文件#标签 会被渲染为可点击元素/docs/docs/JavaScript教程#标签 触发标签点击事件#标签 语法,标签会被渲染为可点击的元素nofollow 属性[[文件名]] 会被视为普通文本如遇到 API 请求错误,请检查:
本地开发时的注意事项:
.env 文件配置静态部署时可能遇到的问题:
ISC License
欢迎提交 Issue 和 Pull Request 来改进项目。
项目用途: Django 后台前端页面生成
开发团队: ZhenxiJS
项目版本: 1.0.0
最后更新: 2025年8月