前端工程化-搞定代码规范

147 阅读9分钟

在项目协作开发中, 随着业务的扩张,开发人员的增加,项目代码自然会出现爆炸性增长,这时候代码规范成了一个不可避免的问题,除了人工 code review 之外,我们需要一些自动化规范代码的工具,让我们的开发人员能够更好的专注在代码本身。

下面简单介绍 prettier、eslint、styleint、husky、commitzen、commitlint 这几个工具实现项目代码规范,我的项目是 react + vite ,我会以本项目作为示例。

Prettier

Prettier 是一个自动代码格式化工具,它自动调整代码的风格,包括缩进、空格和引号,以确保一致的代码风格。它支持多种编程语言,易于集成到编辑器和项目中,有广泛的社区支持。 Prettier 帮助团队维持一致的风格,减少风格争议,并提高代码质量。

安装

npm install --save-dev --save-exact prettier

这里解释下 --save-exact 这个选项 它用于确保安装的包的版本是精确匹配的,在我们需要确认精确的包版本,以及希望避免不期望的升级版本时候可以使用。 这样可以确保项目中的每个人都获得完全相同的 Prettier 版本。

配置

项目根目录创建两个文件,.prettierrc 、.prettierignore

.prettierrc 配置

{
	"printWidth": 80, // 用于指定代码行的最大字符数。当一行的字符数超过这个值时,Prettier 会尝试将代码拆分成多行
    "trailingComma": "all", // 用于指定对象和数组字面量的最后一个元素是否包含逗号。
    "tabWidth": 2,  // 指定用于缩进的制表符宽度或空格数量。通常情况下,推荐使用空格作为缩进字符。
    "semi": true, // 控制是否在语句末尾添加分号。
    "singleQuote": true, // 用于控制是否使用单引号还是双引号来包裹字符串。
    "bracketSpacing": true, // 控制对象字面量的大括号内是否添加空格。
    "arrowParens": "always", // 控制是否为单一箭头函数的参数添加括号。
    "jsxBracketSameLine": true, // 控制 JSX 元素的起始尖括号是否与前一个元素在同一行。
    "endOfLine": "auto" // 用于指定换行符的类型。可以设置为 "auto"、"lf"(换行符)或 "crlf"(回车换行符)。
}

.prettierignore 忽略文件配置

node_modules
dist
.git

这里配置好后想试试效果可以使用命令对单个文件进行格式化操作

npx prettier --write ./src/index.jsx

ESlint

ESLint 是一个静态代码分析工具,用于检测和修复 JavaScript 代码中的问题和代码质量问题。它强调规则的可定制性,允许开发人员自定义规则和适应项目需求。ESLint 主要关注代码质量、潜在问题和编码规范。

与 Prettier 的区别在于,Prettier 专注于代码格式化,即代码的排版、缩进、引号等,以确保一致的代码风格。ESLint 负责检查代码质量、潜在错误和编码规范,但不处理排版问题。通常,开发团队会同时使用 ESLint 和 Prettier,以实现代码质量和代码格式的全面检查和修复。

安装

npm install eslint --save-dev

配置

根目录创建文件 .eslintrc.js ,我这个 vite 项目生成的时候自带了 eslint,默认配置如下

module.exports = {
  root: true, // 表示此配置文件是根配置文件,ESLint 在查找配置文件时会停止搜索。这意味着它是项目中的主要配置文件。
  env: { browser: true, es2020: true }, // 指定了代码执行的环境。这里配置了浏览器环境和 ECMAScript 2020 版本的支持。
  extends: [ // 继承其他预定义的 ESLint 配置。这里继承了以下配置:
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react/jsx-runtime',
    'plugin:react-hooks/recommended',
  ],
  ignorePatterns: ['dist', '.eslintrc.cjs'], // 定需要被 ESLint 忽略的文件和目录。在这个例子中,它忽略了 `dist` 目录和 `.eslintrc.cjs` 文件。
  parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
  // 配置解析选项。这里指定了 ECMAScript 版本为 'latest'(即最新版本),以及代码的 `sourceType` 为 'module'(表示使用 ES6 模块系统)。
  settings: { react: { version: '18.2' } },
  // 包含一些配置设置,这里主要是为了指定 React 版本为 '18.2',以便 React 相关的规则能够正确运行。
  plugins: ['react-refresh'],
  rules: {
    'react-refresh/only-export-components': [
      'warn',
      { allowConstantExport: true },
    ],
  },
}

