寻找将JS/TS插值字符串转换为函数调用的成熟工具
你要的这种把模板字符串转换成带序号占位符的函数调用的需求,已经有不少成熟的AST-based工具可以直接用,不用自己从零实现:
Babel 插件体系
这是最适配TS/JS技术栈的方案:如果你用React Intl、i18next这类本地化库,它们的官方Babel插件(比如
@babel/plugin-react-intl)已经内置了类似逻辑——会自动提取模板字符串里的插值表达式,将原字符串转成带占位符的格式。你只需简单调整插件配置,就能让它生成你自定义的interpolate函数调用,而非库自带的格式化函数。要是需要完全自定义输出,你也可以写一个极简的Babel插件:遍历AST中的
TemplateLiteral节点,把字符串片段拼接成带${0}、${1}的字面量,把插值表达式收集成数组,再将原节点替换成interpolate(templateStr, exprArray)的调用,同时自动添加对应的import语句。比如你给出的示例代码,用插件可以一键转成目标格式:原代码:
const a = 5; const b = 7; const foo = `first value is ${a + b}, second value is ${a * b}`;转换后代码:
import { interpolate } from "./my-support-code"; const a = 5; const b = 7; const foo = interpolate("first value is ${0}, second value is ${1}", [a + b, a * b]);
jscodeshift
这是专门做批量代码转换的工具,非常适合集成到你的本地化工具链中。你只需要写一个简短的转换脚本,核心逻辑就是:- 遍历代码AST,识别所有
TemplateLiteral节点; - 拼接字符串片段,用
${i}替换对应插值位置; - 收集所有插值表达式组成数组;
- 将原模板字符串节点替换为
interpolate函数调用,同时自动注入import语句。
它支持命令行批量处理整个项目的代码,效率很高。
- 遍历代码AST,识别所有
i18next-scanner
虽然它主要用于提取翻译字符串到资源文件,但也支持解析模板字符串的插值。你可以扩展它的转换钩子,让它在提取基础语言字符串的同时,把原代码中的模板字符串替换成你需要的interpolate调用格式,一步完成字符串提取和代码转换。
这些工具都是基于抽象语法树(AST)处理的,比正则表达式可靠得多,能完美处理嵌套表达式、复杂插值等边缘情况,完全覆盖你描述的需求。
内容的提问来源于stack exchange,提问作者Peter Wone

