ESLint插件共享settings不生效及重复加载慢如何解决
问题解答
settings配置的生效逻辑
ESLint的共享settings特性不支持插件侧直接预配置,在插件入口导出settings对象的写法不会生效:ESLint仅会从用户侧的配置文件(如.eslintrc、eslint.config.js)读取settings字段做全局合并,不会主动拉取插件导出的settings作为默认值注入运行时。
官方文档提到的“插件可通过settings共享信息”,实际含义是插件规则可以通过执行上下文读取用户在配置文件中声明的共享配置,并非允许插件自行注入全局settings。
JSON黑名单重复加载问题的最优解
这个场景不需要依赖settings特性,利用Node.js原生的模块缓存机制即可实现单次Lint执行周期内仅加载一次JSON文件,无额外性能损耗:
- 将JSON文件的加载逻辑写在规则文件的模块顶层,不要放在规则的
create方法内 - Node.js首次加载该JSON文件后会自动将解析结果存入模块缓存,后续所有规则实例运行时直接读取内存中的缓存值,不会重复触发磁盘IO
正确的规则写法示例:
// 规则文件顶层:模块首次被引入时执行,整个Lint进程仅运行1次 const importBlacklist = require('./path/to/import-blacklist.json'); module.exports = { meta: { // 规则元配置 }, create(context) { // 直接使用顶层加载的黑名单即可,无需在create内重复读取文件 return { ImportDeclaration(node) { const importPath = node.source.value; if (importBlacklist.includes(importPath)) { context.report({ node, message: `导入项 ${importPath} 属于禁止导入的黑名单内容` }) } } } } }
补充说明
如果需要给插件相关的settings设置默认值,直接在规则内读取context.settings时做兜底赋值即可,不需要在插件入口导出settings,示例:
// create方法内读取配置时做兜底 const pluginConfig = context.settings?.yourPluginNamespace ?? { defaultConfig: 'value' };
针对静态导入黑名单的场景,顶层加载JSON是实现成本最低、性能最好的方案,不需要通过settings传递数据。
内容的提问来源于stack exchange,提问作者Bartlomiej Lewandowski
相关产品推荐
相关产品推荐