eslint 某些规则可能会和 Prettier 冲突,这里我们安装一个插件来关闭可能与 Prettier 冲突的规则

npm install --save-dev eslint-config-prettier

并且在 eslint 配置文件中加入

extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react/jsx-runtime',
    'plugin:react-hooks/recommended',
    'prettier',
  ],

husky 和 lint-staged

Husky 是一个 Git 钩子工具,它允许你在 Git 操作(如提交、推送等)发生前或发生时运行自定义脚本,以确保代码的一致性、质量和规范性。需要注意的是,如果我们在整个项目上运行 Lint 会很慢,一般我们只检查更改过的文件,此时要用到 lint-staged。 安装以及使用如下:

安装

npm install --save-dev husky lint-staged

配置

目前 husky 版本 8.0.3 需要编辑 package.json 并再次运行安装命令生成 husky 配置文件

编辑 package.json > prepare 脚本并运行一次

npm pkg set scripts.prepare="husky install"
npm run prepare

并添加 hook 配置

npx husky add .husky/pre-commit "npm run pre-commit"

package.json 中添加以下配置:

// package.json
{
  "scripts": {
    "pre-commit": "lint-staged"
  }
}
  "lint-staged": {
    "src/**/*.{js,jsx}": [
      "eslint --fix",
      "prettier --write",
      // "git add" lint-staged 在10以上版本无需增加 git add
    ]
  },

现在,每当提交代码的时候,Git 钩子会自动运行 ESLint、Prettier 来规范代码。

Stylelint

经过上面几个工具的安装配置,我们基本的代码规范框架已经搭建起来了,现在就是根据具体业务情况再添加不同的规范工具或者自定义配置,现在我还需要把 css 代码也做一个自动规范操作。

stylelint,一个强大的CSS过滤器,可以帮助您避免错误并强制执行约定。

安装

npm install --save-dev stylelint stylelint-config-standard

这里我项目用的是 less , 还需要额外安装 stylelint-less、postcss-less

npm install --save-dev stylelint-less postcss-less

配置

使用 stylelint 生成配置文件

npm init stylelint

直接在根目录生成了 .stylelintrc.json 配置文件,stylelint-config-standard 这个配置是 stylelint 的一些标准配置,具体内容不细述,可以查看 样式lint-config-standard - npm (npmjs.com)

然后我们再加上 stylelint-less 相关插件配置以及一些自定义规则,结果如下

{
  "extends": ["stylelint-config-standard"],
  "plugins": ["stylelint-less"],
  "rules": {
    "at-rule-no-unknown": null,
    "color-no-invalid-hex": true,
    "less/color-no-invalid-hex": true,
    "selector-class-pattern": null,
    "selector-pseudo-class-no-unknown": [
      true,
      {
        "ignorePseudoClasses": ["global"]
      }
    ]
  },
  "overrides": [
    {
      "files": ["**/*.less"],
      "customSyntax": "postcss-less"
    }
  ]
}

然后我们再调整下 lint-staged 配置,在提交代码前进行样式代码规范自动检查和修复

"lint-staged": {
    "src/**/*.{js,jsx,less}": [
      "eslint --fix",
      "stylelint --fix",
      "prettier --write",
    ]
},

这里还要修改下 .eslintrc.js ,忽略掉 eslint 对 less 文件的检查

// .eslintrc.cjs
module.exports = {
  //...
  ignorePatterns: ['dist', '.eslintrc.cjs', '**/*.less'],
}

vscode 配置

在项目根目录创建 .vscode 文件夹,并在文件夹里创建 settings.json 配置文件 这可以让每个使用这个项目的开发人员都能统一 vscode 相关的项目配置

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true,
    "source.fixAll.stylelint": true,
  },
  "stylelint.validate": [
    "css",
    "less",
    "postcss"
  ]
}

添加以上配置, 使文件保存时自动进行 prettier 格式化和 eslint、stylelint 代码检查

commitzen 解决 git commit 信息规范

多人协作项目,git 提交的信息可能就五花八门了,为了提高 git commit 的可读性和可维护性,可以利用 commitzen 这个工具来规范 commit 信息

安装及配置

安装 commitizencz-customizable@commitlint/clicommitlint-config-cz

// 安装
npm i commitizen cz-customizable @commitlint/cli commitlint-config-cz --save-dev --save-exact

// 初始化配置文件
npx commitizen init cz-customizable  

项目根目录创建 .cz-config.cjs 文件,这里一个小知识,为什么是 .cjs 呢

