# @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默认:使用trueif -style 占位符;否则。添加于:%foo%``false``v7.4.0

当此选项为 时true,您可以使用%foo%来标记模板中的占位符。当为 时false,占位符是由placeholderWhitelistplaceholderPattern选项确定的标识符。

####### 占位符白名单

类型: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。

Last Updated: 6/14/2023, 8:56:23 AM