如何编写ast-grep规则处理两类JavaScript require路径重构场景?
ast-grep 规则编写方案(对应两类重构场景)
场景1:替换 ${ROOT}/xxx 为 @/xxx
这个场景需要匹配模板字符串形式的require参数,捕获${ROOT}之后的路径片段,再替换为@开头的路径。
完整规则配置:
id: replace-root-with-alias language: javascript pattern: | const $var = require(`\${ROOT}$path`) fix: | const $var = require('@$path') constraints: path: regex: ^\/.* # 确保path是以/开头的合法路径片段
规则说明:
pattern中用\${ROOT}匹配模板字符串里的变量(注意转义$),$path捕获${ROOT}之后的路径部分(比如/common)fix直接将捕获的$path拼接到@后,替换原模板字符串constraints避免误匹配非路径格式的模板字符串,确保$path是合法的路径开头
场景2:移除路径末尾的 /index.js
这个场景需要匹配以/index.js结尾的require路径(兼容普通字符串和模板字符串),捕获基础路径部分后替换。
完整规则配置:
id: remove-index-js-suffix language: javascript pattern: | const $var = require(${'$pathSuffix'}) fix: | const $var = require('$basePath') constraints: pathSuffix: regex: '@\/.*\/index\.js' # 匹配@开头且以/index.js结尾的路径 transform: basePath: replace: source: $pathSuffix regex: '\/index\.js$' replacement: ''
规则说明:
pattern里的${'$pathSuffix'}可以同时匹配普通字符串和模板字符串形式的路径参数constraints限制$pathSuffix必须符合@/xxx/index.js的格式transform通过正则替换,把$pathSuffix末尾的/index.js剔除,得到纯净的基础路径$basePath
内容的提问来源于stack exchange,提问作者Brenner
相关产品推荐
相关产品推荐

