# Nomo Web 基于 React + TypeScript + Vite 的 H5 前端项目。 ## 环境要求 - Node.js >= 18.20.7 - pnpm >= 9 ## 快速开始 ```bash pnpm install --frozen-lockfile pnpm dev ``` 浏览器访问控制台输出的本地地址即可。 ## 脚本说明 | 命令 | 说明 | |------|------| | `pnpm dev` | 本地开发(使用 `.env.localdev` + `.env`) | | `pnpm build` | 生产构建(等价于 `build:prod`) | | `pnpm build:dev` | 开发模式构建(`.env.development`) | | `pnpm build:prod` | 生产模式构建(`.env.production`) | | `pnpm build:test` | 测试环境构建(`.env.test`) | | `pnpm preview` | 预览构建产物(使用 localdev 模式) | | `pnpm lint` / `pnpm lint:fix` | ESLint 检查 / 自动修复 | | `pnpm stylelint` / `pnpm stylelint:fix` | 样式检查 / 自动修复 | ## 环境配置 通过不同 `.env` 文件区分环境,Vite 按 **mode** 加载: | 文件 | 何时加载 | |------|----------| | `.env` | 始终加载(公共默认) | | `.env.localdev` | `pnpm dev` / `pnpm preview`(`--mode localdev`) | | `.env.development` | `pnpm build:dev` | | `.env.production` | `pnpm build` / `pnpm build:prod` | | `.env.test` | `pnpm build:test` | | `.env.local` | 本地覆盖,除 test 外都会加载(一般不提交) | 需在环境文件中配置的变量见 `.env` 内注释或项目文档。 ## 技术栈 - **框架**:React 18、TypeScript - **构建**:Vite 6、pnpm - **UI**:Ant Design 5、Tailwind CSS、SCSS/Less - **路由**:React Router 7 - **状态**:基于 Context + Hooks 的 Model 方案(类 Umi max) - **国际化**:i18next(zh-CN / en-US / fa-IR) - **请求**:Axios 封装(`src/utils/request`) - **图标**:@iconify/react + 自定义 SVG 转 Iconify 插件 - **规范**:ESLint、Prettier、Stylelint、Commitlint、Husky、lint-staged ## 项目结构 ``` ├── build/ # Vite 构建相关(插件、工具) ├── public/ # 静态资源 ├── src/ │ ├── assets/ # 资源 │ │ └── iconify/ # 单色 single-color、多色 multi-color 图标 │ ├── components/ # 公共组件 │ ├── config/ # 应用与请求配置(含 request 拦截器、错误处理) │ ├── defines/ # 枚举与常量 │ ├── hooks/ # 公共 Hooks │ ├── i18n/ # 国际化配置 │ ├── layouts/ # 布局 │ ├── locales/ # 多语言文案(zh-CN、en-US、fa-IR) │ ├── models/ # 全局状态 Model │ ├── pages/ # 页面(按页面分目录) │ ├── router/ # 路由配置 │ ├── services/ # API 接口(按模块分目录) │ ├── styles/ # 全局样式 │ ├── utils/ # 工具与 request 封装 │ ├── App.tsx │ └── main.tsx ├── types/ # 全局类型与 env 类型 ├── index.html ├── vite.config.ts └── package.json ``` ## 开发规范摘要 - 严格 TypeScript,遵循项目 ESLint/Prettier 配置 - 提交信息使用 Conventional Commits - 组件:函数组件 + Hooks;样式优先 Tailwind,必要时 SCSS/Less - 用户可见文案全部走 `locales`,禁止在代码中硬编码 - 常量与枚举放在 `src/defines/`,请求在 `src/services/` 按模块组织 - 新页面:在 `src/pages/` 下建目录、在 `routes` 与 `locales` 中注册 ## 状态管理(Model) - Model 定义在 `src/models/`,通过 `createModel(hook, name)` 创建。 - 在组件中:`const user = userModel.useModel()`,使用返回的状态与方法。 - 根组件已通过 `autoImportModels` 注入所有 Model 的 Provider。 详见 `src/utils/model/` 与现有 `userModel`、`dialogModel`、`userConfigModel` 实现。 ## 图标 - 单色图标:放入 `src/assets/iconify/single-color/`,会转为 `currentColor`,可用 `className` 控制颜色。 - 多色图标:放入 `src/assets/iconify/multi-color/`,保留原色。 - 使用:`import icon from '@/assets/iconify/single-color/xxx.svg'`,再 ``(@iconify/react)。 ## 多语言 - 文案在 `src/locales/` 下按语言分目录(zh-CN、en-US、fa-IR),每语言含 common、components、menus、pages 等模块。 - 组件内:`const { t } = useTranslation();`,`t('key')` 或带命名空间的 key。 - 禁止在页面/组件中写死中文或英文字符串。 ## 请求与接口 - 请求封装:`src/utils/request`,基础配置与拦截器在 `src/config/request/`(认证、加解密、错误处理)。 - 接口按模块放在 `src/services/`,每模块可有 `typings.d.ts` + `index.ts`。 - 调用:`import { fetchXxx } from '@/services/xxx'`,错误由统一错误处理兜底,可选 `skipErrorHandler` 自行处理。 ## 本地存储 - `src/utils/localUtils`、`src/utils/sessionUtils` 提供 `createLocalTools` / `createSessionTools`,支持按 key/value 加密与命名空间。 - 通过环境变量配置加密密钥与存储命名空间,敏感数据建议开启加密选项。 ## 部署 - 构建产物在 `dist/`,将对应环境(如 test/production)的构建结果部署到静态服务器或 CDN 即可。 - 多环境通过上述 `build:dev` / `build:test` / `build:prod` 与对应 `.env.*` 区分。