前言
希望IIDP开发者通过阅读本手册,能够充分利用IIDP平台进行开发,避免常见的错误和陷阱,写出高质量的代码,提高开发效率。让我们一起码出高效、码出质量的软件系统。
开发规范
命名规范
项目文件命名
1、项目文件名
【推荐】命名方法:kebab-case 字母小写短横线连接
正例:whclould-smart-port / my-project-name
反例:My-Project
2、目录名
【推荐】有复数结构时,要采用复数命名法
正例:assets、components、directives、mixins、utils、views
组件命名
1.【强制】 组件命名规范,组件名称必须唯一
说明:在IIDP平台中,确保组件名称的唯一性,便于识别和管理。 tech-作为名称前缀,具体的组件名作为后缀名称。
正例:tech-button / tech-dialog / tech-upload / tech-custom-multi-input 使用时type:button
反例:custom-multi-input 没有tech-作为名称前缀,会导致使用时type:custom-multi-input不显示这个组件
2、单文件组件名
【推荐】单文件组件名应该始终是单词大写开头 (PascalCase),大驼峰式命名法。
正例:CustomComponent.vue
反例:my-Component.vue
3、基础组件名
【推荐】基础组件在一个页面内可使用多次,在不同页面内也可复用,是高可复用组件。应该全部以一个特定的前缀开头 —— Base
正例:BaseButton.vue/ BaseInput.vue
反例:myButton.vue
4、业务组件
【推荐】掺杂了复杂业务的组件(拥有自身 data、prop 的相关处理)即业务组件应该以 Custom 前缀命名。
正例:CustomCard.vue
反例:myCard.vue
5、组件名中单词顺序
【推荐】组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。组件名尽量以完整单词命名,单词尽量语义化,方便阅读。
正例:SearchContent.vue
反例:ContSech.vue
代码参数命名
1、【推荐】在声明 prop 的时候,其命名应该始终使用 camelCase(小驼峰式命名),而在模板和 JSX 中应该始终使用 kebab-case(短横线连接式)。我们单纯的遵循每个语言的约定,在 JavaScript 中更自然的是 camelCase。而在 HTML 中则是 kebab-case
正例:camelCase
反例:camel-Case
2、router属性
【推荐】Vue Router Path 命名采用 kebab-case (短横线连接式)格式。或者PascalCase(大驼峰命名),推荐使用kebab-case 短横线。 用 Snake(下划线连接式)(如:/user_info)或 camelCase(小驼峰命名)(如:/userInfo)的单词会被当成一个单词,搜索引擎无法区分语义
3、模板中组件
对于绝大多数项目来说,在单文件组件和字符串模板中组件名应该总是 PascalCase(大驼峰命名) 的,但是在 DOM 模板中总是 kebab-case (短横线连接式)的。
4、全局变量,全局方法名称使用应用名称+功能名称
正例:
const IOT_THEME_OPTIONS = ['blue', 'red', 'green']
function iotGetSearchParams(params){
console.log(params)
}
反例: const MY_TE = ['blue', 'red', 'green']
5、变量
命名规范:类型 + 对象描述或属性的方式
正例:camelCase
6、常量
命名规范:使用大写字母和下划线来组合命名,下划线用以分割单词,力求语义表达完整清楚
正例:const MAX_COUNT = 10 //全部大写下划线分割
反例: const MC = 10
7、方法
命名规范:统一使用动词或者动词 + 名词形式
正例:jumpPage、loginIn、openDialog、getListApi、refresh
反例:pageGet
8、事件方法
命名规范:handle + 名称(可选)+ 动词
正例:
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="currentPage"
:page-size="100"
layout="total, prev, pager, next"
:total="1000">
</el-pagination>
反例:
<el-pagination
@size-change="change"
@current-change="currentChange"
:current-page.sync="currentPage1"
:page-size="100"
layout="total, prev, pager, next"
:total="1000">
</el-pagination>
代码规范
【强制】为 v-for 设置键值,在组件上必须用 key 搭配 v-for,以便维护内部组件及其子树的状态。
【强制】v-if 和 v-for 互斥,永远不要把 v-if 和 v-for 同时用在同一个元素上。
【强制】多个 attribute 的元素应该分多行撰写,每个 attribute 一行。视情况而定
【强制】模板中简单的表达式,组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。
复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。
【强制】指令缩写
用 : 表示 v-bind:
用 @ 表示 v-on:
用 # 表示 v-slot
【推荐】不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
【推荐】条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但不要写太长的三目运算符。如果超过 3 层请抽成函数,并写清楚注释。
【推荐】慎用 console.log,因 console.log 大量使用会有性能问题,调试完最终提交前清除掉
注释规范
注释的原则:提高代码的可读性,从而提高代码的可维护性 如无必要,勿增注释 ( As short as possible ) 如有必要,尽量详尽 ( As long as necessary )
1、HTML 文件注释
【推荐】单行注释:一般用于简单的描述,如某些状态描述、属性描述等。注释内容前后各一个空格字符,注释位于要注释代码的上面,单独占一行。
2、模块注释
【推荐】一般用于描述模块的名称以及模块开始与结束的位置。 注释内容前后各一个空格字符
扩展规范
1、主题扩展
【强制】对页面顶部,侧边栏,菜单等公共模块的扩展
需独立新增app内扩展,可以单独自行安装卸载,以免影响全局
2.【推荐】扩展名称使用应用名称+菜单名+功能名称
正例:iot_iiot_program_menu_search_extend
反例:unit_test_extend_view 不明确生效的位置和功能
3、样式扩展
【强制】对框架使用的Element的样式修改时,使用局部作用域,以免影响全局样式
4、关于扩展选择的节点id
【强制】在选择扩展的节点id时,对于id中包含undefined的节点不能直接扩展,请咨询平台人员
5、关于扩展注释
【推荐】在对某节点扩展时,补充注释信息,说明页面节点,功能描述等信息,方便阅读、定位
版本管理规范
关于版本更新
为了确保线上使用的依赖版本与开发时的版本一致,有以下几项注意事项:
1、执行npm run update:tech、npm run update:beta、npm update等命令升级后依赖版本中会带有 ^ 等符号,如果需要使用固定版本,需要手动修删除 ^ 符号,使用固定的具体的版本号,并执行npm run init:tech重新安装指定版本 正例:
// 固定(指定)的版本号
{
"dependencies": {
"@tech/t-base": "1.0.11",
"@tech/t-build": "1.0.1",
"@tech/t-core": "1.0.9",
"@tech/t-el-ui": "1.0.9",
}
}
反例:
// 不固定的版本号,(不推荐)
{
"dependencies": {
"@tech/t-base": "^1.0.11",
"@tech/t-build": "^1.0.1",
"@tech/t-core": "^1.0.9",
"@tech/t-el-ui": "^1.0.9",
}
}
2、为了保证打包稳定,请直接使用当前开发环境所安装的依赖,不需要执行 npm run update:tech 或者 npm run update:beta
工程结构规范
工程结构说明
|— apps
|— base // 业务App 根据实际情况命名
|— common // 公共总扩展,一般情况不用操作,后面会展开讲解
|— common - 公共总扩展
|— assetImport.js - 内部导入连接资源扩展入口
|— asset.json - 外部url连接资源扩展入口
|— common.js - 应用公共配置扩展入口
|— comps.js - 定制组件扩展入口
|— extendView.js - 合并视图扩展入口
|— hook.js - 功能钩子扩展入口
|— schema.js - 初始视图结构扩展入口
|— index.js - 公共扩展总入口
|— views // 纯js格式编辑视图,通过视图的扩展能力合并的主视图中
|— rbacUser // 业务定制的扩展视图,名称根据实际情况定义
|— tview__base__rbac_user.js // 扩展文件,后面会展开讲解 命名规则:[自定义业务名].js
|— ...
|— index.js // 扩展视图的入口
|— config // 当前App的额外配置,如全局变量
|— app.json
|— resource // 语言包,皮肤 等资源
|— static-resource // 静态资源
|— index.js // 扩展引入入口
|— component // 公共业务组件
|— config
|— nginx
|— apps.json
|— build // 各种环境的打包入口
工程运行起来后,以下文件夹是工程临时生成文件不用处理:
resource、static-resouorce、views、dist、distApp、distTmp
资源引入规范
1、资源引入
【强制】前端依赖的第三方库,或组件库的资源地址引入需要做以下配置:
外部资源需要在./apps/[自己的扩展应用]/common/assets.json配置引入
内部资源需要在./apps/[自己的扩展应用]/common/assetsImport.js配置引入
2、资源扩展
asset.json资源引入扩展,会根据定义里面的 title 作为唯一标识覆盖合并
assetImport.js资源引入扩展,会根据定义里面的 key 值作为唯一标识覆盖合并, 例如上面的 assetImport.js 引入组件库的key值为 my-ui。
部署规范
1、底座的更新只能通过更新服务器中前端工程。
2、app 的更新可通过应用市场更新,可也以通过服务器部署更新
3、打包外部依赖 app 和本地开发的 app 到./dist/umdComps中。适用于通过应用市场上传安装
【强制】主服务器的 nginx 需要增加允许跨域
1、所有的涉及静态资源转发的都需要配置允许跨域
2、涉及代理转发的不需要设置跨域