前端工程化小记

2023-09-13 18:11:52

1.引言

工作中,我们是否经常遇到以下情况:

  • 接手其他同事的代码非常痛苦,比如:缩进,换行等等代码风格这些一度让人浑身难受
  • 某个同事经常提语法报错的代码,语法报错只能用肉眼一个个review代码,完全没有提示
  • 同事每个人写的commit风格都不一样,也有偷懒的,一个单词搞定的,但是也不描述本次更改是属于什么范畴?比如:是加功能?是代码优化?还是修复bug?还是修改webpack配置?还是修改工具链等等
  • 如果是monorepo的仓库,里面有很多项目,commit一顿乱写,完全不管改的哪个项目,是不是很崩溃?

所以说代码语法检查、代码格式化、commit注释规范、代码编译等等这些工作量繁杂且巨大的苦力活,除非你不想把人当马用,那还是交给机器去做,是吗?

前端领域早已不是以前的纯js、jquery 时代,模块化、工程化也成为了前端领域的追求,这样才能保证前端程序的可读性,可维护性,健壮性等等

2.背景

前端工程化已经发展了有些年月了,大量提高效率的包如雨后春笋般涌出。所以作为小前端的我也忍不住去探索一番,毕竟谁也不想疯狂加班,被当作马使,也想下早班开启简单开心的生活

本文旨在记录探索前端基本工程化的实践过程,方便自己以后翻阅,请轻喷(ps: 这篇文章聚焦代码检查,代码美化,commit规范,其中有借助chatgpt)

项目基本技术选型为:react + ts,所以将以此为基础展开前端工程化基本配置

3.Git钩子:husky

husky 是一个用于在 Git 钩子中运行命令的工具,它能够在代码提交或推送等特定事件中自动触发指定的命令。通过 husky,你可以在代码提交前、提交后、推送前等场景下运行脚本,以进行代码风格检查、单元测试、构建等操作

安装如下:

  1. 下载husky的npm包
  2. 初始化husky
  3. 配置npm install时自动初始化husky

用快捷命令完成上面的安装步骤

# npm
npx husky-init && npm install

# yarn
yarn dlx husky-init --yarn2 && yarn

#pnpm
pnpm dlx husky-init && pnpm install

4.文件过滤工具:lint-staged

lint-staged是一个用于在 git 暂存文件上运行指定命令的工具。它可以帮助你在提交代码前,只对即将提交的文件进行代码风格检查、格式化、静态分析等操作,以便在代码提交之前保持代码的质量和一致性

基本使用如下:

  1. 安装依赖
# npm
npm install lint-staged --save-dev

#yarn 
yarn add lint-staged --dev

#pnpm
pnpm add lint-staged --save-dev
  1. 修改package.json文件如下:
{
  "scripts": {
    "lint": "eslint src"
  },
  "lint-staged": {
    "src/**/*.{ts,tsx}": [
      "npm run lint", // 运行自定义的 lint 脚本
      "git add" // 添加修复后的文件到暂存区
    ]
  }
}

以上配置表示:对于 src 目录下的所有后缀为 ts 和 tsx 的文件,在提交前会运行 npm run lint 命令来进行语法检查,然后将修复后的文件添加到暂存区

实际开发时,lint-staged 一般会配合 pre-commit 钩子进行 commit 之前的动作,所以我们替换 pre-commit 钩子内容如下:

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

npx lint-staged

5.commit注释规范:commitlint

commitlint 是一个用于规范化 Git 提交消息的工具。它帮助团队确保每个提交消息都符合统一的规范,以提高代码仓库的可读性和可维护性

这里直接展示commitlint搭配husky一起使用

  1. 安装相关依赖
  # npm
  npm install @commitlint/cli @commitlint/config-conventional --save-dev

  # yarn
  yarn add @commitlint/cli @commitlint/config-conventional --dev

  # pnpm
  pnpm add @commitlint/cli @commitlint/config-conventional --save-dev
  1. 使用 husky 增加 commit-msg 钩子
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
  1. 在package.json文件里面commitlint信息,默认使用commitlint提供的11注释类型(ps: 你可以自定义,比如下方的ui、version)
{
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ],
    "rules": {
      "type-enum": [
        2,
        "always",
        [
          "build",
          "chore",
          "ci",
          "docs",
          "feat",
          "fix",
          "perf",
          "refactor",
          "revert",
          "style",
          "test",
          "ui",
          "version"
        ]
      ]
    }
  }
}

