搭建Vue3组件库:第七章 规范化:Eslint + Prettier + Husky

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本章介绍项目的代码规范,以及有关git版本控制的一些规范验证。

为了项目能够长期健康的发展。代码的规范性建设非常重要。只有纪律严明的队伍才能不断打胜仗。

规范制定容易,执行的难度很大。

项目规范可以分为:

  • 编码规范;
  • 项目结构规范;
  • 文件命名规范;
  • git commit 版本规范;
  • 工作流 workflow规范。

本节只考虑前四部分。


本章任务

  • 编码与项目结构规范;
  • Eslint 代码检查工具;
  • Prettier 代码格式化工具;
  • Git commit 提交检查脚本;
  • Husky + git hook 提交前校验。

task1】编码与项目结构规范

1、编码规范——js代码规范

2、编码规范——css代码规范

对于编码规范,通常会依赖 eslint 这种代码检查工具。 eslint 提供了 airbnbgoogleeslint默认三种编码规范。其实无论选择哪一种规则都可以很好地保证代码的可读性。所以大家使用 eslint 默认规则就好。

3、目录文件规范

.
├── config               # 配置文件
├── coverage            # 覆盖率报告
├── demo                # 代码范例
├── docs                # 文档
├── node_modules  
├── scripts              # 脚本 发布、提交信息检查
├── src                  # 组件代码
└── types                # TS类型定义

4、文件命名规范

├── src                 # 组件代码
    └── button       # 组件包名
         ├── index.ts   # 组件入口
         ├── Button.tsx  # 组件代码  
         └── __tests__   # 测试用例
                  └── Button.test.ts   
  • 包名:小写 + 中划线;
  • 统一入口文件: index.ts
  • 组件代码: 大驼峰;
  • 测试用例代码 : 测试对象名+ .test.ts

task2Eslint + Prettier代码检查工具

通常代码的检查工作交给 eslintprettier 共同完成。其中 eslint 主要是完成对于代码语法的检查工作,比如:是否有声明但是没有使用的变量。而 prettier 主要专注于代码格式的调整功能。prettier 通常会以eslint 插件的形式使用,一般无需直接运行。

另外 eslint 在环境下还需要配置专门针对 Vue 框架的 eslint-plugin-vue 插件。

  • 安装依赖
pnpm i eslint -D
# ESLint 专门解析 TypeScript 的解析器
pnpm i @typescript-eslint/parser -D
# 内置各种解析 TypeScript rules 插件
pnpm i @typescript-eslint/eslint-plugin -D

pnpm i eslint-formatter-pretty -D
pnpm i eslint-plugin-json -D
pnpm i eslint-plugin-prettier -D
pnpm i eslint-plugin-vue -D
pnpm i @vue/eslint-config-prettier -D
pnpm i babel-eslint -D
pnpm i prettier -D
  • 配置Eslint

文件名(根目录):.eslintrc.cjs

module.exports = {
  root: true,
  env: {
    browser: true,
    es2020: true,
    node: true,
    jest: true,
  },
  globals: {
    ga: true,
    chrome: true,
    __DEV__: true,
  },
  // 解析 .vue 文件
  parser: 'vue-eslint-parser',
  extends: [
    'plugin:json/recommended',
    'plugin:vue/vue3-essential',
    'eslint:recommended',
    '@vue/prettier',
  ],
  plugins: ['@typescript-eslint'],
  parserOptions: {
    parser: '@typescript-eslint/parser', // 解析 .ts 文件
  },
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
    'prettier/prettier': 'off',
  },
}
  • 配置ES忽略文件

文件名(根目录):.eslintignore

*.sh
node_modules
lib
coverage
*.md
*.scss
*.woff
*.ttf
src/index.ts
dist
  • 配置启动命令

文件名:package.json

{
  "scripts": {
    "lint": "eslint --fix --ext .ts,.vue src",
    "format": "prettier --write \"src/**/*.ts\" \"src/**/*.vue\"",
  },
}
  • 启动命令
pnpm lint

控制台

WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.

You may find that it works just fine, or you may not.

SUPPORTED TYPESCRIPT VERSIONS: >=3.3.1 <4.9.0

YOUR TYPESCRIPT VERSION: 4.9.3

Please only submit bug reports when using the officially supported version.

这里提示我们ts的版本太高。

npm view typescript version

使用以上命令查看你的ts版本


task3】Husky + git hooks 自动化提交验证

为了确保只有合格的代码才能够提交到仓库。 需要配置自动化脚本,确保代码在提交前通过了代码验证工具的检验。

实际上 git 本身就设计了生命周期钩子来完成这个任务。但是设置过程比较复杂。所以通常情况下会使用 husky 来简化配置。

  • 安装依赖
pnpm i husky -D
  • 添加husky脚本
npm set-script prepare "husky install"
  • 运行husky脚本
pnpm prepare

此时会生成.husky目录

注意:在执行此操作之前需配置好git关联仓库

  • 添加生命周期钩子

首先配置一个钩子,在 commit 提交前,必须执行 lint 代码校验。

npx husky add .husky/pre-commit "pnpm lint"
  • 修改 hooks 程序

文件名:.husky/pre-commit

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

pnpm run lint

配置完成后,commit 一次代码测试一下是否有效。

接着还需要配置在 push 之前通过单元测试的钩子。方法类似。

  • 添加push生命周期钩子
npx husky add .husky/pre-push "pnpm test:run"

由于 vitest 默认是以伺服模式运行,所以需要写一个专门的脚本让测试运行在伺服模式下 packages.json

文件名:package.json

"scripts": {
    "test:run": "vitest run",
  },
  • 修改hooks程序。

文件名:.husky/pre-push

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

pnpm test:run

Git commit 提交规范

提交规范主要是为了让开发者提交完整的更新信息。方便查阅。大家可以围观一下 VueGithub。拥有清晰 commit 信息非常有助于查阅代码。

目前最为流行的提交信息规范来自于 Angular 团队。

规范中,主要就是要求提交内容要进行分类并填写内容,更为严格的规定是要求标注开发模块。

  • type:commit 的类型;
  • feat:新功能、新特性;
  • fix: 修改 bug;
  • perf:更改代码,以提高性能;
  • refactor:代码重构(重构,在不影响代码内部行为、功能下的代码修改);
  • docs:文档修改;
  • style:代码格式修改, 注意不是 css 修改(例如分号修改);
  • test:测试用例新增、修改;
  • build:影响项目构建或依赖项修改;
  • revert:恢复上一次提交;
  • ci:持续集成相关文件修改;
  • chore:其他修改(不在上述类型中的修改);
  • release:发布新版本;
  • workflow:工作流相关文件修改。

示例:

# 示例1
fix(global):修复checkbox不能复选的问题
# 示例2 下面圆括号里的 common 为通用管理的名称
fix(common): 修复字体过小的BUG,将通用管理下所有页面的默认字体大小修改为 14px
# 示例3
fix: value.length -> values.length

下面配置一个工具用于在提交时自动检查 commit 信息是否符合要求。

安装工具验证脚本 commitlint,并且配置一个 commitlint 内容插件来确定一种 msg 风格。

  • 安装commitlint
pnpm i -D @commitlint/config-conventional@"17.0.2" @commitlint/cli@"17.0.2"
  • 添加配置文件

文件名:commitlint.config.js

module.exports = {extends: ['@commitlint/config-conventional']}
  • 添加钩子

commitlint 脚本添加到 githooks 中, 让每次提交前都验证信息是否正常

npx husky add .husky/commit-msg ""
  • 修改钩子内容

文件名:.husky/commit-msg

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx --no -- commitlint --edit "$1"

配置完成后,你可以测试一下。

当你提交代码没有按照规范填写 commit message 时,就会出现报错并且阻止你提交代码。

在这里插入图片描述

相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
157 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
128 60
|
21天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
70 3
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
47 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
42 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
51 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
2月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
60 0
|
2月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
74 0