Vai al contenuto principale

@babel/template

Traduzione Beta Non Ufficiale

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 install --save-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):

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);

Input (placeholder basati su identificatori):

JavaScript
const buildRequire = template(`
var IMPORT_NAME = require(SOURCE);
`);

const ast = buildRequire({
IMPORT_NAME: t.identifier("myModule"),
SOURCE: t.stringLiteral("my-module"),
});

Output:

JavaScript
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.

JavaScript
const ast = template.ast(`
var myModule = require("my-module");
`);

che analizzerà e restituirà direttamente l'AST.

Utilizzo con Template Literal

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);

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.

JavaScript
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 su true per impostazione predefinita.

  • allowSuperOutsideMethod è impostato su true per impostazione predefinita.

  • sourceType è impostato su module per 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.