ESLint 插件安装后为什么规则不生效?
我装了个 eslint-plugin-react,也配了 extends,但自定义规则好像没起作用,是我哪里漏了吗?
我的 .eslintrc.js 配置里写了 "plugin:react/recommended",但像 react/no-unescaped-entities 这种规则还是不会报错。
module.exports = {
extends: ['plugin:react/recommended'],
plugins: ['react'],
rules: {
'react/no-unescaped-entities': 'error'
}
};
npm list eslint-plugin-react看看版本对不对。然后这个配置看起来基本没问题,但建议把 extends 写完整路径试试:
别忘了在文件开头加上注释指定要用的 parser,要不然规则可能识别不了:
// eslint-disable-next-line no-unused-vars/* eslint-env es6 */最后重启一下你的编辑器或者 ESLint server,有时候缓存的问题也挺烦人的。改一下就行,应该就能生效了。要是还不行就看看控制台报啥错误信息。
plugins和extends的顺序搞反了,而且没注意extends里已经隐式包含了插件注册,但如果你还手动写plugins,就可能产生覆盖或冲突,特别是当某些规则依赖插件正确加载时,顺序和写法必须严格按 ESLint 的解析逻辑来。ESLint 在解析配置时,是按以下顺序处理的:
1. 先加载
plugins字段,注册插件(比如eslint-plugin-react)2. 再处理
extends字段,它会引入其他配置(比如plugin:react/recommended)3. 最后合并
rules字段,覆盖已有的规则配置但问题在于,
plugin:react/recommended这个配置本身已经自动注册了react插件,你再在plugins里手动写一遍,虽然理论上 ESLint 不会报错,但某些版本(尤其是 ESLint v8+)对插件重复注册敏感,或者当你用eslint-plugin-react版本较老时(比如 v16 之前),它要求plugins必须显式声明,而extends里的plugin:xxx/recommended并不会自动加到plugins里——但反过来,如果你写了plugins却没写对位置,或者写在extends之后,就可能被覆盖或忽略。更关键的是:很多 ESLint 插件的规则只有在插件被正确注册后,才能被识别和应用。比如
react/no-unescaped-entities是eslint-plugin-react提供的自定义规则,如果插件没注册好,ESLint 根本不认识这个规则名,它会当作“未知规则”直接忽略,或者在 ESLint v9+ 里直接报错(取决于unknownRules的配置)。我见过太多人卡在这里,以为是规则本身写错了,其实根本是插件没生效。验证方法很简单:在终端跑
npx eslint --print-config your-file.js,看输出里rules里有没有react/no-unescaped-entities,如果压根没出现,说明插件根本没加载。所以正确写法是:
但等等,还有个隐藏坑点:你用的 eslint-plugin-react 版本是不是太老了?
在 v16.x 及之前,
plugin:react/recommended并不会自动启用所有推荐规则(比如react/no-unescaped-entities是在 v16.0.0 才被加进 recommended 的),如果你用的是 v15 或更早版本,这个规则压根不在 recommended 里,自然不会生效。你可以运行
npm ls eslint-plugin-react看版本,如果低于 v16,建议升级:npm i -D eslint-plugin-react@latest升级后,再确认
plugin:react/recommended里确实包含react/no-unescaped-entities。你也可以自己去node_modules/eslint-plugin-react/config/recommended.js里翻一翻,看有没有这一行:'react/no-unescaped-entities': ['error', { ... }]如果没看到,说明你用的版本确实太老了。
另外,如果你用了 ESLint v9+,还要注意
override配置会不会把rules给覆盖了。比如有些项目在overrides里写了rules: {},但没加react/no-unescaped-entities,那全局配置的 rules 就被局部覆盖掉了。最后再给个最保险的写法,确保万无一失(尤其适合多团队协作项目):
顺带说一句,
react/no-unescaped-entities这个规则默认只检查 JSX 中的未转义字符(比如),如果你在普通字符串里写"hello & world",它不会报错——除非你配置了jsx: false,但那样会失去 JSX 语义检查的意义。所以建议保留默认行为,只调整allow列表。最后检查一遍:
- 插件装了没?
npm ls eslint-plugin-react- ESLint 能找到插件?
node_modules里有eslint-plugin-react目录- 配置文件名对不对?
.eslintrc.js、.eslintrc.cjs、.eslintrc.json都能被识别,但别写成.eslintrc.js.txt这种低级错误(真有人这么干过)- ESLint 版本够新?
npx eslint --version建议 v8.40+ 或 v9+跑完
npx eslint src/your-file.jsx,看有没有报错。如果还是没动静,就用--debug参数看看插件加载日志:npx eslint src/your-file.jsx --debug一般日志里会出现类似
ESLint plugin: react loaded的输出,如果没这行,说明插件根本没注册上,那就是路径或版本问题了。