# Uni-App-X 工程化最佳实践 ## 📚 概述 本文档介绍了 mall 项目的工程化实践,包括项目结构、开发流程、构建配置、代码规范等内容,参考 CRMEB 的工程化标准。 --- ## 1. 项目结构 ### 1.1 推荐目录结构 ``` mall/ ├── ai/ # AI 相关配置 ├── components/ │ ├── analytics/ # 分析组件 │ ├── basic/ # ✨ 基础组件 (新增) │ │ ├── Button.uvue │ │ ├── Input.uvue │ │ ├── Select.uvue │ │ ├── Checkbox.uvue │ │ ├── Radio.uvue │ │ ├── Toggle.uvue │ │ └── DatePicker.uvue │ ├── container/ # ✨ 容器组件 (新增) │ │ ├── Card.uvue │ │ ├── Modal.uvue │ │ ├── Drawer.uvue │ │ ├── Collapse.uvue │ │ ├── Tabs.uvue │ │ └── Pagination.uvue │ ├── data/ # ✨ 数据展示组件 (新增) │ │ ├── Table.uvue │ │ ├── List.uvue │ │ ├── Tree.uvue │ │ ├── Tag.uvue │ │ ├── Badge.uvue │ │ └── Avatar.uvue │ ├── form/ # ✨ 表单组件 (新增) │ │ ├── Form.uvue │ │ ├── FormItem.uvue │ │ ├── FormGroup.uvue │ │ ├── Upload.uvue │ │ └── RichEditor.uvue │ ├── feedback/ # ✨ 反馈组件 (新增) │ │ ├── Message.uvue │ │ ├── Alert.uvue │ │ ├── Tooltip.uvue │ │ ├── Loading.uvue │ │ ├── Empty.uvue │ │ └── Error.uvue │ ├── navigation/ # ✨ 导航组件 (新增) │ │ ├── Breadcrumb.uvue │ │ ├── Menu.uvue │ │ ├── Navbar.uvue │ │ └── Sidebar.uvue │ ├── supadb/ # 数据库组件 │ └── ... ├── docs/ │ ├── STYLE_SPECIFICATION.md # ✨ 样式规范 │ ├── PAGE_STRUCTURE_SPECIFICATION.md # ✨ 页面结构规范 │ ├── COMPONENT_SPECIFICATION.md # ✨ 组件规范 │ ├── IMPLEMENTATION_ROADMAP.md # ✨ 实现路线图 │ ├── ENGINEERING_BEST_PRACTICES.md # ✨ 工程化最佳实践 │ └── ... ├── layouts/ │ ├── admin/ │ │ ├── AdminLayout.uvue # 增强版 │ │ └── utils/ │ │ ├── menu.uts │ │ ├── nav.uts │ │ └── state.uts │ └── ... ├── pages/ │ ├── templates/ # ✨ 页面模板 (新增) │ │ ├── ListPage.uvue │ │ ├── FormPage.uvue │ │ └── DetailPage.uvue │ ├── mall/ │ │ ├── admin/ │ │ │ ├── maintain/ │ │ │ │ └── system-info.uvue │ │ │ └── ... │ │ └── ... │ └── ... ├── styles/ # ✨ 全局样式 (优化) │ ├── common.scss # 通用样式 │ ├── utilities.scss # 工具类 │ └── variables.scss # 变量(引用 uni.scss) ├── uni_modules/ │ ├── ak-req/ │ ├── charts/ │ └── ... ├── utils/ │ ├── request.uts # 网络请求 │ ├── store.uts # 状态管理 │ ├── validators.uts # ✨ 验证器工具 │ ├── format.uts # ✨ 格式化工具 │ └── ... ├── uni.scss # ✨ 设计变量系统 (已更新) ├── App.uvue ├── main.js ├── main.uts ├── manifest.json ├── package.json ├── tsconfig.json ├── pages.json ├── platformConfig.json └── README.md ``` ### 1.2 新增目录说明 | 目录 | 用途 | 说明 | | ------------------------ | -------- | ------------------------------ | | `components/basic/` | 基础组件 | Button, Input, Select 等 | | `components/container/` | 容器组件 | Card, Modal, Pagination 等 | | `components/data/` | 数据展示 | Table, List, Tree 等 | | `components/form/` | 表单组件 | Form, FormItem, Upload 等 | | `components/feedback/` | 反馈组件 | Message, Alert, Loading 等 | | `components/navigation/` | 导航组件 | Breadcrumb, Menu, Navbar 等 | | `pages/templates/` | 页面模板 | ListPage, FormPage, DetailPage | | `styles/` | 全局样式 | 共享样式和工具类 | --- ## 2. 开发规范 ### 2.1 文件命名规范 | 类型 | 规范 | 示例 | | -------- | ------------------ | ---------------------------------- | | 组件文件 | PascalCase | `Button.uvue`, `FormItem.uvue` | | 业务页面 | kebab-case | `system-info.uvue` | | 工具脚本 | camelCase + .uts | `validators.uts`, `formatters.uts` | | 样式文件 | kebab-case + .scss | `common.scss`, `utilities.scss` | | 配置文件 | camelCase + .uts | `config.uts` | | 常量文件 | UPPER_SNAKE_CASE | `CONSTANTS.uts` | ### 2.2 导入规范 ```typescript // ✅ 正确用法 // 1. 组件导入 import Button from '@/components/basic/Button.uvue' import Card from '@/components/container/Card.uvue' import Table from '@/components/data/Table.uvue' // 2. 工具导入 import { validateEmail, validatePhone } from '@/utils/validators.uts' import { formatDate, formatTime } from '@/utils/format.uts' // 3. 类型导入 (UTS) import type { MenuConfig } from '@/types/mall-types.uts' // 4. 样式导入 import '@/styles/common.scss' // ❌ 错误用法 // 不要使用相对路径 import Button from '../../../components/basic/Button.uvue' // ❌ // 不要混乱地导入 import * from '@/components/basic/Button.uvue' // ❌ // 不要导入 node_modules 中的代码(除非必要) import { ref } from 'vue' // 这是可以的,但应该在文件顶部 ``` ### 2.3 TypeScript 规范 虽然使用 UTS(Uni-App TypeScript),但也遵循 TypeScript 最佳实践: ```typescript // ✅ 正确用法 // 1. 定义类型接口 interface ButtonProps { type?: "primary" | "default" | "danger"; size?: "sm" | "md" | "lg"; label: string; disabled?: boolean; loading?: boolean; } // 2. 使用类型标注 const props = withDefaults(defineProps(), { type: "primary", size: "md", disabled: false, loading: false, }); // 3. 定义事件类型 const emit = defineEmits<{ click: []; change: [value: string]; submit: [formData: Record]; }>(); // 4. 使用类型断言(谨慎) const element = event.target as HTMLInputElement; // ❌ 错误用法 // 不要使用 any 类型 const data: any = { // ❌ name: "test", }; // 不要忽略类型检查 const props = defineProps({ // ❌ 无类型定义 label: String, }); // 不要过度使用 as const value = data as unknown as string as number; // ❌ ``` ### 2.4 代码注释规范 ```typescript // ✅ 正确用法 /** * Button 组件 * 支持多种类型、尺寸和状态 * * @example *