# 代码规范 - [代码规范](#代码规范) - [规范可提出异议](#规范可提出异议) - [解决所有警告和错误](#解决所有警告和错误) - [git 使用规范](#git-使用规范) - [检查提交的每行代码](#检查提交的每行代码) - [避免生成菱形合并记录](#避免生成菱形合并记录) - [公共组件和服务](#公共组件和服务) - [组件文件](#组件文件) - [命名规范](#命名规范) - [文件命名](#文件命名) - [组件命名](#组件命名) - [路由命名](#路由命名) - [localStorage 键值命名](#localstorage-键值命名) - [filter 命名](#filter-命名) - [service 命名](#service-命名) - [自定义事件命名](#自定义事件命名) - [slot 命名](#slot-命名) - [组件样式](#组件样式) - [class 命名](#class-命名) - [设计资源](#设计资源) - [例外](#例外) - [内联样式](#内联样式) - [例外](#例外-1) - [请求后台数据](#请求后台数据) - [导入 axios](#导入-axios) - [相对路径](#相对路径) - [Vuex](#vuex) - [避免滥用](#避免滥用) - [模块化](#模块化) - [其他](#其他) ## 规范可提出异议 所有规范都是为了保证代码质量、提高协作效率 如果对哪条规范有疑问或者不同意见,可以随时提出 ## 解决所有警告和错误 项目内置了多种代码检查的规则,提交到 git 前需要解决所有警告和错误 ## git 使用规范 ### 检查提交的每行代码 为了避免将调试代码、实验性代码、误操作修改的代码等提交到 git,需要在提交前通过自带的代码对比功能,检查每一处代码的修改是否为本次功能所必须的。 ### 避免生成菱形合并记录 如果每次拉取代码使用 pull+merge 模式的话,后续提交时会出现多个父节点的菱形合并记录,造成团队其他成员查看修改记录的不便 所以拉取代码时应该使用 rebase 模式,详细信息可参考[简单对比 git pull 和 git pull --rebase 的使用](https://juejin.im/entry/5b19fef2e51d4506a81b6078) ## 公共组件和服务 common 目录下的内容是各模块公用的,所以不要直接修改 现有组件、服务不满足需求的,可以提需求单,由专人统一修改 在模块开发过程中,如果发现一些功能应该提炼为公共部分,也可以提需求单 ## 组件文件 请保持[使用模板创建](../../README.md#快速新建组件)时生成的文件结构 将请求/整理后台数据的部分放到独立的 service 中 便于后期项目单独覆盖某一项 ## 命名规范 ### 文件命名 采用 `kebab-case` 格式,例如 `sd-nav-menu.js` 避免 linux 系统下文件名大小写的问题 ### 组件命名 平台组件(包括通用组件、router-view 中的页面)以 `Sd` 开头,例如 `SdNavMenu` 增加 `Sd` 前缀一方面是避免与 HTML 未来新增的元素名冲突 另一方面是避免与后续产品和项目定制的组件名冲突 [使用模板创建](../../README.md#快速新建组件)时会自动处理这些命名问题,按提示操作即可 ### 路由命名 路由中的 path 和 name 都需要以 `sd-` 开头,例如 `/sd-login` 避免与后续产品和项目定制的组件名冲突 ### localStorage 键值命名 请通过 sdLocalStorage 服务存取数据,例如 `sdLocalStorage.setItem(key, value)` 会自动增加 `sd-` 前缀,避免和产品项目的重名问题,后续会添加 `xmLocalStorage` 供项目使用 ### filter 命名 全局注册的 filter 文件名需要以 `sd-` 开头,避免和产品项目的重名问题 并放到 common/filters 目录下,会被自动注册为全局 filter 局部注册的 filter 命名无特殊要求 ### service 命名 由于 service 并非全局注册,通过 ES module 可以很好的处理重名问题 所以 servcie 无需特殊前缀。例如 `eventBus`、`routerService` ### 自定义事件命名 在 Vue 规范中要求时间名采用 `row-clcik` 格式,但为了和 ant-design-vue 保持一致,我们要求使用 `rowClick` 格式 ### slot 命名 使用 `kebab-case` 格式 ## 组件样式 样式使用 scss 文件,并启用 CSS Module ### class 命名 class 命名时直接使用其语义命名即可,如 `.logo`,无需增加其他组件相关的前缀 编译后会自动追加组件名和模块名,如 `.logo_sd-frame_workbench` ### 设计资源 禁止在 scss 中直接写色值、字号等,要从已有变量中读取。以便于后续更换主题时样式保持一致。例如: ```scss .wrapper { // 文字颜色设置为“反色文字(黑底白字)”(不能直接写white) color: $text-color-inverse; // 背景色设置为主题色(不能直接写#1DA57A) background: $primary-color; } ``` 所有变量位于 `src_custom/design/index.scss`,需要时可以从中查找适合的变量 此文件组件模板已默认导入 #### 例外 假设有如下设计稿,本身就是五颜六色的,他并不需要在更换主题的时候自动改变颜色: 所以这部分样式可以不使用主题相关的颜色(如`$primary-4`),直接用设计资源中精选的静态色值 ### 内联样式 禁止直接用 style 标签写样式,以便于项目使用适合的 css 选择器覆盖样式 需要按条件切换的样式(例如左侧导航收起和折叠),可以用 :class 表达式动态切换 class #### 例外 不适合通过切换 class 实现的(例如需要复杂计算、运行时才能确定),可以使用 :style 表达式 ## 请求后台数据 ### 导入 axios 使用 `import axios from '@/common/services/axios-instance'`导入 而不是`import axios from 'axios'` 以便于我们修改各种默认行为,同时不影响原始库的使用 ### 相对路径 发送请求时,应该使用相对路径。例如:`api/framework/v1/user-tasks/todo` 以适应代码部署到不同 appname 下的情况 ## Vuex 以下规则的实践,可以参考 `src/login/store.js` ### 避免滥用 尽量把数据保存在组件的 state 中,通过 props 传递到子组件 除非有绝对的必要,才把数据保存到 Vuex 中 使用 Vuex 的情况下要避免使用 actions,相关异步请求应该放到 service 中 Vuex 只做数据存储用途 ### 模块化 放在模块目录下的 store.js 会被自动注册进全局 Vuex 实例,并启用 namespace ## 其他 其余部分按照 [Vue 官方代码风格指南](https://cn.vuejs.org/v2/style-guide/) 执行