@babel/template
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
In informatica, questa funzionalità è nota come implementazione di quasiquote.
Installazione
- 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
Utilizzo con Stringhe
Quando si richiama template come funzione con un argomento stringa, è possibile fornire placeholder che verranno sostituiti durante l'utilizzo del template.
Sono disponibili due tipologie di placeholder: sintattici (es. %%name%%) o basati su identificatori (es. NAME). @babel/template supporta entrambi per impostazione predefinita, ma non possono essere mescolati. Per specificare esplicitamente la sintassi da utilizzare, è possibile usare l'opzione syntacticPlaceholders.
Nota: i placeholder sintattici sono stati introdotti in Babel 7.4.0. Se non si controlla la versione di @babel/template (ad esempio quando importato da una dipendenza peer @babel/core@^7.0.0), è necessario utilizzare placeholder basati su identificatori. D'altro canto, i placeholder sintattici offrono vantaggi: possono essere usati dove gli identificatori causerebbero errori sintattici (es. nel corpo di funzioni o dichiarazioni export) e non confliggono con variabili maiuscole (es. new URL()).
Input (placeholder sintattici):
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);
Input (placeholder basati su identificatori):
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);
const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});
Output:
const myModule = require("my-module");
.ast
Se non si utilizzano placeholder e si desidera semplicemente convertire una stringa in AST, è possibile usare la versione .ast del template.
const ast = template.ast(`
var myModule = require("my-module");
`);
che analizzerà e restituirà direttamente l'AST.
Utilizzo con Template Literal
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);
Nota: i placeholder possono essere passati direttamente nel template literal per massimizzare la leggibilità, oppure forniti alla funzione template.
.ast
Se non si utilizzano placeholder e si desidera semplicemente convertire una stringa in AST, è possibile usare la versione .ast del template.
const name = "my-module";
const mod = "myModule";
const ast = template.ast`
var ${mod} = require("${name}");
`;
che analizzerà e restituirà direttamente l'AST. A differenza della versione basata su stringhe, essendo un template literal rimane valido effettuare sostituzioni tramite i meccanismi standard dei template literal.
Risultati AST
L'API @babel/template espone diverse interfacce flessibili per semplificare la creazione di AST con struttura prevedibile. Ciascuna include anche la proprietà .ast menzionata precedentemente.
template
template restituisce una singola istruzione o un array di istruzioni, in base al risultato dell'analisi.
template.smart
Equivalente all'API template predefinita, restituisce un singolo nodo o un array di nodi in base al risultato dell'analisi.
template.statement
template.statement("foo;")() restituisce un singolo nodo istruzione e genera un'eccezione se il risultato non è un'istruzione singola.
template.statements
template.statements("foo;foo;")() restituisce un array di nodi istruzione.
template.expression
template.expression("foo")() restituisce il nodo espressione.
template.program
template.program("foo;")() restituisce il nodo Program per il template.
API
template(code, [opts])
codice
Tipo: string
opzioni
@babel/template accetta tutte le opzioni di Babel Parser e specifica alcuni valori predefiniti propri:
-
allowReturnOutsideFunctionè impostato sutrueper impostazione predefinita. -
allowSuperOutsideMethodè impostato sutrueper impostazione predefinita. -
sourceTypeè impostato sumoduleper impostazione predefinita.
syntacticPlaceholders
Tipo: boolean
Predefinito: true se vengono utilizzati segnaposto nello stile %%foo%%; false altrimenti.
Aggiunto in: v7.4.0
Quando questa opzione è true, puoi usare %%foo%% per contrassegnare i segnaposto nei tuoi template. Quando è false, i segnaposto sono identificatori determinati dalle opzioni placeholderWhitelist e placeholderPattern.
placeholderWhitelist
Tipo: Set<string>
Predefinito: undefined
Questa opzione non è compatibile con
syntacticPlaceholders: true
Un insieme di nomi di segnaposto da accettare automaticamente. Gli elementi in questo elenco non devono corrispondere al pattern di segnaposto specificato.
placeholderPattern
Tipo: RegExp | false
Predefinito: /^[_$A-Z0-9]+$/
Questa opzione non è compatibile con
syntacticPlaceholders: true
Un pattern da cercare quando si identificano nodi Identifier e StringLiteral che devono essere considerati segnaposto. 'false' disabilita completamente la ricerca dei segnaposto, lasciando solo il valore 'placeholderWhitelist' per individuarli.
preserveComments
Tipo: boolean
Predefinito: false
Imposta su true per preservare eventuali commenti presenti nel parametro code.
Valore restituito
Per impostazione predefinita @babel/template restituisce una function richiamabile con un oggetto opzionale di sostituzioni. Vedi la sezione sull'utilizzo per un esempio.
Quando si utilizza .ast, l'AST viene restituito direttamente.