在半年前就发现我很多项目里的 prettier 对 vue 内的 pug 不起效果了,我一直以为是我的问题,例如 VSCode 的扩展配置有问题啦、依赖安装不对啦之类的。

在我浪费了一个小时的人生去查找 GitHub 上的各种 issues 后,我发现这居然是个 prettier 的兼容性 bug:

[Bug?] Symlink’d plugins in node_modules are not auto detected. #8056

简单概括一下内容:使用 pnpm 时,prettier 的插件寻址机制未按预期那样起作用。

我正是在大约半年前由 yarn 转向了 pnpm,因此遇到了这个 bug。

关于这个 bug,官方摆烂了,因为这个 issue 最初是在 2020 年被提出的,至今没有进行修复。

最后还是万能的网友提出了解决方案:使用 js 配置文件显式的指定插件路径。

比如这样:

1
2
3
4
5
// .prettierrc.cjs
module.exports = {
plugins: [require.resolve('@prettier/plugin-pug')],
// ...
}

然后插件就起效果了……

我顺着这个 issue 看了一路,这个 bug 的原因大概是这样的:

prettier 的插件寻址机制是仅查看本体同级的 node_modules 文件夹以 @prettier/plugin-* prettier-plugin-* 命名的文件夹。但是使用 pnpm 时,prettier 的真实地址是 node_modules/.pnpm/prettier@<version>/node_modules/prettier/index.js

这样一来同级的 node_modules 就变成了 node_modules/.pnpm/prettier@<version>/node_modules/

而这个文件夹显然只有一个 prettier,因此它按照既有逻辑是无论如何也找不到本地插件的……