因为我的项目是 ES module。可以看下 package.json,里面有 type: module。 于是 .js 被默认为使用了 ES module 规范,如果自动生成的配置文件使用了 CommonJS,就会出错。.cjs 的 js 会告诉 node.js 它使用了 CommonJS 规范

.cz-config.cjs 配置内容

module.exports = {
  // 这里配置type的option值,可自行调整顺序或修改文案
  types: [
    {
      value: 'feat',
      name: 'feat(新功能): 向现有功能添加新功能或改进',
    },
    {
      value: 'fix',
      name: 'fix(修复): 修复代码库中的bug或者issues',
    },
    {
      value: 'chore',
      name: 'chore(任务): 构建/工程依赖/工具/文档更新/格式化',
    },
    {
      value: 'docs',
      name: 'docs(文档): 为代码库更新文档',
    },
    {
      value: 'style',
      name: 'style(样式): 改善代码库的格式或风格, 修改页面样式',
    },
    {
      value: 'refactor',
      name: 'refactor(重构): 对代码库的结构或组织进行重组或改进',
    },
    {
      value: 'perf',
      name: 'perf(性能): 代码库性能优化',
    },
    {
      value: 'init',
      name: 'init(初始化): 项目初始化',
    },
    {
      value: 'test',
      name: 'test(测试): 自动化测试',
    },
    {
      value: 'revert',
      name: 'revert(回退): 撤销之前某个提交',
    },
    {
      value: 'build',
      name: 'build(构建): 重构系统编译配置',
    },
  ],
  // 每一步的提示信息
  messages: {
    type: '请选择提交类型',
    scope: '请选择文件修改范围',
    subject: '请输入commit标题(必填)',
    body: '请输入commit描述, 可通过&换行(选填)',
    // breaking: '列出任何BREAKING CHANGES(破坏性修改)(可选)',
    // footer: '请输入要关闭的issue(可选)',
    confirmCommit: '确定提交此 commit 吗?',
  },
  // 配置scope可选项,mono项目可按子项目维度划分,非mono项目可按功能or业务模块划分
  scopes: [
    { name: '全局' },
    { name: '账单模块' },
    { name: '用户中心' },
    { name: '登录注册' },
    { name: '其他' },
  ],
  // commit描述的换行符
  breaklineChar: '&',
  skipQuestions: ['breaking', 'footer'],
  // 标题首字母大写
  upperCaseSubject: true,
  // 标题必填
  requiredSubject: true,
};

package.json 文件添加配置

{
  "scripts": {
    "cz": "cz"
  },
  "config": {
    "commitizen": {
      "path": "./node_modules/cz-customizable"
    },
    "cz-customizable": {
      "config": "./.cz-config.cjs"
    }
  }
}

根目录创建 commitlint.config.cjs 配置

module.exports = {
  extends: ['cz'],  // commitlint-config-cz 插件 使 commitlint 共享 cz-customizable 配置
  rules: {
    'type-empty': [2, 'never'],
    'subject-empty': [2, 'never'],
    'scope-empty': [0],
  },
};

最后我们需要配置下 husky 以便将 Commitizen 合并到现有的工作流当中,commitlint 可以校验提交的 commit 信息。

npx husky add .husky/commit-msg  'npx --no -- commitlint --edit ${1}'

现在当你没有按规范填写 commit 信息会在控制台提示

Pasted image 20231017202841.png

所以我们可以直接使用 npm run cz 来利用交互式命令行提交 commit

Pasted image 20231017210856.png

总结

  1. Prettier:用于自动化代码格式化,保持一致的代码风格。
  2. ESLint:用于静态代码分析,检查和修复 JavaScript 代码中的问题、潜在错误和编码规范。
  3. Husky 和 lint-staged:用于在 Git 提交前运行代码规范检查,确保只检查更改过的文件。
  4. Stylelint:用于检查和规范 CSS 代码,确保一致的样式风格。
  5. VSCode 配置:通过编辑器配置,在保存文件时自动运行 Prettier、ESLint 和 Stylelint,提高代码规范的一致性。
  6. Commitzen 和 Commitlint:用于规范化 Git 提交信息,使其更易读、易维护,同时通过 Husky 集成,确保提交信息符合规范。

博主自己这套组合拳配置下来,感觉确实还挺麻烦的,但是通过整合这些工具和配置,最后能够让开发团队更轻松的维护代码,减少代码质量问题,我觉得还是值得的。