不能。husky仅是Git Hooks注册工具,不执行格式化;真正格式化由lint-staged调用prettier等工具完成,其pre-commit钩子应配置为“npx lint-staged”,并确保.lintstagedrc或package.json中定义匹配文件类型与对应命令(如prettier --write)。

husky 能不能直接格式化代码?
不能。husky 本身只是 Git Hooks 的注册工具,它不执行格式化逻辑,只负责在 pre-commit 这类钩子触发时运行你指定的命令。真正干活的是 lint-staged 或 prettier 这类工具。所以配置 husky 的关键不是“让它格式化”,而是“让它调用能格式化的工具”。
pre-commit 钩子里该写什么命令?
推荐用 lint-staged,它只处理暂存区(git add 过)的文件,速度快、不误伤,且天然支持多语言规则分发。常见写法:
- 安装依赖:
npm install --save-dev husky lint-staged - 初始化 husky:
npx husky install - 添加 pre-commit 钩子:
npx husky add .husky/pre-commit "npx lint-staged" - 在
package.json中加lint-staged配置段,例如:
"lint-staged": {
"*.{js,ts,jsx,tsx}": ["prettier --write", "eslint --fix"],
"*.{css,scss,less}": ["prettier --write", "stylelint --fix"],
"*.{json,md,yml}": ["prettier --write"]
}
注意:这里用的是 prettier --write 而不是 prettier --check,后者只校验不改写,起不到自动格式化作用。
为什么提交时没触发格式化?常见断点
实际跑不通往往卡在这几个地方:
-
.husky/pre-commit文件权限不是可执行(Linux/macOS 下需chmod +x .husky/pre-commit) -
lint-staged配置里匹配的 glob 模式和你git add的文件后缀不一致(比如写了*.css却提交了index.scss) - 项目里没装
prettier或stylelint的本地依赖(npx会优先找本地node_modules/.bin,全局安装无效) -
prettier命令找不到配置文件(如.prettierrc),导致按默认规则格式化,和团队预期不符
VSCode 保存格式化和 husky 提交前格式化要不要共存?
要,但得明确分工:
- VSCode 保存时用
prettier快速统一基础风格(缩进、引号、空行等) - husky +
lint-staged在提交前兜底:修复 VSCode 没覆盖的规则(比如 CSS 属性顺序、JSX 属性换行)、防止漏掉未保存的文件、阻断不符合规范的提交 - 两者规则必须一致——所有格式化配置(
.prettierrc、.stylelintrc.json)都得放在项目根目录并提交进 Git,否则 VSCode 和 husky 可能读到不同版本
最易被忽略的是:VSCode 默认不会读取项目级 Prettier 配置,除非你装了 esbenp.prettier-vscode 插件且没禁用它对本地配置的识别。如果发现保存和提交后格式不一致,先检查插件设置里是否勾选了 “Prettier: Use Editor Config” 和 “Prettier: Resolve Global Modules”。











