@babel/template
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
En informática, esto se conoce como una implementación de quasiquotes.
Instalación
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/template
yarn add --dev @babel/template
pnpm add --save-dev @babel/template
bun add --dev @babel/template
Uso con cadenas
Al llamar template como función con un argumento de cadena, puedes proporcionar marcadores de posición que se sustituirán cuando se utilice la plantilla.
Puedes usar dos tipos diferentes de marcadores de posición: sintácticos (ej. %%name%%) o de identificador (ej. NAME). @babel/template admite ambos enfoques por defecto, pero no pueden mezclarse. Si necesitas ser explícito sobre qué sintaxis estás usando, puedes usar la opción syntacticPlaceholders.
Ten en cuenta que los marcadores de posición sintácticos se introdujeron en Babel 7.4.0. Si no controlas la versión de @babel/template (por ejemplo, al importarlo desde una dependencia peer como @babel/core@^7.0.0), debes usar marcadores de posición de identificador. Por otro lado, los marcadores sintácticos tienen ventajas: pueden usarse donde los identificadores producirían errores de sintaxis (ej. en cuerpos de funciones o declaraciones de exportación), y no entran en conflicto con variables en mayúsculas (ej. new URL()).
Entrada (marcadores sintácticos):
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);
Entrada (marcadores de identificador):
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});
Salida:
const myModule = require("my-module");
.ast
Si no se usan marcadores de posición y solo quieres una forma sencilla de analizar una cadena en un AST, puedes usar la versión .ast de la plantilla.
const ast = template.ast(`
var myModule = require("my-module");
`);
que analizará y devolverá el AST directamente.
Uso con literales de plantilla
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);
Ten en cuenta que los marcadores de posición pueden pasarse directamente como parte del literal de plantilla para máxima legibilidad, o pueden pasarse a la función de plantilla.
.ast
Si no se usan marcadores de posición y solo quieres una forma sencilla de analizar una cadena en un AST, puedes usar la versión .ast de la plantilla.
const name = "my-module";
const mod = "myModule";
const ast = template.ast`
var ${mod} = require("${name}");
`;
que analizará y devolverá el AST directamente. Ten en cuenta que, a diferencia de la versión basada en cadenas mencionada anteriormente, al ser un literal de plantilla aún es válido realizar sustituciones usando reemplazos de literales de plantilla.
Resultados AST
La API @babel/template expone varias interfaces flexibles para facilitar la creación de ASTs con estructura predecible. Cada una incluye la propiedad .ast mencionada anteriormente.
template
template devuelve una sola declaración o un array de declaraciones, según el resultado del análisis.
template.smart
Es idéntico a la API template predeterminada, devuelve un único nodo o un array de nodos según el resultado del análisis.
template.statement
template.statement("foo;")() devuelve un nodo de declaración única, y lanza una excepción si el resultado no es exactamente una declaración.
template.statements
template.statements("foo;foo;")() devuelve un array de nodos de declaración.
template.expression
template.expression("foo")() devuelve el nodo de expresión.
template.program
template.program("foo;")() devuelve el nodo Program para la plantilla.
API
template(code, [opts])
código
Tipo: string
opciones
@babel/template acepta todas las opciones del Babel Parser y especifica algunos valores predeterminados propios:
-
allowReturnOutsideFunctionse establece entruepor defecto. -
allowSuperOutsideMethodse establece entruepor defecto. -
sourceTypese establece enmodulepor defecto.
syntacticPlaceholders
Tipo: boolean
Valor predeterminado: true si se usan marcadores de posición estilo %%foo%%; false en caso contrario.
Añadido en: v7.4.0
Cuando esta opción es true, puedes usar %%foo%% para marcar placeholders en tus plantillas. Cuando es false, los placeholders son identificadores determinados por las opciones placeholderWhitelist y placeholderPattern.
placeholderWhitelist
Tipo: Set<string>
Valor predeterminado: undefined
Esta opción no es compatible con
syntacticPlaceholders: true
Conjunto de nombres de placeholders para aceptar automáticamente. Los elementos en esta lista no necesitan coincidir con el patrón de placeholder especificado.
placeholderPattern
Tipo: RegExp | false
Valor predeterminado: /^[_$A-Z0-9]+$/
Esta opción no es compatible con
syntacticPlaceholders: true
Patrón para buscar nodos Identifier y StringLiteral que deben considerarse placeholders. 'false' desactiva completamente la búsqueda de placeholders, dejando solo 'placeholderWhitelist' para encontrarlos.
preserveComments
Tipo: boolean
Valor predeterminado: false
Establécelo en true para conservar los comentarios del parámetro code.
Valor de retorno
Por defecto @babel/template devuelve una function que se invoca con un objeto opcional de reemplazos. Consulta la sección de uso para ver un ejemplo.
Al usar .ast, se devuelve el AST directamente.