213 lines
14 KiB
Markdown
213 lines
14 KiB
Markdown
---
|
||
title: Nuxt3 代码规范
|
||
description: 这是一份提供给AI大模型的Nuxt3框架规范、编程标准,可以有效提高Cursor等大模型对Nuxt.js框架的编写能力。
|
||
date: 2025-07-12
|
||
img: https://lijue-me.oss-cn-chengdu.aliyuncs.com/20250624125918171.png
|
||
navigation:
|
||
icon: simple-icons:nuxtdotjs
|
||
---
|
||
## 概述
|
||
这是一份提供给AI大模型的Nuxt3框架规范、编程标准,可以有效提高Cursor等大模型对Nuxt.js框架的编写能力。
|
||
|
||
---
|
||
description: 本规则为 Nuxt.js 项目提供全面的最佳实践和编码标准,涵盖代码组织、性能、安全性、测试和常见陷阱。旨在确保 Nuxt.js 应用程序的可维护性、可扩展性和安全性。
|
||
globs: *.vue,*.js,*.ts,*.mjs,*.mts,*.jsx,*.tsx,*.config.js,*.config.ts
|
||
---
|
||
|
||
- **启用 ESLint 支持:** 使用 `@nuxt/eslint` 模块来配置项目感知的 ESLint。这确保代码质量和一致性。
|
||
- 运行 `npx nuxi module add eslint` 添加模块。
|
||
- 根据需要自定义生成的 `eslint.config.mjs` 文件。
|
||
- **采用 Nuxt.js 模块:** 利用 Nuxt.js 模块来封装功能并维护干净的代码库。在实现自定义解决方案之前先探索现有模块(例如,用于服务端身份验证的 `@nuxt/auth`)。
|
||
- **约定优于配置:** 遵循 Nuxt.js 约定来简化开发和协作。除非绝对必要,否则避免偏离约定。
|
||
- **高效利用 Nuxt 布局:** 为多个页面共享的组件创建可重用布局,以确保一致性并节省开发时间。布局位于 `layouts/` 目录中。
|
||
- **使用 Pinja 管理状态:** 使用 Pinia 进行状态管理。根据功能或特性组织 store 模块,以提高可维护性。
|
||
- **将页面分解为组件:** 将页面分解为小的、可重用的组件,以增强可维护性、可测试性和可重用性。每个组件都应该有单一责任。
|
||
- **明智地利用 Nuxt 插件:** 使用 Nuxt 插件在 Vue.js 初始化之前运行代码或添加全局功能。注意插件对性能的影响。插件位于 `plugins/` 目录中。
|
||
- **针对 SEO 和性能进行优化:** 利用 Nuxt.js 的服务端渲染 (SSR) 来优化 SEO。为图片实现懒加载并优化资源以最小化初始加载时间。使用 Lighthouse 等工具识别性能瓶颈。
|
||
- **实现错误处理和验证:** 实现强大的错误处理和验证机制,以提供无缝的用户体验。使用 Nuxt.js 中间件拦截请求和响应进行错误处理和数据验证。
|
||
- **为代码编写文档:** 使用 JSDoc 等工具为组件、模块和自定义函数提供清晰简洁的文档。
|
||
- **拥抱测试:** 使用 Jest、Vue Test Utils 和 Vitest 等工具编写单元测试、集成测试和端到端测试。
|
||
|
||
## 1. 代码组织和结构:
|
||
|
||
- **目录结构:**
|
||
- `components/`:可重用的 Vue 组件。
|
||
- `composables/`:可重用的组合式函数。
|
||
- `layouts/`:应用程序布局。
|
||
- `middleware/`:路由中间件。
|
||
- `pages/`:应用程序页面(路由定义)。
|
||
- `plugins/`:Nuxt.js 插件。
|
||
- `server/`:API 路由和服务端逻辑。
|
||
- `static/`:静态资源(例如,图片、字体)。
|
||
- `store/`:Pinia stores(可选,但推荐)。
|
||
- `utils/`:工具函数。
|
||
- **文件命名约定:**
|
||
- 组件:`PascalCase.vue`(例如,`MyComponent.vue`)
|
||
- 组合式函数:`usePascalCase.js` 或 `usePascalCase.ts`(例如,`useCounter.js`)
|
||
- 布局:`kebab-case.vue`(例如,`default.vue` 或 `custom-layout.vue`)
|
||
- 页面:`kebab-case.vue`(例如,`index.vue`、`about.vue`、`product-details.vue`)
|
||
- 插件:`kebab-case.js` 或 `kebab-case.ts`(例如,`analytics.js`)
|
||
- Stores:`kebab-case.js` 或 `kebab-case.ts`(例如,`user-store.js`)
|
||
- 工具函数:`camelCase.js` 或 `camelCase.ts`(例如,`formatDate.js`)
|
||
- **模块组织:**
|
||
- 将相关功能分组到单独的模块中。
|
||
- 在 `nuxt.config.js` 或 `nuxt.config.ts` 中使用 `@nuxt/modules` 数组注册模块。
|
||
- 创建自定义模块来封装复杂逻辑。
|
||
- **组件架构:**
|
||
- 优先使用组合而非继承。
|
||
- 对简单的 UI 元素使用函数式组件。
|
||
- 设计组件时考虑可重用性和可测试性。
|
||
- 考虑使用插槽进行灵活的组件组合。
|
||
- **代码分割:**
|
||
- 利用动态导入进行基于路由的代码分割。
|
||
- 使用 `import()` 将大组件分割成更小的块。
|
||
- 使用 Webpack Bundle Analyzer 等工具分析包大小。
|
||
|
||
## 2. 常见模式和反模式:
|
||
|
||
- **设计模式:**
|
||
- **组合式 API:** 使用组合式 API 来组织组件逻辑。
|
||
- **Store 模式 (Pinia):** 使用 Pinia 实现集中式状态管理系统。
|
||
- **中间件模式:** 使用中间件进行身份验证、授权和数据验证。
|
||
- **插件模式:** 为全局功能和第三方库集成创建插件。
|
||
- **推荐方法:**
|
||
- **API 通信:** 在组件内使用 `useFetch` 或 `useAsyncData` 组合式函数进行 API 调用。
|
||
- **表单处理:** 利用 Vue 的内置表单处理功能与 `v-model` 和像 VeeValidate 这样的验证库。
|
||
- **身份验证:** 使用 `@nuxt/auth` 库或自定义解决方案实现安全的身份验证流程。
|
||
- **授权:** 使用中间件和 Pinia stores 实现基于角色的访问控制 (RBAC)。
|
||
- **反模式:**
|
||
- **直接修改 props:** 避免从子组件直接修改父组件数据。请使用 `emit` 代替。
|
||
- **过度使用全局状态:** 将全局状态的使用限制在必要的应用程序数据上。对本地数据考虑使用组件级状态。
|
||
- **忽略错误处理:** 始终处理 API 调用和其他异步操作中的潜在错误。
|
||
- **编写过于复杂的组件:** 将大组件分解为更小、更易管理的部分。
|
||
- **状态管理最佳实践:**
|
||
- **单一数据源:** 在 Pinia stores 中为应用程序状态维护单一、一致的数据源。
|
||
- **不可变性:** 将状态视为不可变的。使用函数来更新 store 而不是直接操作数据。
|
||
- **清晰的命名约定:** 为 store 模块、actions 和 mutations 使用描述性名称。
|
||
- **模块化:** 根据功能或特性将 stores 分成模块。
|
||
- **错误处理模式:**
|
||
- **集中式错误处理:** 实现全局错误处理器来捕获未处理的异常。
|
||
- **错误边界:** 使用错误边界来隔离组件故障并防止级联错误。
|
||
- **用户友好的错误消息:** 为用户提供清晰和有用的错误消息。
|
||
|
||
## 3. 性能考虑:
|
||
|
||
- **优化技术:**
|
||
- **懒加载:** 为图片、组件和路由实现懒加载。
|
||
- **代码分割:** 将应用程序分割成更小的块以获得更快的初始加载时间。
|
||
- **Tree Shaking:** 在构建过程中删除未使用的代码。
|
||
- **缓存:** 缓存 API 响应和静态资源以减少服务器负载。
|
||
- **图片优化:** 使用 `nuxt/image` 等工具优化图片。使用适当的图片格式(WebP)。将图片大小调整为适当大小。考虑使用 CDN 进行图片交付。
|
||
- **内存管理:**
|
||
- **避免内存泄漏:** 在组件卸载时清理事件监听器和定时器。
|
||
- **使用弱引用:** 在可能的情况下对 DOM 元素使用弱引用。
|
||
- **最小化对象创建:** 避免创建不必要的对象和数组。
|
||
- **渲染优化:**
|
||
- **虚拟化:** 对大列表使用虚拟化以提高渲染性能。
|
||
- **记忆化:** 记忆化昂贵的计算以避免冗余计算。有效使用 `computed` 属性以避免不必要的重新渲染。
|
||
- **防抖和节流:** 对事件处理器使用防抖和节流以减少函数调用次数。
|
||
- **包大小优化:**
|
||
- **分析包大小:** 使用 Webpack Bundle Analyzer 识别大依赖项。
|
||
- **删除未使用的依赖项:** 删除未使用的依赖项以减少包大小。
|
||
- **使用更小的替代方案:** 考虑使用更小的替代方案来替代大型库。
|
||
- **优化依赖项:** 检查依赖项并确保您使用的是最高效的版本。
|
||
- **懒加载策略:**
|
||
- **基于路由的懒加载:** 仅在访问相应路由时加载组件。
|
||
- **基于组件的懒加载:** 仅在组件在视口中可见时加载组件。
|
||
|
||
## 4. 安全最佳实践:
|
||
|
||
- **常见漏洞:**
|
||
- **跨站脚本攻击 (XSS):** 通过正确清理用户输入和使用 Vue 的内置 HTML 转义来防止 XSS 攻击。
|
||
- **跨站请求伪造 (CSRF):** 通过实现 CSRF 令牌来防止 CSRF 攻击。
|
||
- **SQL 注入:** 避免原始 SQL 查询。使用 ORM(对象关系映射器)来防止 SQL 注入。
|
||
- **身份验证和授权缺陷:** 实现安全的身份验证和授权机制。
|
||
- **不安全的直接对象引用 (IDOR):** 实现适当的访问控制以防止对资源的未授权访问。
|
||
- **输入验证:**
|
||
- **服务端验证:** 始终在服务端验证用户输入。
|
||
- **客户端验证:** 提供客户端验证以获得更好的用户体验(但不要依赖它作为验证的唯一来源)。
|
||
- **清理输入:** 清理用户输入以删除潜在的有害字符。
|
||
- **身份验证和授权模式:**
|
||
- **JWT(JSON Web Tokens):** 使用 JWT 进行身份验证和授权。
|
||
- **OAuth 2.0:** 为第三方身份验证实现 OAuth 2.0。
|
||
- **基于角色的访问控制 (RBAC):** 实现 RBAC 来根据用户角色控制对资源的访问。
|
||
- **数据保护策略:**
|
||
- **加密:** 对静态和传输中的敏感数据进行加密。
|
||
- **散列:** 使用强散列算法对密码和其他敏感数据进行散列。
|
||
- **数据屏蔽:** 在日志和其他非生产环境中屏蔽敏感数据。
|
||
- **安全的 API 通信:**
|
||
- **HTTPS:** 始终使用 HTTPS 进行 API 通信。
|
||
- **API 速率限制:** 实现 API 速率限制以防止滥用。
|
||
- **身份验证和授权:** 对所有 API 端点要求身份验证和授权。
|
||
|
||
## 5. 测试方法:
|
||
|
||
- **单元测试:**
|
||
- **测试单个组件:** 孤立地测试单个组件。
|
||
- **模拟依赖项:** 模拟外部依赖项以在测试期间隔离组件。
|
||
- **验证组件行为:** 验证组件正确渲染并按预期行为。
|
||
- **集成测试:**
|
||
- **测试组件交互:** 测试组件之间的交互。
|
||
- **测试数据流:** 测试组件和 stores 之间的数据流。
|
||
- **测试 API 集成:** 测试与外部 API 的集成。
|
||
- **端到端测试:**
|
||
- **模拟用户交互:** 模拟用户交互以测试应用程序的功能。
|
||
- **测试整个应用程序流程:** 从头到尾测试整个应用程序流程。
|
||
- **使用浏览器自动化工具:** 使用 Cypress 或 Playwright 等浏览器自动化工具。
|
||
- **测试组织:**
|
||
- **按功能组织测试:** 按功能或特性组织测试。
|
||
- **使用描述性测试名称:** 使用描述性测试名称来清楚地说明每个测试正在测试什么。
|
||
- **保持测试隔离:** 保持测试彼此隔离以避免干扰。
|
||
- **模拟和存根:**
|
||
- **使用模拟对象:** 使用模拟对象在测试期间替换外部依赖项。
|
||
- **使用存根:** 使用存根用简化版本替换复杂函数。
|
||
- **避免过度模拟:** 避免模拟太多代码,因为这会使测试效果降低。
|
||
|
||
## 6. 常见陷阱和注意事项:
|
||
|
||
- **常见错误:**
|
||
- **错误的 `this` 上下文:** 注意 Vue 组件中的 `this` 上下文,使用箭头函数或 `bind` 来维护正确的上下文。
|
||
- **异步数据处理:** 使用 `async/await` 或 Promises 正确处理异步数据加载。
|
||
- **忘记取消订阅:** 在组件卸载时取消订阅事件监听器和定时器以防止内存泄漏。
|
||
- **过度使用 `forceUpdate`:** 除非绝对必要,否则避免使用 `forceUpdate`,因为它会对性能产生负面影响。
|
||
- **边缘情况:**
|
||
- **服务端渲染 (SSR):** 了解客户端和服务端渲染之间的差异。
|
||
- **浏览器兼容性:** 在不同浏览器中测试应用程序以确保兼容性。
|
||
- **可访问性:** 在设计和开发应用程序时考虑可访问性。
|
||
- **版本特定问题:**
|
||
- **Nuxt 2 vs Nuxt 3:** 了解 Nuxt 2 和 Nuxt 3 之间的差异。
|
||
- **Vue 2 vs Vue 3:** 了解 Vue 2 和 Vue 3 之间的差异。
|
||
- **依赖项更新:** 仔细检查依赖项更新是否存在潜在的破坏性更改。
|
||
- **兼容性问题:**
|
||
- **浏览器支持:** 确保与目标浏览器兼容。
|
||
- **设备兼容性:** 在不同设备上测试应用程序。
|
||
- **操作系统兼容性:** 确保与目标操作系统兼容。
|
||
- **调试策略:**
|
||
- **使用浏览器开发者工具:** 使用浏览器开发者工具检查应用程序的状态和网络活动。
|
||
- **使用 Vue Devtools:** 使用 Vue Devtools 检查 Vue 组件和数据。
|
||
- **使用日志记录:** 使用日志记录来跟踪应用程序的行为。
|
||
|
||
## 7. 工具和环境:
|
||
|
||
- **推荐的开发工具:**
|
||
- **VS Code:** Visual Studio Code 是一个流行的代码编辑器,具有出色的 Vue.js 支持。
|
||
- **Vue Devtools:** Vue Devtools 是一个浏览器扩展,为 Vue.js 应用程序提供调试工具。
|
||
- **ESLint:** ESLint 是一个强制执行编码标准的代码检查器。
|
||
- **Prettier:** Prettier 是一个自动格式化代码的代码格式化器。
|
||
- **构建配置:**
|
||
- **`nuxt.config.js` 或 `nuxt.config.ts`:** 在 `nuxt.config.js` 或 `nuxt.config.ts` 中配置应用程序的构建设置。
|
||
- **Webpack:** Nuxt 使用 Webpack 来打包应用程序。
|
||
- **Vite:** Nuxt 3 默认使用 Vite 来打包应用程序,提供更快的构建和开发时间。
|
||
- **代码检查和格式化:**
|
||
- **ESLint:** 使用 ESLint 强制执行编码标准。
|
||
- **Prettier:** 使用 Prettier 自动格式化代码。
|
||
- **Husky:** 使用 Husky 在提交前运行代码检查器和格式化器。
|
||
- **部署最佳实践:**
|
||
- **服务端渲染 (SSR):** 将应用程序部署到支持 SSR 的服务器。
|
||
- **静态站点生成 (SSG):** 为内容丰富的应用程序生成静态站点。
|
||
- **CDN:** 使用 CDN 交付静态资源。
|
||
- **CI/CD 集成:**
|
||
- **持续集成 (CI):** 使用 Jenkins、GitLab CI 或 GitHub Actions 等 CI 工具自动化构建和测试过程。
|
||
- **持续部署 (CD):** 使用 CD 工具自动化部署过程。
|
||
|
||
通过遵循这些最佳实践,您可以构建强健、可维护且可扩展的 Nuxt.js 应用程序。 |