# @babel/模板
在计算机科学中,这被称为准引用的实现。
# 安装
- npm
npm install --save-dev @babel/template
- yarn
yarn add --dev @babel/template
# 字符串用法 (opens new window)
template
当作为带有字符串参数的函数调用时,您可以提供占位符,这些占位符将在使用模板时被替换。
您可以使用两种不同类型的占位符:句法占位符(例如%name%
)或标识符占位符(例如NAME
)。@babel/template
默认情况下支持这两种方法,但不能混合使用。如果您需要明确说明所使用的语法,可以使用该syntacticPlaceholders (opens new window) 选项。
请注意语法占位符是在 Babel 7.4.0 中引入的。如果您不控制@babel/template
版本(例如,从@babel/core@^7.0.0
对等依赖项导入时),则必须使用标识符占位符。另一方面,句法占位符有一些优点:它们可以用在标识符可能是语法错误的地方(例如,代替函数体,或在导出声明中),并且它们不会与大写变量(例如, )冲突new URL()
。
输入(语法占位符):
JavaScript
import template from "@babel/template";
import generate from "@babel/generator";
import * as t from "@babel/types";
const buildRequire = template(`
var %importName% = require(%source%);
`);
const ast = buildRequire({
importName: t.identifier("myModule"),
source: t.stringLiteral("my-module"),
});
console.log(generate(ast).code);
输入(标识符占位符):
JavaScript
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});
输出:
JavaScript
const myModule = require("my-module");
# .ast
(opens new window)
如果没有使用占位符,而你只是想要一种将字符串解析为 AST 的简单方法,则可以使用.ast
模板的版本。
JavaScript
const ast = template.ast(`
var myModule = require("my-module");
`);
它将直接解析并返回 AST。
# 模板字面量用法 (opens new window)
JavaScript
import template from "@babel/template";
import generate from "@babel/generator";
import * as t from "@babel/types";
const source = "my-module";
const fn = template`
var IMPORT_NAME = require('${source}');
`;
const ast = fn({
IMPORT_NAME: t.identifier("myModule"),
});
console.log(generate(ast).code);
请注意,占位符可以作为模板文字的一部分直接传递,以使内容尽可能可读,也可以将它们传递到模板函数中。
# .ast
(opens new window)
如果没有使用占位符,而你只是想要一种将字符串解析为 AST 的简单方法,则可以使用.ast
模板的版本。
JavaScript
const name = "my-module";
const mod = "myModule";
const ast = template.ast`
var ${mod} = require("${name}");
`;
它将直接解析并返回 AST。请注意,与前面提到的基于字符串的版本不同,由于这是模板文字,因此使用模板文字替换执行替换仍然有效。
# AST结果
API@babel/template
公开了一些灵活的 API,以便尽可能轻松地创建具有预期结构的 AST。这些中的每一个也具有.ast
上述属性。
# template
(opens new window)
template
返回单个语句或语句数组,具体取决于解析结果。
# template.smart
(opens new window)
这与默认 API 相同template
,返回单个节点或节点数组,具体取决于解析结果。
# template.statement
(opens new window)
template.statement("foo;")()
返回单个语句节点,如果结果不是单个语句,则抛出异常。
# template.statements
(opens new window)
template.statements("foo;foo;")()
返回一个语句节点数组。
# template.expression
(opens new window)
template.expression("foo")()
返回表达式节点。
# template.program
(opens new window)
template.program("foo;")()
返回Program
模板的节点。
# 应用程序接口
# template(code,
opts])[
# 代码
类型:string
# 选项
@babel/template
接受来自Babel Parser (opens new window) 的所有选项,并指定它自己的一些默认值:
allowReturnOutsideFunction``true
默认设置为。allowSuperOutsideMethod``true
默认设置为。sourceType``module
默认设置为。
# 句法占位符
类型:boolean
默认:使用true
if -style 占位符;否则。添加于:%foo%``false``v7.4.0
当此选项为 时true
,您可以使用%foo%
来标记模板中的占位符。当为 时false
,占位符是由placeholderWhitelist
和placeholderPattern
选项确定的标识符。
####### 占位符白名单
类型:Set<string>
默认:undefined
此选项不兼容
syntacticPlaceholders: true
一组自动接受的占位符名称。此列表中的项目不需要匹配给定的占位符模式。
####### 占位符模式
类型:RegExp | false
默认:/^[_$A-Z0-9]+$/
此选项不兼容
syntacticPlaceholders: true
在查找应被视为占位符的标识符和 StringLiteral 节点时要搜索的模式。“false”将完全禁用占位符搜索,仅保留“placeholderWhitelist”值来查找占位符。
####### 保留评论
类型:boolean
默认:false
将此设置为true
以保留参数中的任何注释code
。
# 返回值 (opens new window)
默认情况下@babel/template
返回一个function
用可选的替换对象调用的。有关示例,请参见用法部分。
使用 时.ast
,将直接返回 AST。