# 关于Vue项目开发规范
# 命名约定
# 工程项目命名
基于对我们现有的发布流程,多个单词建议统一用下划线的形式。
- 例如
my-project
# 组件命名
# 文件夹与文件名称
单个以小写字母开头,多个单词以横线连接,遵循横线连接 (kebab-case)的原则。
- 例子
// 单个单词文件夹与文件名
dialog/index.vue
// 单文件
dialog.vue
// 多个单词:自动完成组件
auto-complete/index.vue
auto-complete.vue
- 参考资料
# JS 文件
所有的.js文件都遵循横线连接 (kebab-case)
- 例子
@/src/utils/open-util.js
# View视图文件
在views文件下,代表路由的.vue文件都使用横线连接 (kebab-case),代表路由的文件夹也是使用同样的规则。
# 为什么不选择以大写字母开头
1)引用时还需要切换大小写
2)避免大小写敏感的问题
3)所有文件风格都统一了,不需要切换。
# 为什么选择以横线连接 (kebab-case)命名的原因
横线连接 (kebab-case) 也是官方推荐的命名规范之一 文档 views下的.vue文件代表的是一个路由,所以它需要和component进行区分
页面的url 也都是横线连接的,比如https://www.xxx.com/wear-app-store,所以路由对应的view应该要保持统一
没有大小写敏感问题
# 项目结构参考
- 参考vue-cli3生成的项目
/my-project
/public
/src
/assets
/imgs/
/fonts/
/scss/
/...
/common/ 公共js
/components/ 组件目录
/i18n/ 国际化目录
/mixins/ 混合目录
/service/ 接口服务
/views/ 路由组件
其他待补充完善
# 开发约定与注意
# 组件的 data 必须是一个函数。
当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 参考官方指南详细
# Prop 定义应该尽量详细。
在你提交的代码中,prop 的定义应该尽量详细,至少需要指定其类型。
# 为v-for设置key值
在组件上总是必须用 key 配合 v-for,以便维护内部组件及其子树的状态。甚至在元素上维护可预测的行为,比如动画中的对象固化 (object constancy),也是一种好的做法。 参考官方指南详细
# 避免 v-if 和 v-for 用在一起
一般我们在两种常见的情况下会倾向于这样做:
为了过滤一个列表中的项目 (比如 v-for="user in users" v-if="user.isActive")。在这种情形下,请将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。
为了避免渲染本应该被隐藏的列表 (比如 v-for="user in users" v-if="shouldShowUsers")。这种情形下,请将 v-if 移动至容器元素上 (比如 ul, ol)。
# 私有属性名
使用模块作用域保持不允许外部访问的函数的私有性。如果无法做到这一点,就始终为插件、混入等不考虑作为对外公共 API 的自定义私有属性使用 $_ 前缀。并附带一个命名空间以回避和其它作者的冲突 (比如 $yourPluginName)。
# 础组件名
应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V。
# 单例组件名
只应该拥有单个活跃实例的组件应该以 The 前缀命名,以示其唯一性。
这不意味着组件只可用于一个单页面,而是每个页面只使用一次。这些组件永远不接受任何 prop,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。如果你发现有必要添加 prop,那就表明这实际上是一个可复用的组件,只是目前在每个页面里只使用一次。
反示例
components/
|- Heading.vue
|- MySidebar.vue
好的示例
components/
|- TheHeading.vue
|- TheSidebar.vue
# 紧密耦合的组件名
和父组件紧密耦合的子组件应该以父组件名作为前缀命名。
如果一个组件只在某个父组件的场景下有意义,这层关系应该体现在其名字上。因为编辑器通常会按字母顺序组织文件,所以这样做可以把相关联的文件排在一起。
# 组件名中的单词顺序
组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。
反例
components/
|- ClearSearchButton.vue
|- ExcludeFromSearchInput.vue
|- LaunchOnStartupCheckbox.vue
|- RunSearchButton.vue
|- SearchInput.vue
|- TermsCheckbox.vue
好例子
components/
|- SearchButtonClear.vue
|- SearchButtonRun.vue
|- SearchInputQuery.vue
|- SearchInputExcludeGlob.vue
|- SettingsCheckboxTerms.vue
|- SettingsCheckboxLaunchOnStartup.vue
# 多个特性的元素
多个特性的元素应该分多行撰写,每个特性一行。
在 JavaScript 中,用多行分隔对象的多个属性是很常见的最佳实践,因为这样更易读。模板和 JSX 值得我们做相同的考虑。
反例
<img src="https://vuejs.org/images/logo.png" alt="Vue Logo">
<MyComponent foo="a" bar="b" baz="c"/>
好例子
<img
src="https://vuejs.org/images/logo.png"
alt="Vue Logo"
>
<MyComponent
foo="a"
bar="b"
baz="c"
/>
# 简化计算属性
应该把复杂计算属性分割为尽可能多的更简单的属性。
反例
computed: {
price: function () {
var basePrice = this.manufactureCost / (1 - this.profitMargin)
return (
basePrice -
basePrice * (this.discountPercent || 0)
)
}
}
好例子
computed: {
basePrice: function () {
return this.manufactureCost / (1 - this.profitMargin)
},
discount: function () {
return this.basePrice * (this.discountPercent || 0)
},
finalPrice: function () {
return this.basePrice - this.discount
}
}
# 指令缩写
指令缩写 (用 : 表示 v-bind: 和用 @ 表示 v-on:) 应该要么都用要么都不用。
# 元素特性的顺序
元素 (包括组件) 的特性应该有统一的顺序。
这是我们为组件选项推荐的默认顺序。它们被划分为几大类,所以你也能知道新添加的自定义特性和指令应该放到哪里。
# 单文件组件的顶级元素的顺序
单文件组件应该总是让