Guida all'Utilizzo
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
La toolchain di Babel include diversi strumenti che semplificano l'utilizzo di Babel, sia che tu sia un "utente finale" o stia sviluppando un'integrazione di Babel stesso. Questa sarà una rapida introduzione a tali strumenti, mentre per maggiori dettagli puoi consultare la sezione "Utilizzo" della documentazione.
Se stai utilizzando un framework, la configurazione di Babel potrebbe differire o essere già gestita automaticamente. Consulta invece la nostra guida interattiva di configurazione.
Panoramica
Questa guida ti mostrerà come compilare il codice della tua applicazione JavaScript che utilizza sintassi ES2015+ in codice compatibile con i browser attuali. Ciò comporterà sia la trasformazione della nuova sintassi che il polyfill delle funzionalità mancanti.
Il processo completo di configurazione prevede:
-
Eseguire questi comandi per installare i pacchetti:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/core @babel/cli @babel/preset-envyarn add --dev @babel/core @babel/cli @babel/preset-envpnpm add --save-dev @babel/core @babel/cli @babel/preset-envbun add --dev @babel/core @babel/cli @babel/preset-env -
Creare un file di configurazione chiamato
babel.config.json(richiedev7.8.0o superiore) nella root del progetto con questo contenuto:babel.config.json{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
},
"useBuiltIns": "usage",
"corejs": "3.6.5"
}
]
]
}L'elenco di browser sopra riportato è solo un esempio arbitrario. Dovrai adattarlo ai browser che desideri supportare. Consulta qui per ulteriori opzioni di
@babel/preset-env.
Oppure babel.config.js se stai utilizzando una versione precedente di Babel
const presets = [
[
"@babel/preset-env",
{
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
},
useBuiltIns: "usage",
corejs: "3.6.4",
},
],
];
module.exports = { presets };
-
Eseguire questo comando per compilare tutto il codice dalla directory
srcalla directorylib:Shell./node_modules/.bin/babel src --out-dir libPuoi utilizzare il runner di pacchetti npm incluso in npm@5.2.0 per abbreviare il comando sostituendo
./node_modules/.bin/babelconnpx babel
Prosegui per una spiegazione dettagliata del funzionamento e un'introduzione a ciascuno degli strumenti utilizzati.
Utilizzo di base con CLI
Tutti i moduli di Babel sono pubblicati come pacchetti npm separati nell'ambito @babel (dalla versione 7). Questo design modulare consente diversi strumenti ognuno progettato per uno specifico caso d'uso. Qui esamineremo @babel/core e @babel/cli.
Libreria Core
La funzionalità principale di Babel risiede nel modulo @babel/core. Dopo l'installazione:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/core
yarn add --dev @babel/core
pnpm add --save-dev @babel/core
bun add --dev @babel/core
puoi importarlo direttamente nel tuo programma JavaScript con require e utilizzarlo così:
const babel = require("@babel/core");
babel.transformSync("code", optionsObject);
Come utente finale, probabilmente preferirai installare altri strumenti che fungono da interfaccia per @babel/core e si integrano meglio nel tuo flusso di sviluppo. Tuttavia, potrebbe comunque esserti utile consultare la documentazione per conoscere le opzioni disponibili, molte delle quali possono essere configurate anche tramite altri strumenti.
Strumento CLI
@babel/cli è uno strumento che ti consente di utilizzare Babel dal terminale. Ecco il comando di installazione e un esempio di utilizzo base:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/core @babel/cli
./node_modules/.bin/babel src --out-dir lib
yarn add --dev @babel/core @babel/cli
./node_modules/.bin/babel src --out-dir lib
pnpm add --save-dev @babel/core @babel/cli
./node_modules/.bin/babel src --out-dir lib
bun add --dev @babel/core @babel/cli
./node_modules/.bin/babel src --out-dir lib
Questo analizzerà tutti i file JavaScript nella directory src, applicherà le trasformazioni specificate e produrrà ogni file nella directory lib. Poiché non abbiamo ancora indicato alcuna trasformazione, il codice in output sarà identico all'input (la formattazione esatta non viene preservata). Possiamo specificare le trasformazioni desiderate passandole come opzioni.
Abbiamo utilizzato l'opzione --out-dir sopra. Puoi visualizzare il resto delle opzioni accettate dallo strumento CLI eseguendolo con --help. Ma le più importanti per noi in questo momento sono --plugins e --presets.
Plugin e Preset
Le trasformazioni avvengono tramite plugin, piccoli programmi JavaScript che istruiscono Babel su come effettuare trasformazioni al codice. Puoi persino scrivere i tuoi plugin per applicare qualsiasi trasformazione desiderata. Per trasformare la sintassi ES2015+ in ES5 possiamo utilizzare plugin ufficiali come @babel/plugin-transform-arrow-functions:
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/plugin-transform-arrow-functions
./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
yarn add --dev @babel/plugin-transform-arrow-functions
./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
pnpm add --save-dev @babel/plugin-transform-arrow-functions
./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
bun add --dev @babel/plugin-transform-arrow-functions
./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
Ora tutte le funzioni freccia nel nostro codice verranno trasformate in espressioni di funzione compatibili con ES5:
const fn = () => 1;
// converted to
var fn = function fn() {
return 1;
};
È un buon inizio! Ma abbiamo anche altre funzionalità ES2015+ nel codice che vogliamo trasformare. Invece di aggiungere tutti i plugin uno per uno, possiamo usare un "preset", ovvero un insieme predefinito di plugin.
Proprio come per i plugin, puoi creare anche i tuoi preset per condividere qualsiasi combinazione di plugin necessaria. Per il nostro caso d'uso, esiste un preset eccellente chiamato env.
- npm
- Yarn
- pnpm
- Bun
npm install --save-dev @babel/preset-env
./node_modules/.bin/babel src --out-dir lib --presets=@babel/env
yarn add --dev @babel/preset-env
./node_modules/.bin/babel src --out-dir lib --presets=@babel/env
pnpm add --save-dev @babel/preset-env
./node_modules/.bin/babel src --out-dir lib --presets=@babel/env
bun add --dev @babel/preset-env
./node_modules/.bin/babel src --out-dir lib --presets=@babel/env
Senza alcuna configurazione, questo preset includerà tutti i plugin per supportare JavaScript moderno (ES2015, ES2016, ecc.). Ma i preset possono accettare opzioni. Invece di passare sia le opzioni CLI che quelle del preset dal terminale, esaminiamo un altro modo: i file di configurazione.
Configurazione
Esistono diversi modi per utilizzare file di configurazione in base alle tue esigenze. Leggi la nostra guida approfondita su come configurare Babel per maggiori informazioni.
Per ora, creiamo un file chiamato babel.config.json (richiede v7.8.0 o superiore) con il seguente contenuto:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
}
}
]
]
}
Ora il preset env caricherà solo i plugin di trasformazione per le funzionalità non disponibili nei browser di destinazione. Siamo a posto per la sintassi. Ora passiamo ai polyfill.
Polyfill
🚨 As a partire da Babel 7.4.0, questo pacchetto è deprecato in favore dell'inclusione diretta di
core-js/stable(per fornire polyfill delle funzionalità ECMAScript):JavaScriptimport "core-js/stable";Se stai compilando generatori o funzioni asincrone in ES5 e usi una versione di
@babel/coreo@babel/plugin-transform-regeneratorprecedente alla7.18.0, devi anche caricare il pacchettoregenerator runtime. Viene caricato automaticamente quando si usa l'opzioneuseBuiltIns: "usage"di@babel/preset-envo@babel/plugin-transform-runtime.
Il modulo @babel/polyfill include core-js e un regenerator runtime personalizzato per emulare un ambiente ES2015+ completo.
Ciò significa che puoi usare nuovi built-in come Promise o WeakMap, metodi statici come Array.from o Object.assign, metodi di istanza come Array.prototype.includes e funzioni generatore (se usate con il plugin regenerator). Il polyfill aggiunge allo scope globale e ai prototipi nativi come String.
Per gli autori di librerie/strumenti questo potrebbe essere eccessivo. Se non ti servono metodi di istanza come Array.prototype.includes, puoi evitare di inquinare lo scope globale usando il plugin transform runtime invece di @babel/polyfill.
Per andare oltre, se sai esattamente di quali polyfill hai bisogno, puoi importarli direttamente da core-js.
Dato che stiamo costruendo un'applicazione, possiamo semplicemente installare @babel/polyfill:
- npm
- Yarn
- pnpm
- Bun
npm install --save @babel/polyfill
yarn add @babel/polyfill
pnpm add @babel/polyfill
bun add @babel/polyfill
Notare l'opzione
--saveinvece di--save-devpoiché si tratta di un polyfill che deve essere eseguito prima del codice sorgente.
Fortunatamente per noi, stiamo utilizzando il preset env che include l'opzione "useBuiltIns" che, impostata su "usage", applica praticamente l'ultima ottimizzazione menzionata includendo solo i polyfill necessari. Con questa nuova opzione la configurazione cambia così:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
},
"useBuiltIns": "usage"
}
]
]
}
Babel analizzerà ora tutto il codice alla ricerca delle funzionalità mancanti nei tuoi ambienti target e includerà solo i polyfill richiesti. Ad esempio questo codice:
Promise.resolve().finally();
verrebbe trasformato così (perché Edge 17 non supporta Promise.prototype.finally):
require("core-js/modules/es.promise.finally");
Promise.resolve().finally();
Se non avessimo utilizzato il preset env con l'opzione "useBuiltIns" impostata su "usage" (il valore predefinito è "false"), avremmo dovuto richiedere il polyfill completo una sola volta nel nostro entry point prima di qualsiasi altro codice.
Ad esempio:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
},
"useBuiltIns": "entry"
}
]
]
}
Then import core-js (to polyfill ECMAScript features) first, in our entry file to emulate a full ES2015+ environment since @babel/polyfill has been deprecated:
import "core-js/stable";
Riepilogo
Abbiamo utilizzato @babel/cli per eseguire Babel dal terminale, @babel/polyfill per fornire tutte le nuove funzionalità JavaScript, e il preset env per includere solo le trasformazioni e i polyfill necessari per le funzionalità che utilizziamo e che mancano nei browser target.
Per maggiori informazioni sulla configurazione di Babel con il tuo sistema di build, IDE e altro, consulta la nostra guida interattiva al setup.