prettier
prettier
是一款广受欢迎的代码格式化工具,它支持许多语言和文件格式,包括 JavaScript
、TypeScript
、CSS
、HTML
、Markdown
等。Prettier
的主要作用是自动格式化代码文件,确保代码风格的一致性。
prettier 的使用
安装 prettier 和 prettier VSCode插件
bash
npm install prettier -D
prettier
VSCode 插件让我们可以使用快捷键对项目进行格式化
CLI
我们可以使用 prettier 命令来运行 prettier
bash
prettier [options] [file/dir/glob ...]
# 格式化当前目录及其子目录中 prettier 支持的所有文件
prettier --write .
退出代码
代码 | 信息 |
---|---|
0 | 一切格式正确 |
1 | 有些东西格式不正确 |
2 | Prettier 出了点问题 |
如果 prettier 不能正确的格式化代码,prettier 命令则会返回 非0
的退出状态码
配置化
prettier
有默认的格式化规则,同时也提供了丰富的配置选项,如果我们有自定义规则的需求可以在项目根目录中新增 .prettierrc.js
文件,然后在其中指定你的自定义规则。
json
// .prettierrc.js 文件
module.exports = {
printWidth: 100,
tabWidth: 2,
useTabs: false,
semi: false,
}
详细信息可以看官网的配置项:prettier.io/docs/en/opt...
VSCode指定格式化工具
然而,在实际开发中可能会出现这样一种情况,虽然已经安装了 prettier
并创建了配置文件,但格式化后的代码并非是我们预期的结果。这可能是因为 VSCode 编辑器没有正确使用到 prettier
工具,此时我们需要在 .vscode目录下的 setting.json
文件中明确指定格式化工具。
json
// setting.json
{
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
上面的代码就指定了vue、javascript、typescript等格式的文件都用prettier VScode插件进行格式化。
最理想的情况是,在提交代码前自动进行代码格式化,确保代码的规范性。这个任务可以通过 lint-staged
来实现,它是一个能在git暂存文件上运行linters的工具。 原理是在 git commit
前触发 pre-commit
钩子,执行定义好的格式化命令。
lint-staged
lint-staged
是一个在 git 暂存文件(被git add 的文件)上运行 liters 的工具。
安装 lint-staged
bash
npm install lint-staged -D
在package.json中定义
json
{
"lint-staged": {
"*": "prettier --write"
}
}
验证 lint-staged 的作用
现在暂存区的文件改动为:
执行 pnpm lint-staged
或 npm exec lint-staged
命令后,暂存区的文件为:
可以看到已经对暂存区的文件成功执行了 prettier write
此外, 为了让 pre-commit
钩子在提交前自动执行,我们还需要借助一个名为 husky
的工具。Husky
能够帮助我们管理和触发 git hooks
。
husky
关于 husky
在我之前文章有介绍过:前端项目使用husky、commitlint/cli实现git提交规范&一些坑,大家可以通过这篇文章了解husky的使用。
总而言之,husky
能让我们监听 git hooks
,在 hook 执行期间执行我们定义好的脚本。
如我们想要实现提交代码时自动修改代码格式,则需要监听 pre-commit
钩子。
husky 旧版使用
安装好 husky
我们在 package.json 中定义
json
{
"husky": {
"hooks": {
"pre-commit": "pnpm lint-staged"
}
},
"lint-staged": {
"*": [
"prettier --write",
]
}
}
husky 新版(6.0.0+)使用
旧版的 husky
会在 .git/hooks
目录下创建所有类型的 git hooks
。新版的 husky
使用了从 git 2.9
开始引入的一个新功能 core.hooksPath
。core.hooksPath
可以让你指定 git hooks
所在的目录而不是使用默认的 .git/hooks/
。
我们可以执行 husky install
将 git hooks
的目录指定为 ./husky
,然后使用 husky add
命令向 ./husky/
中添加 hook
安装 huksy
bash
npm install husky -D
添加prepare脚本
json
{
"scripts": {
"prepare": "husky install"
}
}
新版本中执行 husky init
能帮我们更新 package.json
文件中的 prepare
命令并初始化 ./husky
目录下的 pre-commit
脚本。
添加 pre-commit hooks
bash
npx husky add .husky/pre-commit "npm exec lint-staged"
上面的代码就是在 pre-commit
期间执行 pnpm lint-staged
命令,而 pnpm lint-staged
命令则是在给暂存区的文件执行 prettier --write
进行代码格式化。
验证
通过上图能知道,执行 git commit
前 h1 标签是没有经过 prettier
格式化的。
当我们执行 git commit
后,能看到 pre-commit
运行的脚本对代码进行了格式化处理。
如果是 Vue3 项目,可以在进行提交时使用 vue-tsc
进行类型检查,package.json
修改为
json
{
"scripts": {
"check": "vue-tsc --noEmit",
},
}
pre-commit
脚本为
bash
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run check && npm exec lint-staged
如果 vue-tsc
检测出有不存在的类型,vue-tsc
就会返回非0的状态码,pre-commit
钩子接收到非0的状态码就会中断 git 提交过程。