@babel/template
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
En informatique, cela est connu comme une implémentation de quasiquotes.
Installation
- 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
Utilisation avec des chaînes de caractères
Lorsque vous appelez template comme fonction avec un argument de type chaîne, vous pouvez fournir des placeholders qui seront substitués lors de l'utilisation du template.
Deux types de placeholders sont disponibles : les placeholders syntaxiques (ex. %%name%%) ou les placeholders d'identifiants (ex. NAME). @babel/template supporte ces deux approches par défaut, mais elles ne peuvent être mélangées. Si vous devez être explicite sur la syntaxe utilisée, vous pouvez utiliser l'option syntacticPlaceholders.
Notez que les placeholders syntaxiques ont été introduits dans Babel 7.4.0. Si vous ne contrôlez pas la version de @babel/template (par exemple lors de l'import depuis une dépendance peer @babel/core@^7.0.0), vous devez utiliser les placeholders d'identifiants. En revanche, les placeholders syntaxiques offrent des avantages : ils peuvent être utilisés là où des identifiants causeraient une erreur syntaxique (ex. dans des corps de fonctions ou des déclarations d'export), et n'entrent pas en conflit avec des variables majuscules (ex. new URL()).
Entrée (placeholders syntaxiques) :
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);
Entrée (placeholders d'identifiants) :
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});
Sortie :
const myModule = require("my-module");
.ast
Si aucun placeholder n'est utilisé et que vous souhaitez simplement parser une chaîne en AST, vous pouvez utiliser la version .ast du template.
const ast = template.ast(`
var myModule = require("my-module");
`);
qui parsera et retournera directement l'AST.
Utilisation avec des littéraux de template
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);
Notez que les placeholders peuvent être passés directement dans le littéral de template pour une meilleure lisibilité, ou fournis à la fonction template.
.ast
Si aucun placeholder n'est utilisé et que vous souhaitez simplement parser une chaîne en AST, vous pouvez utiliser la version .ast du template.
const name = "my-module";
const mod = "myModule";
const ast = template.ast`
var ${mod} = require("${name}");
`;
qui parsera et retournera directement l'AST. Contrairement à la version basée sur les chaînes, comme il s'agit d'un littéral de template, les remplacements via des expressions de template restent valides.
Résultats AST
L'API @babel/template expose plusieurs méthodes flexibles pour faciliter la création d'ASTs avec une structure attendue. Chacune possède également la propriété .ast mentionnée précédemment.
template
template retourne soit une instruction unique, soit un tableau d'instructions, selon le résultat du parsing.
template.smart
Identique à l'API template par défaut, retourne soit un nœud unique, soit un tableau de nœuds selon le résultat du parsing.
template.statement
template.statement("foo;")() retourne un nœud d'instruction unique et lève une exception si le résultat contient plus d'une instruction.
template.statements
template.statements("foo;foo;")() retourne un tableau de nœuds d'instructions.
template.expression
template.expression("foo")() retourne le nœud d'expression.
template.program
template.program("foo;")() retourne le nœud Program du template.
API
template(code, [opts])
code
Type : string
options
@babel/template accepte toutes les options du Babel Parser et définit certaines valeurs par défaut spécifiques :
-
allowReturnOutsideFunctionest définie par défaut surtrue. -
allowSuperOutsideMethodest définie par défaut surtrue. -
sourceTypeest définie par défaut surmodule.
syntacticPlaceholders
Type : boolean
Par défaut : true si des placeholders de style %%foo%% sont utilisés ; false sinon.
Ajouté dans : v7.4.0
Lorsque cette option est true, vous pouvez utiliser %%foo%% pour marquer des placeholders dans vos templates. Lorsqu'elle est false, les placeholders sont des identifiants déterminés par les options placeholderWhitelist et placeholderPattern.
placeholderWhitelist
Type : Set<string>
Par défaut : undefined
Cette option est incompatible avec
syntacticPlaceholders: true
Ensemble de noms de placeholders à accepter automatiquement. Les éléments de cette liste n'ont pas besoin de correspondre au motif de placeholder spécifié.
placeholderPattern
Type : RegExp | false
Par défaut : /^[_$A-Z0-9]+$/
Cette option est incompatible avec
syntacticPlaceholders: true
Motif de recherche pour identifier les nœuds Identifier et StringLiteral à considérer comme placeholders. 'false' désactive complètement la recherche de placeholders, ne laissant que la valeur 'placeholderWhitelist' pour les identifier.
preserveComments
Type : boolean
Par défaut : false
Définissez cette option sur true pour préserver les commentaires présents dans le paramètre code.
Valeur de retour
Par défaut, @babel/template renvoie une function invocable avec un objet optionnel de remplacements. Voir la section d'utilisation pour un exemple.
Lors de l'utilisation de .ast, l'AST est renvoyé directement.