# mu-uniapp-vite
**Repository Path**: jfCodeSRM/mu-uniapp-vite
## Basic Information
- **Project Name**: mu-uniapp-vite
- **Description**: 这是一个极简的 uniapp + vite/4 + vue/3 项目模板。是为了响应个别开发者对项目有着"极致纯净 & 百搭"的需求而设计。因此项目中只提供"基础的 结构 和 开发依赖",并支持以命令的方式运行,以实现自动化部署的功能!
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2024-09-21
- **Last Updated**: 2024-09-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mu-uniapp-vite
## 项目介绍
这是一个极简的 uniapp + vite/4 + vue/3 项目模板。是为了响应个别开发者对项目有着`极致纯净 & 百搭`的需求而设计。因此项目中只提供`基础的 结构 和 开发依赖`,并支持以命令的方式运行,以实现自动化部署的功能!
## 开发环境
- Node.js 20.12.2
- npm 10.5.0
- yarn 1.22.19
- Vite 4.3.5
- Vue 3.3.11
- 更多参考:[package.json](package.json)
## 开始项目
- 安装上述开发环境(注意版本!!!)
- 命令行输入 `yarn` 安装依赖
- 命令行输入 `yarn dev:h5` 运行项目(默认运行 H5 端,如需运行其他端,请自行修改命令)
## 项目特点
- 基于 VUE3 开发,支持 `Composition API` 和 `Options API` 两种模式
- 支持 Vuex 持久化(项目已集成,使用方法下滑查看)
- 支持 路由拦截(项目已集成)
- CSS原子化(项目已集成,具体实现参考:[global.scss](static/scss/global.scss))
- HTTP请求接口封装(项目已集成,使用方法下滑查看)
- 支持命令行运行(支持自动化部署)
- 支持 ESLint & Prettier 代码规范(项目已集成,可自行更改规则)
- 全局 & 通用方法的封装(项目已集成示例,可能据需求自行添加,使用方法下滑查看)
## 注意
- 该项目目前只调试了 `H5` 端,`APP` 端和 `小程序` 端暂未调试,如果需要请自行调试!!!
- 例如 `小程序` 端,需要在 `manifest.json` 文件中配置 `mp-weixin` 等信息
- `global.scss` 中需要将 `*、ul、li` 等 `小程序` 中不支持的 `CSS选择器` 进行条件编译等操作
## 代码风格规范优先级
- 优先级A:必要的(项目开发中必须遵守的规则)
- 优先级B:强烈推荐(项目开发中尽可能的要遵守,保持代码风格的一致性,但并不会带来项目上的安全风险)
- 优先级C:推荐
- 优先级D:谨慎使用
## 代码风格规范(为减少开发负担只规定 A、B 优先级的规范)
| 说明 | 代码风格 | 优先级 | 示例 |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | :----: | :--------------------------------------------------------: |
| 组件命名 | 组件名为多个单词 | A | MyComponents |
| 组件的 data 属性 | 必须是一个函数并 return 一个对象 | A | data: ()=>{ return {} } |
| 组件的 props 属性 | 需要定义接收的类型 | A | props: { showStatus: String } |
| v-for | 必须绑定 key 属性,最好是唯一不变的值,如果没有也得绑定自带的 index 为值 | A |
|
| 组件设置样式作用域 | 组件的 style 标签必须设置作用域,APP根组件除外 | A | < style scoped > |
| 私有 property 名 | 在开发通用功能时,要保持非公开的 property 自由化,VUE3已经自动最大化的规避,特殊情况无法规避请添加 "$\_" 前缀,并附带命名空间 | A | const $\_my_property = XXX |
| 组件文件、注册、引用命名 | 除 `pages` 目录外的所有的单文件 `组件文件命名、引用、注册` 包括组件内的 `name` 命名,均使用大驼峰命名法,且至少两个单词 | B | MyComponents |
| 普通目录命名 | 蛇形命名法(横线拼接) | B | /apis/system-admin/ |
| 普通文件命名 | 蛇形命名法 | B | /user-login.js |
| 同业务组件命名 | 同业务或同页面下的组件,文件名命名时保持统一的前缀 | B | HomeHead、HomeBody、HomeFoot |
| 页面/组件目录命名 | 以业务为基准新建目录,词要达意,使用大驼峰命名法,过长使用使用首字母大写缩写 | B | Home、ShoppingMall、URLAdmin |
| 单文件组件中 name | 大驼峰命名法 | B | name: 'UserHome' |
| 单文件组件中 props | 小驼峰命名法 | B | props: { showStatus: String } |
| 单文件组件中 data,computed | 蛇形命名法(下划线拼接) | B | { name:xxx, user_age: 18 } |
| 单文件组件中 methods | 小驼峰命名法 | B | userLogin:function(){} |
| 单文件组件中 ref | 小驼峰命名法 | B | ref=userFrom |
| API中的接口命名 | 大驼峰命名法 | B | const UserLogin = async ()=>{} |
| 普通 变量 与 常量 | 蛇形命名法(下划线拼接) | B | let a_1 = 1, const b_2 = 2 |
| 普通 函数 命名 | 小驼峰命名法 | B | function userLogin(){} \|\| const userLogin = function(){} |
| 标签属性排序 | 除 `id、ref、key` 以外所有的 attr 均按照,指令 > 静态属性 > 动态属性 > 速记属性 > 绑定事件(按照 eslint 规则顺序) | B | v-if > class='' > :class='' > disabled > @click='' |
| 事件绑定 | 绑定事件如需接收回调或参数,则使用 `@event="funName"` 方式绑定,否则均使用 `@event=funName()` 方式绑定 | B | 接收参数:@click=funName,不接收参数:@click=funName() |
| 组件/实例内的选项顺序 | name > components > mixins > props > data > computed > watch > created(生命周期) > methods | B | -- |
## 项目目录(项目结构)
```text
|-- mu-uniapp-vite
|-- apis //api 集中管理目录
| |-- axios-api.js //api 配置文件(用于导入接口)
| |-- axios-config.js //api 配置文件(用于配置Axios)
| |-- main //api - 业务目录,api以业务为基础作为目录
| |-- system.js //api 文件(其中包含 API 方法)
|-- components //业务组件的根目录
| |-- Home //业务组件目录,建议根据业务命名,且与【页面组件】目录名称保持同步(仅包含关系)
| | |-- IndexText.vue //业务模块组件(请使用大驼峰命名法)
|-- pages //页面组件的根目录
| |-- Common //页面组件目录,建议根据业务命名,且与【业务组件】目录名称保持同步(仅包含关系)
| | |-- CountNumber.vue //页面组件(请使用大驼峰命名法)
|-- static //静态资源根目录
| |-- scss //用于存放所有 Scss 文件
| | |-- global.scss //用于定义全局的样式,在 App.vue 中引入
| |-- images //用于存放所有图片文件
|-- store //vuex 根目录
| |-- index.js //vuex 配置文件
| |-- mixin.js //vuex 混入配置文件
| |-- mixin-config.js //vuex 配置混入到所有实例的 state
| |-- persistence.js //vuex 配置持久化的文件,将需要持久化的 key 存放到导出数组中
| |-- modules //vuex 模块目录
| |-- global.js //vuex 模块文件
|-- uni_modules //用于存放【第三方成品组件、插件】的目录
|-- utils //用于存放【工具函数/全局配置】的目录
|-- app-config.js //应用的全局配置项
|-- common.js //业务共通方法,将可能多个组件复用的逻辑抽离到此处
|-- global.js //项目全局方法
|-- interceptor.js //拦截器的配置
|-- .env //全局环境变量配置文件
|-- .eslintignore //eslint 配置文件,排除的文件夹
|-- .eslintrc.js //selint 配置文件
|-- .gitignore //git 配置文件,排除的文件夹
|-- .prettierignore //prettier 配置文件,排除的文件夹
|-- .prettierrc.js //prettier 配置文件
|-- App.vue //项目跟组件,用于应用配置,用来配置App全局样式以及监听。不用来写业务
|-- index.html //单页面项目入口文件,HTML入口文件,用于引入一些项目依赖等
|-- main.js //单页面项目入口文件,JS入口文件,用户配置项目依赖等项目配置
|-- manifest.json //uniapp 配置文件
|-- package.json //项目配置文件
|-- pages.json //uniapp 页面配置文件
|-- README.md //项目描述文件
|-- uni.scss //uniapp 全局 Scss 文件,请谨记这个文件会被自动打包到每个组件中,所以请不要在此定义全局样式,推荐这个文件只定义一些全局变量即可。
|-- vite.config.js //vite 配置文件
|-- yarn.lock //yarn 项目依赖锁,用于保证再多人开发的情况下,大家的项目依赖版本保持一致
```
## CSS原子化
- 项目中集成了 `flex、margin、padding` 三种布局类的原子化样式
- 布局类原子化类名构成:`前缀-类型[方向]-数值`,例如:`m-ma-auto、m-pl-100`,其中 `m` 是前缀,`ma` 是类型,`auto || 10` 是数值
- 支持 !important 加权重,可以在类后拼接 `__i`,例如:`u-flex__i`
- 支持列表:
`m-ma-*`、 `m-ml-*`、 `m-mr-*`、 `m-mt-*`、 `m-mb-*`、
`m-pa-*`、 `m-pl-*`、 `m-pr-*`、 `m-pt-*`、 `m-pb-*`、
`m-flex-*`、 `m-flex`、 `m-flex-column`、 `m-flex-wrap`、 `m-flex-nowrap`、 `m-col-top`、 `m-col-center`、 `m-col-bottom`、 `m-col-baseline`、 `m-col-stretch`、 `m-row-left`、 `m-row-center`、 `m-row-right`、 `m-row-between`、`m-row-around`
## Vuex实现数据的持久化 与 数据混入到全局实例
### Vuex实现数据持久化
1. 第一步,将需要持久化的数据存放在【指定】模块 `state` 中,例如:`/store/modules/global.js`
2. 第二步,将需要持久化的数据的 `key` 配置到 `/store/persistence.js` 文件中。注意配置的`key` 需要与第一步中存放在 `state` 中的 `key` 一致
### Vuex实现将 state 混入到全局实例
- 将需要混入的 `state` 配置到 `/store/mixin-config.js` 文件中即可,写法如下
```javascript
export default {
//全模块混入
global: 'global',
//混入指定的数据
vuex_token: state => state.global.vuex_token
};
```
## 全局 & 通用方法的封装
### 全局方法
全局方法指的是将方法挂载到Vue实例上,方便在各个组件中调用, 具体方式参考 `/utils/global.js` 文件
### 通用方法
通用方法指的是将多个页面都能用到的方法抽离出来,同意进行维护,在使用的时候使用 import 引入即可,具体方式参考 `/utils/common.js` 文件
## 请求的处理
### 封装请求
- 所有的请求均存放在 `/apis` 文件夹中
- 根据业务创建子文件夹,命名与业务名称一致 或 API 路径一致,例如:`/main`
- 创建对应业务的请求文件,例如:`system.js`
- 最后在 `/apis/axios-api.js` 中进行引入并挂载到全局 `$apis` 中
- Tips:在定义API时,按照模板把注释写完整
```javascript
/* system.js */
/***
* 用户登录
* @params {Object} param={account,password} 用于请求的参数
* @return {Promise} 返回一个Promise对象
**/
const Login = async param => Axios.post('/main/login', param);
/* axios.api.js */
//导入通用接口
import system from './main/system';
// 挂载到全局
Vue.config.globalProperties.$apis = { ...system };
```
### 执行请求
- 请求方法定义在 `methods` 中
- Tips: `try、catch` 是必须有的结构,`finally` 为可选项,根据具体代码进行选择
```javascript
/* template */
登录
/* script */
login: async function () {
//验证参数合法性
await this.$refs.loginForm.validate();
//定义参数
const params = {
account: this.login_form.account,
password: this.login_form.password
};
//处理请求
try {
//请求前的处理
uni.showLoading({ title: '登录中...' });
//发送请求
const res = await this.$apis.Login(params);
//响应后的处理
console.log(res);
} catch (e) {
//错误处理
console.error(e);
uni.hideLoading();
}
}
```
## 项目中的注释的使用
- ※ 开发项目时,请按照规定将注释写完整,方便他人理解
- 组件/实例中,`template、script、style` 三个部分的内容均要书写注释
- template 的注释用于快速了解组件结构
- script 的注释用于了解项目逻辑
- style 的注释用于区别组件库样式和自定义样式
### template 注释的应用
```javascript
```
### script 注释的应用
```javascript
```
### style 注释的应用
```javascript