前端闲聊系列(3):几个提升代码质量的工具,比如ts,eslint,prettier

517 阅读5分钟

概述

本文会聊一聊提升代码质量的几个工具。 一方面是用于代码开发阶段的ts、eslint和prettier,这三个都是借助于ide对编辑中的源码给予提示,会分别利用ast对代码的类型、代码质量和格式三方面发挥作用。

另一方面是git 提交阶段的husky、lint-staged、@commitlint,分别负责创建git hook,对staged阶段的代码执行lint等操作和检查commit message,防止不规范代码进入版本管理。

以上工具都需要对应的配置文件。

typescript

ts是侵入性最强的一个工具,以至于通常被称为一种语言,主要给js添加了类型注释(另外还有一些区别于js的功能,比如enum),从而实现了js的静态类型分析,在代码运行之前就就可以捕获到潜在的错误。

ts的代码到最终的运行,需要经历一次到js的编译过程,这个过程可以由tsc实现,但实际的使用中会交给babel处理,tsc只负责类型。

vscode对ts提供了支持,在下载typescript lib的前提下会进行对应提示和报错。

书写规则

ts是js的超集,由js过渡到ts主要是学会对类型的运用,大致分为这么几部分

类型注释

就是给各种出现在代码中的标识符注释对应的类型。

其中类型又可以分为基本类型和表达式类型。

  • 前者比如string或number等js中的primary type和any等ts中定义的部分。
  • 后者是基本类型的组合,比如多个基本类型组合成array或者function。

无论是哪一种类型都是为了明确该标识符的具体用法,这个用法会在使用时进行提示,如果进行了规定之外的使用就会报错,也因此会对代码重构有很大帮助。

类型推断

如果对使用的标识符没进行类型注释时,这就需要ts自己推断可能的类型。

这里可以分为三种情况

  • 最通用的类型,比如对一个用let定义的字面量类型,let a = 'a',通常会推断为string,如果想被推断成字面量,可以用const声明。
  • 上下文类型,比如通过函数类型,推断其中的参数类型
  • 如果以上方法都无法推断,就推断为any,应该避免这种情况,因为失去了类型的意义。

类型断言

有时候类型推断出来的结果并不是我们想要的,就可以使用断言进行修正,比如上面的例子

let a= 'a' as const

Type Guards

这个是指如果一个标识符可能有多种类型时,比如union,通过type guard可以缩小类型的范围,即当进入一个类型判断有关的控制流时,这个控制流内的类型可能性就被缩小,下一个条件时就会把这种类型排除,比如

function padLeft(padding: number | string, input: string) {
  if (typeof padding === "number") {
    //这时是number类型
    return new Array(padding + 1).join(" ") + input;
  }
  //这时是string类型
  return padding + input;
}

类型兼容

当标识符a的类型不同于标识符b,但前者要赋值给后者时,就要后者的类型兼容于前者,比如参数少的函数会兼容含有另外参数的函数

配置文件

更多的自定义操作需要配置文件,通常是tsconfig.json,可以用来指示哪些文件会被ts处理和怎么处理。

下面大致谈谈几个常用的,详情看文档

files,include,exclude

  • files指定具体需要处理的ts文件
  • include用匹配符批量指定文件
  • exclude用来排除include指定文件中不符合条件的文件

compilerOptions

这里用来指示ts具体怎么工作的,比如以下几类

  • 类型检查相关,比如noImplicitAny会在类型推断为any时报错,用来提示显式声明类型
  • 模块相关,比如项目采用什么模块系统,模块解析的方法,可以用来配置对应目录的alias
  • 输出有关,声明文件和js文件等的输出情况
  • 语言和环境,通过指定语言环境来判断具体的编译行为,比如jsx会据此来决定tsx文件怎么编译

eslint和prettier

eslint原本有两方面的能力,对语法错误和代码风格都可以处理,但第二个功能不如prettier,因此通常是 Prettier for formatting and linters for catching bugs!

两者各自使用直接看文档就可以,ide的集成下载对应插件,并设置成保存时自动修复。

两者的一起使用这里稍微提一下,因为两者的功能有部分重叠,且没必要分别执行,因此有eslint-config-prettier添加到eslint 配置文件中可以去除两者冲突的部分,使用eslint-plugin-prettier可以在执行eslint 时自动执行prettier。

husky、lint-staged、@commitlint

这里我们要做的事是阻止不合格的代码进入远程代码库,和检查commit message,利用的是git hook,如果不利用第三方工具,我们可以直接修改对应文件的内容,其会在git操作的对应动作时自动执行。

  • husky安装后会自动设置对应钩子,免去了手动设置的工作,另外两个包用来简化钩子调用期间的具体操作,这里注意新版本的用法有所不同
  • lint-staged,用来对被git add后的文件执行lint等操作,一方面是只对要提交的代码进行检查,一方面是检查失败停止提交
  • @commitlint 用来对commit message进行检查,如果不符合规范就阻止提交

最后

本文对几个工具做了概括性介绍,主要还是看文档,也可以看我其他总结,其中ts可以参考这篇,其他看这篇,注意因为版本原因产生的影响。

这个仓库用当前最新版本的工具进行了配置,可以参考。