如何在自定义 ESLint 规则中检测特定函数调用? Mc.星语 提问于 2026-02-23 22:33:17 阅读 16 工具 我正在写一个 ESLint 自定义规则,想检测代码里有没有调用 dangerousFunction,但不知道怎么准确匹配 CallExpression。试了几次都没生效,规则好像没触发。 这是我的测试代码: function test() { dangerousFunction('hello'); safeFunction('world'); } ESLint 我来解答 赞 4 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Zz舒昕 Lv1 当时我也卡在这,CallExpression 匹配不生效主要是因为没正确判断 callee 的类型。ESLint 里要匹配函数调用,得先确认是 CallExpression,再检查它的 callee 是不是 Identifier 且 name 是 'dangerousFunction'。 你规则里大概率是直接用了 CallExpression 就完事,但没过滤 callee,结果像 obj.dangerousFunction() 或 importedFn() 这类情况就漏掉了。 正确的匹配方式是这样写: module.exports = { meta: { type: 'problem', docs: { description: '禁止调用 dangerousFunction' }, schema: [] }, create(context) { return { CallExpression(node) { const callee = node.callee; if (callee.type === 'Identifier' && callee.name === 'dangerousFunction') { context.report({ node, message: '禁止调用 dangerousFunction' }); } } }; } }; 如果你还要支持 dangerousFunction() 是从模块导入的情况(比如 import { dangerousFunction } from 'xxx'),那得加额外逻辑判断 symbol,但基础场景上面这个就够了。我一开始就是漏了 callee.type === 'Identifier' 这步,一直以为 ESLint 没触发,其实规则跑得挺正常,只是条件太宽没匹配到。 回复 点赞 3 2026-02-24 18:08 景景 ☘︎ Lv1 懒人方案:直接匹配 CallExpression,然后判断 callee 的 name 是不是 "dangerousFunction",ESLint rule 里这么写就行: module.exports = { meta: { type: 'problem' }, create(context) { return { CallExpression(node) { if (node.callee.type === 'Identifier' && node.callee.name === 'dangerousFunction') { context.report({ node, message: '禁止调用 dangerousFunction' }); } } }; } }; 回复 点赞 4 2026-02-23 23:04 加载更多 相关推荐 2 回答 35 浏览 ESLint插件如何自定义规则来检测特定代码模式? 最近在尝试通过ESLint插件来自定义一条规则,目的是检查项目中是否有直接使用了`alert()`函数的情况。我按照文档开始编写自己的规则,但是遇到了一些麻烦。 module.exports = { ... Mc.子武 工具 2026-01-25 15:42:26 2 回答 30 浏览 为什么我的自定义ESLint规则无法正确触发? 我在开发一个检查函数参数数量的ESLint插件,规则逻辑写好了但总不生效。比如写个加法函数:add(a, b)应该通过,但调用add(a)时规则没报错。 规则配置是这样的: module.export... Code°紫瑶 工具 2026-02-19 18:36:25 1 回答 17 浏览 ESLint 插件安装后为什么规则不生效? 我装了个 eslint-plugin-react,也配了 extends,但自定义规则好像没起作用,是我哪里漏了吗? 我的 .eslintrc.js 配置里写了 "plugin:react/recom... 书生シ奕玮 工具 2026-02-27 06:34:18 2 回答 29 浏览 ESLint规则冲突导致技术债务增加该怎么平衡? 最近团队统一了ESLint配置,但发现某些规则在紧急迭代时特别影响效率。比如必须用立即执行函数包裹组件逻辑,但快速修Bug时总想直接导出函数。 试过把规则设为warn,但同事说这样失去规范意义。现在每... Mr.夏沫 前端 2026-01-26 16:36:24 2 回答 17 浏览 为什么我的ESLint在GitHub Actions中检测到错误但构建还是通过了? 我给项目配置了ESLint,并在GitHub Actions里加了lint检查步骤。但今天提交了一个明显违反规则的代码(比如少了个分号),控制台确实输出了错误,但最后构建状态还是显示成功了。我检查了.... UE丶玉霞 工具 2026-02-15 19:11:32 1 回答 41 浏览 ESLint extends配置继承后规则冲突怎么办? 在项目里同时用了eslint:recommended和公司自定义的配置,结果no-console规则冲突了。我尝试在根配置里覆盖规则,但保存时还是报错:Error: Definition for ru... シ福萍 工具 2026-02-04 13:08:26 2 回答 50 浏览 ESLint配置extends继承后自定义规则不生效怎么办? 我在项目里用eslint-config-airbnb配置了基础规范,然后在项目根目录的.eslintrc.js里加了自定义规则: module.exports = { extends: ['airbn... 萌新.付楠 工具 2026-01-31 18:47:29 2 回答 49 浏览 ESLint的no-undef规则为什么还是会报未定义变量? 大家好,我在项目里启用了ESLint的no-undef规则,但代码里明明已经声明的全局变量 还是会被标记为未定义。比如在vue文件顶部写了window.myVar = 'test' 后面使用时提示"m... 皇甫静依 工具 2026-01-30 23:21:24 1 回答 28 浏览 Prettier 和 ESLint 冲突了怎么办? 我用 create-react-app 搭了个项目,装了 Prettier 和 ESLint,但它们格式化规则老打架。比如 ESLint 要求分号,Prettier 却自动删掉,保存时一会儿加一会儿删... Newb.梓涵 工具 2026-02-26 22:52:21 2 回答 28 浏览 ESLint在GitHub Actions报错但本地正常,如何解决配置差异? 在给项目配置GitHub Actions时,ESLint突然报错Error: Definition for rule 'comma-dangle' was not found,但本地运行npx esl... 一世杰 工具 2026-02-09 19:13:22
你规则里大概率是直接用了
CallExpression就完事,但没过滤 callee,结果像obj.dangerousFunction()或importedFn()这类情况就漏掉了。正确的匹配方式是这样写:
如果你还要支持
dangerousFunction()是从模块导入的情况(比如import { dangerousFunction } from 'xxx'),那得加额外逻辑判断 symbol,但基础场景上面这个就够了。我一开始就是漏了callee.type === 'Identifier'这步,一直以为 ESLint 没触发,其实规则跑得挺正常,只是条件太宽没匹配到。