ESLint自定义规则怎么获取AST节点的父级信息? 公孙江梅 提问于 2026-03-24 23:43:20 阅读 11 工具 我正在写一个ESLint插件,想在遍历AST时拿到当前节点的父节点,但不知道怎么取。 试过在visitor里直接用node.parent,但有时候是undefined,是不是得先开启什么配置? module.exports = { create(context) { return { Identifier(node) { // 这里想访问 node.parent,但经常是 undefined console.log(node.parent); } }; } }; ESLintRule开发 我来解答 赞 3 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 长孙怡瑶 Lv1 试试这个方法。ESLint 的 AST 节点默认情况下是没有 parent 属性的,所以你需要手动给每个节点添加 parent 引用。你可以通过 eslint-scope 或者 eslint-utils 来处理,但最简单的方法是在遍历 AST 之前先构建 parent 映射。ESLint 提供了一个工具 eslint-visitor-keys 可以帮助你做这件事。 首先,安装 eslint-visitor-keys: npm install eslint-visitor-keys --save-dev 然后,在你的插件里这样用: const visitorKeys = require('eslint-visitor-keys'); module.exports = { create(context) { const sourceCode = context.getSourceCode(); const ast = sourceCode.ast; // 构建 parent 映射 function traverse(node, parent) { if (node && typeof node === 'object') { node.parent = parent; visitorKeys.unionWith(node.type).forEach(key => { if (Array.isArray(node[key])) { node[key].forEach(child => traverse(child, node)); } else if (node[key] && typeof node[key].type === 'string') { traverse(node[key], node); } }); } } traverse(ast, null); return { Identifier(node) { // 现在可以访问 node.parent 了 console.log(node.parent); } }; } }; 这样,当你遍历 AST 的时候,每个节点都会有一个 parent 属性指向它的父节点,就不会再出现 undefined 的情况了。希望这能帮到你。 回复 点赞 2026-03-25 00:02 加载更多 相关推荐 1 回答 17 浏览 ESLint 自定义规则怎么检测 CSS 中的 !important? 我想用 ESLint 写个自定义规则,禁止项目里出现 !important,但 ESLint 不是只处理 JS 吗?那怎么分析 CSS 文件里的内容? 我试过在规则里读取文件路径,但拿到的都是 .js... 博主红运 工具 2026-03-07 15:02:23 1 回答 15 浏览 Astro里怎么在SSR模式下获取请求头信息? 我在用Astro做服务端渲染,想根据请求头里的User-Agent来判断设备类型,但不知道怎么拿到原始请求对象。文档里说可以用API路由,但我是在页面组件里直接处理的,试了globalThis.req... 程序员子尧 框架 2026-03-20 21:24:19 2 回答 23 浏览 如何在自定义 ESLint 规则中检测特定函数调用? 我正在写一个 ESLint 自定义规则,想检测代码里有没有调用 dangerousFunction,但不知道怎么准确匹配 CallExpression。试了几次都没生效,规则好像没触发。 这是我的测试... Mc.星语 工具 2026-02-23 22:33:17 2 回答 40 浏览 前端构建时集成SAST工具总是报错怎么办? 在Webpack项目里尝试用ESLint插件集成SAST工具做静态扫描,配置了eslint-plugin-security后,构建时提示Cannot read properties of undefi... IT人梦轩 安全 2026-02-17 18:45:25 2 回答 44 浏览 ESLint插件如何自定义规则来检测特定代码模式? 最近在尝试通过ESLint插件来自定义一条规则,目的是检查项目中是否有直接使用了`alert()`函数的情况。我按照文档开始编写自己的规则,但是遇到了一些麻烦。 module.exports = { ... Mc.子武 工具 2026-01-25 15:42:26 1 回答 46 浏览 Astro中如何在SSR模式下获取请求头信息? 我正在用Astro做服务端渲染,想根据请求头里的User-Agent来判断设备类型,但不知道怎么在页面里拿到原始请求头。 试过在标签里用window.navigator.userAgent,但这是客户... 晓萌 框架 2026-03-12 05:16:19 1 回答 24 浏览 ESLint 插件安装后为什么规则不生效? 我装了个 eslint-plugin-react,也配了 extends,但自定义规则好像没起作用,是我哪里漏了吗? 我的 .eslintrc.js 配置里写了 "plugin:react/recom... 书生シ奕玮 工具 2026-02-27 06:34:18 2 回答 37 浏览 为什么我的自定义ESLint规则无法正确触发? 我在开发一个检查函数参数数量的ESLint插件,规则逻辑写好了但总不生效。比如写个加法函数:add(a, b)应该通过,但调用add(a)时规则没报错。 规则配置是这样的: module.export... Code°紫瑶 工具 2026-02-19 18:36:25 1 回答 99 浏览 在Astro页面中使用JavaScript获取数据时为什么服务器端渲染报错? 我在Astro页面里写了个获取用户信息的函数,但构建时报错说“ReferenceError: fetch is not defined”。代码在浏览器里运行没问题,为什么SSR时会这样? 我尝试过这样... 东旭 框架 2026-02-05 08:16:45 1 回答 48 浏览 ESLint extends配置继承后规则冲突怎么办? 在项目里同时用了eslint:recommended和公司自定义的配置,结果no-console规则冲突了。我尝试在根配置里覆盖规则,但保存时还是报错:Error: Definition for ru... シ福萍 工具 2026-02-04 13:08:26
eslint-scope或者eslint-utils来处理,但最简单的方法是在遍历 AST 之前先构建 parent 映射。ESLint 提供了一个工具eslint-visitor-keys可以帮助你做这件事。首先,安装
eslint-visitor-keys:然后,在你的插件里这样用:
这样,当你遍历 AST 的时候,每个节点都会有一个
parent属性指向它的父节点,就不会再出现 undefined 的情况了。希望这能帮到你。