Vai al contenuto principale

@babel/register

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Uno dei modi per utilizzare Babel è tramite l'hook require. Questo hook si collega al require di Node e compila automaticamente i file al volo. Equivale al modulo coffee-script/register di CoffeeScript.

Installazione

npm install @babel/core @babel/register --save-dev

Utilizzo

JavaScript
require("@babel/register");

Tutti i file successivamente richiesti da Node con estensioni .es6, .es, .jsx, .mjs e .js verranno trasformati da Babel.

Polyfill non incluso

È necessario includere separatamente il polyfill quando si utilizzano funzionalità che lo richiedono, come i generatori.

Ignora node_modules per impostazione predefinita

NOTA: Per impostazione predefinita, tutte le richieste a node_modules vengono ignorate. È possibile sovrascrivere questo comportamento passando un'espressione regolare di ignore tramite:

JavaScript
require("@babel/register")({
// This will override `node_modules` ignoring - you can alternatively pass
// an array of strings to be explicitly matched or a regex / glob
ignore: [],
});

Specifica delle opzioni

JavaScript
require("@babel/register")({
// Array of ignore conditions, either a regex or a function. (Optional)
// File paths that match any condition are not compiled.
ignore: [
// When a file path matches this regex then it is **not** compiled
/regex/,

// The file's path is also passed to any ignore functions. It will
// **not** be compiled if `true` is returned.
function(filepath) {
return filepath !== "/path/to/es6-file.js";
},
],

// Array of accept conditions, either a regex or a function. (Optional)
// File paths that match all conditions are compiled.
only: [
// File paths that **don't** match this regex are not compiled
/my_es6_folder/,

// File paths that **do not** return true are not compiled
function(filepath) {
return filepath === "/path/to/es6-file.js";
},
],

// Setting this will remove the currently hooked extensions of `.es6`, `.es`, `.jsx`, `.mjs`
// and .js so you'll have to add them back if you want them to be used again.
extensions: [".es6", ".es", ".jsx", ".js", ".mjs"],

// Setting this to false will disable the cache.
cache: true,
});

È possibile passare tutte le altre opzioni, inclusi plugins e presets. Nota che verranno caricati anche i file di configurazione e che la configurazione programmatica verrà unita sopra le opzioni del file di configurazione. @babel/register non supporta ignore e only nei file di configurazione.

Variabili d'ambiente

Per impostazione predefinita, la CLI @babel/node e @babel/register salvano una cache JSON nella directory temporanea del sistema.

Ciò migliorerà significativamente l'avvio e la compilazione dei file. Esistono tuttavia scenari in cui potresti voler modificare questo comportamento, pertanto sono esposte variabili d'ambiente che ti consentono di farlo.

BABEL_CACHE_PATH

Specifica un percorso diverso per la cache.

Shell
BABEL_CACHE_PATH=/foo/my-cache.json babel-node script.js

BABEL_DISABLE_CACHE

Disabilita la cache.

Shell
BABEL_DISABLE_CACHE=1 babel-node script.js

Compilazione di plugin e preset al volo

@babel/register utilizza il sistema di hook require() di Node per compilare i file al volo durante il caricamento. Sebbene ciò sia generalmente utile, può creare situazioni complesse in cui il codice all'interno di un hook require() provoca chiamate aggiuntive a require, generando un ciclo di dipendenze. Nel caso di Babel, ciò significa che durante il tentativo di compilare un file utente, Babel potrebbe finire per compilare se stesso durante il caricamento.

Per evitare questo problema, il modulo disabilita esplicitamente la compilazione rientrante, ovvero la logica di compilazione di Babel non può attivare ulteriori compilazioni di altri file al volo. Lo svantaggio è che se si desidera definire un plugin o preset che viene compilato dinamicamente, il processo risulta più complesso.

L'aspetto cruciale è che il tuo codice deve caricare per primo il plugin/preset. Supponendo che il plugin/preset carichi tutte le sue dipendenze in anticipo, ciò che dovrai fare è:

require("@babel/register")({
// ...
});

require("./my-plugin");

Poiché è il tuo codice a innescare il caricamento, e non la logica interna di @babel/register, ciò dovrebbe compilare correttamente qualsiasi plugin/preset che si carichi in modo sincrono.

Implementazione sperimentale di Babel 8

Puoi testare la nuova implementazione sperimentale che sarà abilitata per default in Babel 8 utilizzando

JavaScript
require("@babel/register/experimental-worker");

Internamente esegue Babel in modo asincrono, quindi è compatibile con i file di configurazione .mjs. Puoi già usarlo come sostituto di @babel/register con alcune avvertenze:

  • Se specifichi opzioni per @babel/register a livello di codice (tramite require("@babel/register")({ /* ... options */ })), devi assicurarti che siano serializzabili. Ciò significa che non puoi passare funzioni di plugin definite inline, ma devi spostarle in un file separato ./my-plugin.js o in un file babel.config.js.

  • La nuova implementazione è ancora sperimentale: dovrebbe avere le stesse funzionalità di quella esistente, ma potrebbero esserci nuovi bug e regressioni.

Nota: @babel/register non supporta la compilazione al volo dei moduli ES nativi di Node.js, poiché attualmente non esiste un'API stabile per intercettare il caricamento dei moduli ES.