1. 问题来了:当你的代码提交突然“卡壳”
最近在给一个Vue3 + Vite + TypeScript的新项目配置代码规范工具链,想把事情做得漂亮点。ESLint负责代码风格,commitlint负责提交信息格式,再用lint-staged搞个提交前自动检查,感觉一切都很完美。但就在我兴冲冲地敲下 git commit -m "feat: init project" 之后,控制台却给我泼了一盆冷水。
首先跳出来的是一个警告,黄底黑字,格外扎眼:
⚠ Some of your tasks use `git add` command. Please remove it from the config since all modifications made by tasks will be automatically added to the git commit index.
翻译过来就是:“警告:你的一些任务使用了 git add 命令。请从配置中移除它,因为所有由任务进行的修改都会自动添加到 Git 提交索引中。”
我当时的第一反应是有点懵。git add?我配置里哪里写了这个?而且,为什么它会和 commitlint 扯上关系?这个警告直接导致我的提交流程被中断了,代码提交不上去,卡在了半路。这感觉就像你开车上路,突然仪表盘亮起一个看不懂的故障灯,虽然车还能动,但你知道肯定哪里不对劲,不敢继续开了。
紧接着,在我尝试解决第一个问题,或者在某些配置变动后,第二个更棘手的错误又冒了出来。这个错误信息更长,核心是:
Error [ERR_REQUIRE_ESM]: require() of ES Module ...\commitlint.config.js ... not supported.
它告诉我,我的 commitlint.config.js 文件被当作 ES 模块(ES Module)了,但是有东西试图用 CommonJS 的 require() 方式去加载它,于是直接报错,提交校验彻底失败。
这两个问题,一个警告一个错误,直接把我的规范化提交流程给“堵死”了。如果你也正在从零搭建 Vue3 + Vite + TS 的项目工程化体系,很可能会和我踩进同一个坑。别担心,这两个问题其实都很典型,根源在于我们混合使用多个工具时,对它们各自的“工作方式”和“模块化规范”理解不够清晰。接下来,我就带你一步步拆解,看看它们到底是怎么发生的,以及如何干净利落地解决掉。
2. 拆解第一个冲突:lint-staged 与 commitlint 的“抢活”现场
我们先来集中火力解决第一个警告。要理解这个冲突,我们得把几个“演员”请上台,看看他们各自在提交这场戏里扮演什么角色。
lint-staged,顾名思义,就是“只对暂存区(staged)文件进行 lint 检查”的工具。它的工作流程非常直观:当你执行 git commit 时,lint-staged 会拦截这次提交,然后找出所有已经被 git add 到暂存区的文件(比如你修改了的 src/App.vue 和 src/utils.ts),并针对这些文件运行你预设的命令(比如 eslint --fix 和 prettier --write)。它的核心价值在于快,只检查即将提交的代码,而不是整个项目。
那么,git add 命令在这里是干嘛的呢?在我最初的 package.json 配置里,lint-staged 的部分大概是这样的:
{
"lint-staged": {
"*.{js,ts,vue}": [
"eslint --fix",
"git add ."
]
}
}
我当时的思路是这样的:eslint --fix 命令会自动修复一些基本的格式问题,但修复动作会改变文件内容。这些改变只是发生在工作区,并没有被自动添加到暂存区。如果我不加 git add .,那么最终提交的内容,还是修复前的旧代码。所以,我加这一句的目的,是希望把 ESLint 自动修复后的结果,重新添加到暂存区,确保提交出去的是“干净”的代码。
commitlint 又是干什么的呢?它是一个用于校验 Git 提交信息格式的工具。它不关心你改了哪些代码文件,只关心你写的 commit message 是否符合规范(比如是否遵循了 feat:、fix:、docs: 这样的约定式提交格式)。它通常通过 Git 的 commit-msg 钩子来触发。
现在,冲突点就清晰了。当我执行 git commit


368

被折叠的 条评论
为什么被折叠?