commitlint提供的11注释类型解释如下:

  • build: 编译相关的修改, 例如:发布版本、项目构建工具改动等(例如:glup、rollup、webpack、vite、turbo等工具)
  • chore: 杂项修改(例如:改变构建流程、增加依赖库等)
  • ci: 持续集成相关修改(例如: github-action、gitlab-ci/cd等)
  • docs: 文档修改
  • feat: 新增功能
  • fix: 修复bug
  • perf: 优化(例如: 提升性能、体验等)
  • refactor: 代码重构
  • revert: 回滚版本
  • style: 代码格式修改
  • test: 测试用例修改

6.代码检查

代码检查借助了eslint, typescript-eslint

eslint是一个用于检查和修复 JavaScript 代码错误、风格和质量问题的工具。它可以帮助开发人员和团队在编码过程中遵循一致的编码规范,提高代码可读性、可维护性和质量

typescript-eslint是一个用于对 TypeScript 代码进行检查和修复的工具。它基于eslint,提供了一套规则和插件,可以检查和修复 TypeScript 代码中的错误、风格和质量问题

综上所诉,需要开发环境下安装如下包:

  1. eslint
  2. eslint-plugin-react-hooks
  3. eslint-plugin-react-refresh
  4. @typescript-eslint/parser
  5. @typescript-eslint/eslint-plugin
# npm
npm install eslint eslint-plugin-react-hooks eslint-plugin-react-refresh @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

# yarn
yarn add eslint eslint-plugin-react-hooks eslint-plugin-react-refresh @typescript-eslint/parser @typescript-eslint/eslint-plugin --dev

# pnpm
pnpm add eslint eslint-plugin-react-hooks eslint-plugin-react-refresh @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

eslint基本使用步骤如下:

  1. 安装eslint:在项目根目录下运行命令 npm install eslint --save-dev 或 yarn add eslint --dev 或 pnpm add eslint --save-dev,将eslint作为开发依赖安装到项目中
  2. 初始化eslint配置文件:在项目根目录下运行命令 eslint --init,根据提示选择配置选项,配置文件(通常为.eslintrc或.eslintrc.json)将会自动生成
  3. 添加规则和插件:在生成的配置文件中,可以根据项目需要添加或修改规则,以及引入需要的插件
  4. 运行eslint:在命令行中运行 eslint yourfile.js 或 eslint . ,其中yourfile.js为需要检查的文件名或目录。eslint将会根据配置文件对代码进行检查,并输出错误或警告信息
  5. 自动修复:运行 eslint --fix yourfile.js 或 eslint --fix . 可以尝试自动修复一部分可修复的问题

typescript-eslint基本使用步骤如下:

  1. 安装typescript-esLint:在项目根目录下运行以下命令
#npm 
npm install @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

# yarn
yarn add @typescript-eslint/parser @typescript-eslint/eslint-plugin --dev

#pnpm
pnpm add @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev
  1. 配置eslint和@typescript-eslint插件:在生成的eslint配置文件中,需要指定解析器为@typescript-eslint/parser,并使用@typescript-eslint/eslint-plugin提供的规则和插件

eslint配置文件如下(以.eslintrc为例):

module.exports = {
  root: true,
  env: { browser: true, es2020: true },
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:react-hooks/recommended',
  ],
  ignorePatterns: ['dist', '.eslintrc.cjs'],
  parser: '@typescript-eslint/parser',
  plugins: ['react-refresh'],
  rules: {
    'react-refresh/only-export-components': [
      'warn',
      { allowConstantExport: true },
    ],
    '@typescript-eslint/ban-ts-comment': 'off'
  }
}

以下为结合 lint-staged 配置的代码检查命令:

{
  "scripts": {
    "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
    "lint:fix": "eslint . --ext ts,tsx --fix",
  },
  "lint-staged": {
    "*.(ts|tsx)": [
      "eslint --quiet"
    ]
  }
}

7.代码美化:prettier

prettier是一个代码格式化工具,它可以自动调整代码的格式,使其符合统一的风格规范

基本使用如下:

  1. 安装依赖
# npm 
npm install prettier --save-dev

# yarn
yarn add prettier --dev

#pnpm
pnpm add prettier --save-dev
  1. 配置prettier,可以使用 .prettierrc 文件或 package.json 文件中的 prettier 字段,下面以 package.json 为例:
{
  "prettier": {
    "trailingComma": "all",
    "arrowParens": "always",
    "printWidth": 120
  }
}

实际应用时会在 commit 之前进行美化代码,以下为结合 lint-staged 配置的代码检查+代码美化命令:

