编程规范
记录自己所总结和遵守的编程规范(即个人风格指南)
命名规范与项目结构
命名规范
命名规范是编程规范中最重要的一部分,它直接影响到代码的可读性和可维护性
常用的命名形式
camelCase小驼峰式命名法(首字母小写)PascalCase大驼峰式命名法(首字母大写)snake_case下划线命名法kebab-case短横线命名法UPPER_CASE大写命名法
文件命名规范
INFO
除组件命名外,均使用短横线命名法
- 项目名称使用短横线命名法。🌰
mm-notes html / css / md / js / ts / jsx / tsx文件使用短横线命名法React / Vue组件文件使用大写驼峰式命名法。🌰Dialog.vue/Dialog.tsx- 静态资源文件使用短横线命名法。🌰
logo-white.png
代码命名规范
JavaScript 命名规范
- 常量使用大写命名法。🌰
const MAX_COUNT = 2000- 正则常量命名使用后缀
_RE。🌰const PHONE_RE = /^1[3-9]\d{9}$/
- 正则常量命名使用后缀
- 变量使用小驼峰式命名法。🌰
const maxCount = 1996 class类名使用大驼峰式命名法。🌰class User {}- 构造函数使用大驼峰式命名法。🌰
function User() {} - 函数使用小驼峰式命名法。🌰
function getUserInfo() {} - 对象
key使用小驼峰式命名法。🌰const user = { userName: 'heizi' } - 路由
path使用短横线命名法。🌰path: '/user-info' - 形参使用
_+ 小驼峰式命名法。🌰function (_userId) {}
CSS 命名规范
- 类名使用短横线命名法。🌰
.user-info ID使用小驼峰式命名法。🌰#userInfo- 自定义变量使用短横线命名法。🌰
--main-color: #fff
项目结构
约定优于配置
sh
.
├── .vscode # VSCode 配置文件
├── public # 网站资源文件(favicon.ico index.html 等)
├── scripts # 脚本相关
├── src
│ ├── apis # api 接口
│ ├── assets # 静态资源
│ ├── components # 全局组件
│ ├── config # 项目配置文件
│ ├── constants # 常量
│ ├── hooks # 通用 hooks
│ ├── layout # 页面整体布局
│ ├── lib # 第三方或无业务依赖代码
│ ├── locales # i18n
│ ├── pages # 页面相关文件
│ │ ├── Home # 大驼峰规范 => 组件即是一个构造函数
│ │ │ ├── components # 页面相关的子组件
│ │ │ ├── index.module.scss # 根据应用的 CSS Scope 方案命名
│ │ │ └── index.tsx # index 作为默认路径,视为根节点
│ │ └── App.tsx # 页面入口
│ ├── router # 页面路由
│ ├── store # 状态管理
│ ├── styles # 全局/基础样式
│ ├── types # TypeScript 类型声明
│ ├── utils # 工具函数
│ └── main.tsx # 应用启动入口
├── README.md # 当前项目的文档
├── package.json # 项目信息
└── tsconfig.json # TypeScript 配置文件Git 提交规范
git commit message的格式
sh
<type>(<scope>): <subject>
<body>
<footer>type(必填):commit的类型scope(选填):commit的影响范围subject(必填):commit信息的简短描述(50 字以内)body(选填):commit信息的具体描述footer(选填):重大变化(Breaking Change)和需要关闭的Issue
正则校验规则:
js
/**
* 基于 vue 项目中的 verify-commit-msg.js 修改
* https://github.com/vuejs/vue/blob/main/scripts/verify-commit-msg.js
*/
const commitRE =
/^((revert|wip|draft): )?(feat|fix|docs|style|refactor|perf|types|test|build|ci|chore)(\(.+\))?: .{1,50}/;commit 常用的 type
| type | 含义 |
|---|---|
| feat | 新功能 |
| fix | 修复 bug |
| docs | 文档类改动 |
| style | 代码格式改动,同理适用于业务样式调整 |
| refactor | 重构(即不是新增功能,也不是修复 bug) |
| perf | 性能优化相关 |
| types | TypeScript 类型相关的改动 |
| test | 单元测试、e2e 测试 |
| build | 构建工具或者依赖项的改动 |
| ci | 修改项目持续集成流程 |
| chore | 其他类型的提交 |
| revert | 恢复或还原相关提交 |
| wip | draft | 托管平台对应的草稿标识 |
安装
1、 pnpm add -D @commitlint/cli @commitlint/config-conventional 安装依赖
2、 在根目录新建一个commitlint.config.js文件
js
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
"type-enum": [
// 扩展允许的type类型
2,
"always",
["feat", "fix", "docs", "style", "refactor", "test", "chore", "revert"],
],
"subject-case": [0], // 关闭subject大小写检查
},
};3、npx husky add .husky/commit-msg "npx commitlint --edit $1" 运行 husky 并进行初始化
如果出现以下报错,1、检查 node 环境是否安装 2 、环境变量是否设置正确,还是不行则使用下方步骤修改
shell
'node' is not recognized as an internal or external command,
operable program or batch file.
husky - commit-msg hook exited with code 1 (error)shell
#commit-msg
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
export PATH="/d/Program Files/nodejs:$PATH"
npx commitlint --edit $1
#pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
# pnpm testPrettier
使用 Prettier 对代码进行格式化,从而实现一致的编码风格
js
module.exports = {
// 每行代码的最佳长度,超出该长度则格式化
printWidth: 80,
// 一个缩进使用 2 个空格
tabWidth: 2,
// 缩进使用空格
useTabs: false,
// 语句末尾不添加分号
semi: false,
// 仅在必需时为对象的 key 添加引号
quoteProps: "as-needed",
// 使用单引号
singleQuote: false,
// 在 jsx 中使用双引号
jsxSingleQuote: false,
// 不添加尾随逗号
trailingComma: "es5",
// 在对象花括号内的两旁添加空格 => { foo: bar }
bracketSpacing: true,
// HTML元素(包括 JSX 等)具有多个属性时,将结束标签右尖括号 > 另起一行
bracketSameLine: false,
// 箭头函数仅有一个参数时,参数也添加括号 (x) => x
arrowParens: "always",
// 每个文件格式化的范围是文件的全部内容
rangeStart: 0,
rangeEnd: Infinity,
// 对所有文件进行格式化,而不是只对在开头含有特定注释(@prettier 或 @format)的文件进行格式化
requirePragma: false,
// 格式化的同时自动插入 @format 的特殊注释(表示该文件已被格式化)
insertPragma: false,
// 对 Markdown 文本换行不进行任何操作,保持原样
proseWrap: "preserve",
// 对 HTML 全局空白不敏感
htmlWhitespaceSensitivity: "css",
// 不对 vue 中的 script 及 style 标签进行缩进
vueIndentScriptAndStyle: false,
// 换行符使用 lf
endOfLine: "lf",
// 自动格式化嵌入的代码内容
embeddedLanguageFormatting: "auto",
// 不强制 html vue jsx 中的属性(具有多个时)单独占一行
singleAttributePerLine: false,
};