如何在自定义 ESLint 规则中检测特定函数调用? Mc.星语 提问于 2026-02-23 22:33:17 阅读 31 工具 我正在写一个 ESLint 自定义规则,想检测代码里有没有调用 dangerousFunction,但不知道怎么准确匹配 CallExpression。试了几次都没生效,规则好像没触发。 这是我的测试代码: function test() { dangerousFunction('hello'); safeFunction('world'); } ESLint 我来解答 赞 6 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 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 没触发,其实规则跑得挺正常,只是条件太宽没匹配到。 回复 点赞 5 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' }); } } }; } }; 回复 点赞 7 2026-02-23 23:04 加载更多 相关推荐 2 回答 58 浏览 ESLint插件如何自定义规则来检测特定代码模式? 最近在尝试通过ESLint插件来自定义一条规则,目的是检查项目中是否有直接使用了`alert()`函数的情况。我按照文档开始编写自己的规则,但是遇到了一些麻烦。 module.exports = { ... Mc.子武 工具 2026-01-25 15:42:26 2 回答 31 浏览 ESLint 自定义规则怎么检测 CSS 中的 !important? 我想用 ESLint 写个自定义规则,禁止项目里出现 !important,但 ESLint 不是只处理 JS 吗?那怎么分析 CSS 文件里的内容? 我试过在规则里读取文件路径,但拿到的都是 .js... 博主红运 工具 2026-03-07 15:02:23 2 回答 52 浏览 为什么我的自定义ESLint规则无法正确触发? 我在开发一个检查函数参数数量的ESLint插件,规则逻辑写好了但总不生效。比如写个加法函数:add(a, b)应该通过,但调用add(a)时规则没报错。 规则配置是这样的: module.export... Code°紫瑶 工具 2026-02-19 18:36:25 2 回答 34 浏览 ESLint 插件安装后为什么规则不生效? 我装了个 eslint-plugin-react,也配了 extends,但自定义规则好像没起作用,是我哪里漏了吗? 我的 .eslintrc.js 配置里写了 "plugin:react/recom... 书生シ奕玮 工具 2026-02-27 06:34:18 2 回答 47 浏览 ESLint规则冲突导致技术债务增加该怎么平衡? 最近团队统一了ESLint配置,但发现某些规则在紧急迭代时特别影响效率。比如必须用立即执行函数包裹组件逻辑,但快速修Bug时总想直接导出函数。 试过把规则设为warn,但同事说这样失去规范意义。现在每... Mr.夏沫 前端 2026-01-26 16:36:24 1 回答 40 浏览 ESLint自定义规则怎么获取AST节点的父级信息? 我正在写一个ESLint插件,想在遍历AST时拿到当前节点的父节点,但不知道怎么取。 试过在visitor里直接用node.parent,但有时候是undefined,是不是得先开启什么配置? mod... 公孙江梅 工具 2026-03-24 23:43:20 2 回答 42 浏览 为什么我的ESLint在GitHub Actions中检测到错误但构建还是通过了? 我给项目配置了ESLint,并在GitHub Actions里加了lint检查步骤。但今天提交了一个明显违反规则的代码(比如少了个分号),控制台确实输出了错误,但最后构建状态还是显示成功了。我检查了.... UE丶玉霞 工具 2026-02-15 19:11:32 1 回答 62 浏览 ESLint extends配置继承后规则冲突怎么办? 在项目里同时用了eslint:recommended和公司自定义的配置,结果no-console规则冲突了。我尝试在根配置里覆盖规则,但保存时还是报错:Error: Definition for ru... シ福萍 工具 2026-02-04 13:08:26 2 回答 68 浏览 ESLint配置extends继承后自定义规则不生效怎么办? 我在项目里用eslint-config-airbnb配置了基础规范,然后在项目根目录的.eslintrc.js里加了自定义规则: module.exports = { extends: ['airbn... 萌新.付楠 工具 2026-01-31 18:47:29 2 回答 78 浏览 ESLint的no-undef规则为什么还是会报未定义变量? 大家好,我在项目里启用了ESLint的no-undef规则,但代码里明明已经声明的全局变量 还是会被标记为未定义。比如在vue文件顶部写了window.myVar = 'test' 后面使用时提示"m... 皇甫静依 工具 2026-01-30 23:21:24
你规则里大概率是直接用了
CallExpression就完事,但没过滤 callee,结果像obj.dangerousFunction()或importedFn()这类情况就漏掉了。正确的匹配方式是这样写:
如果你还要支持
dangerousFunction()是从模块导入的情况(比如import { dangerousFunction } from 'xxx'),那得加额外逻辑判断 symbol,但基础场景上面这个就够了。我一开始就是漏了callee.type === 'Identifier'这步,一直以为 ESLint 没触发,其实规则跑得挺正常,只是条件太宽没匹配到。