基于 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月