{
  "prettier": {
    "trailingComma": "all",
    "arrowParens": "always",
    "printWidth": 120
  },
  "lint-staged": {
    "*.(ts|tsx)": [
      "eslint --quiet"
    ],
    "*.(ts|tsx|json|html)": [
      "prettier --write"
    ]
  }
}

8.总结

  1. 介绍了前端基本工程化配置(代码健壮性、代码可读性、commit规范相关),以及相关工具
  2. 介绍了husky使用
  3. 介绍了lint-staged使用
  4. 介绍了commitlint使用
  5. 介绍了eslint、typescript-eslint使用
  6. 介绍了prettier使用
更多推荐

php程序设计的基本原则

单一职责原则(SRP):一个类应该只有一个原因引起变化,即一个类应该只负责一项职责。classUser{private$name;private$email;publicfunction__construct($name,$email){$this->name=$name;$this->email=$email;}pu

HTML5 游戏开发实战 | 俄罗斯方块

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏看似简单但却变化无穷,游戏过程仅需要玩家将不断下落的各种形状的方块移动、翻转,如果某一行被方块充满了,那就将这一行消掉;而当窗口中无法再容纳下落的方块时,就宣告游戏结束。可见俄罗斯方块的需求如下。(

AI+游戏线下沙龙活动暨COC上海城市开发者社区8月活动

引言近年来,随着人工智能技术的不断发展和游戏开发技术的不断更新,越来越多的游戏公司开始将人工智能技术应用于游戏领域,以提高开发效率、降低成本,实现游戏玩家更好的游戏体验。为了探讨AI+游戏的技术实践经验,近日在亚马逊会议中心举办了一场以AI+游戏为主题的技术研讨会。在AI+游戏的技术实践研讨会上,与会者们分享了一些关于

云游戏下,会带来哪些技术变革

云游戏前言元宇宙是什么?云游戏的福利云游戏包括哪些技术前言大家好,在这里给大家介绍一个新名词----云游戏。可能有一些小伙伴了解过一些,也有一些小伙伴可能没有了解过,那这里就带大家了解一下元宇宙里的云游戏。2023年,如果说到什么最火🔥,什么最流行,那肯定是非元宇宙莫属了。自从2021年来,元宇宙就如同那雨后春笋一样

方案:数智化视频AI技术为智慧防汛筑基,构建防汛“数字堤坝”

一、背景分析在过去的几年中,全球气候变化导致许多城市在雨季面临严重的洪涝灾害。这些灾害不仅对人们的生命安全和财产造成威胁,也影响了城市的正常运转。传统的防汛手段主要依赖人力监控和应急指挥,但存在响应速度慢、处理效率低等问题。因此,我们需要一种智能、高效的解决方案来提高防汛效率和降低洪涝灾害的影响。随着新一代信息技术的普

【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?

作者主页:Designer小郑作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。主打方向:Vue、SpringBoot、微信小程序本文讲解了Java中集合类LinkedList的语法、使用说明和应用场景,并给出了样例代码。目录一、什么是Lin

[C++入门]---List的使用及模拟实现

文章目录1.list的介绍2.list的使用2.1list的构造函数2.2listmodifiers2.3listcapacity2.4listelmentaccess2.5iterator的使用3.list的模拟实现3.1list的源码1.list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,

【Java 基础篇】深入理解Java HashMap:使用注意事项和性能优化

Java是一种广泛使用的编程语言,而集合是Java编程中不可或缺的一部分。在Java的集合框架中,HashMap是一个常用的数据结构,用于存储键值对。本文将深入介绍HashMap集合,从基础到高级用法,帮助您更好地理解和利用它。什么是HashMap?HashMap是Java集合框架中的一个类,它实现了Map接口,用于存

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows

求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows大家好我是艾西,最近研究了下l4d2(求生之路2)这款游戏的搭建以及架设过程。今天就给喜欢l4d2这款游戏的小伙伴们分享下怎么搭建架设一个自己的服务器。毕竟自己当服主是热爱游戏每一个人的梦想,在自己的服务器里为所欲为在游戏里成就自己。(注:因PT原因本文

RocketMQ消息的分类

一、普通消息1消息发送分类Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。同步发送消息同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。异步发送消息异步发送消息是指,Producer发出消息后无需等待

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录一、页面跳转间的传统的数据传递方式1、传统的数据传递方式-Bundle传递数据1、Navigation组件中的Bundle数据传递2、传统数据传递实现步骤3、FragmentA完整代码示例4、FragmentB完整代码示例5、执行结果2、使用Bundle传递数据安全性差二、页面跳转间的传统的数据传递方式1、导入

热文推荐