7.17.0 Rilasciata: Modalità 'v' di RegExp e ... 🥁 decoratori!
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Abbiamo appena pubblicato Babel 7.17.0!
Dopo anni di iterazioni, riscritture e aggiustamenti, sembra che la proposta dei decoratori si sia finalmente stabilizzata su un nuovo design! Questa release include sia il supporto per il parsing che per la trasformazione della nuova proposta.
Abbiamo anche implementato la proposta del flag v per RegExp e aggiunto il supporto per il parsing dei campi privati nella destrutturazione, entrambi attualmente allo Stage 2. Infine, una nuova implementazione sperimentale di @babel/register.
Puoi leggere l'intero changelog su GitHub.
Se tu o la tua azienda volete supportare Babel e l'evoluzione di JavaScript, ma non siete sicuri di come fare, potete donare sul nostro Open Collective o su GitHub Sponsors e, meglio ancora, lavorare con noi direttamente all'implementazione di nuove proposte ECMAScript! Essendo un progetto guidato da volontari, contiamo sul supporto della comunità per finanziare i nostri sforzi nel supportare la vasta gamma di utenti JavaScript. Scrivici a team@babeljs.io se desideri discutere di più!
Novità principali
Decoratori (#14004, #13681)
Dopo aver ricevuto feedback da sviluppatori JavaScript, sviluppatori di motori e esperti di linguaggi, la proposta dei decoratori è stata riscritta per tenere conto di molteplici vincoli e desideri. Abbiamo collaborato con l'attuale autore della proposta, @pzuraq, per implementare la nuova proposta allo Stage 2 in Babel.
La nuova implementazione supporta anche la decorazione di elementi privati delle classi, oltre alla nuova sintassi degli "accessori automatici di classe":
@defineElement("button")
class Button {
@reactive accessor enabled = true; // class auto accessors
@event("onClick") #handleClick() { // decorator on a private method
console.log("clicked!");
}
}
Puoi abilitare la nuova proposta passando l'opzione "version": "2021-12" a @babel/plugin-proposal-decorators:
{
"plugins": [
["@babel/plugin-proposal-decorators", {
"version": "2021-12"
}]
]
}
Sebbene la nuova sintassi dei decoratori sia compatibile con la proposta precedente, la semantica è diversa: i decoratori già scritti per Babel "legacy", Babel older-but-not-legacy o TypeScript non funzioneranno con la nuova proposta.
Se vuoi aiutare a far avanzare la proposta, puoi provare a usarla e lasciare feedback nel loro repository GitHub.
Notazione degli insiemi e proprietà delle stringhe in RegExp (#14125)
Babel supporta ora la proposta della notazione degli insiemi e proprietà delle stringhe in RegExp, che introduce tre nuove funzionalità per le espressioni regolari dietro un nuovo flag v:
-
Notazione estesa degli insiemi, che permette di calcolare la differenza, l'intersezione e l'unione di insiemi di caratteri o stringhe
JavaScript/[\p{Decimal_Number}--[0-9]]/v; // Non-ASCII decimal digits
/[\p{ASCII}&&\p{Letter}]/v; // ASCII letters
/[[\p{ASCII}&&\p{Letter}]\p{Number}]/v; // ASCII letters, or any digit -
Proprietà delle stringhe, che consentono di utilizzare le sequenze di escape
\pcon proprietà multi-codepointJavaScript"Did you see the 👩🏿❤️💋👩🏾 emoji?".match(/\p{RGI_Emoji}/v). // ["👩🏿❤️💋👩🏾"] -
Stringhe multi-codepoint negli insiemi, utilizzando una nuova sequenza di escape
\qJavaScript/[\r\n\q{\r\n|NEWLINE}]/v; // Matches \r, \n, \r\n or NEWLINE
Puoi abilitare questa proposta utilizzando il plugin @babel/plugin-proposal-unicode-sets-regex:
{
"plugins": ["@babel/plugin-proposal-unicode-sets-regex"]
}
Babel si affida a diversi pacchetti di terze parti per trasformare le espressioni regolari: siamo grati ai maintainer di regjsparser, regjsgen e regexpu-core che hanno dedicato tempo a revisionare le nostre pull request!
Token @@ e ^^ per le pipe in stile Hack (#13973)
Continuiamo ad aiutare gli autori della proposta a valutare diversi token per la proposta dell'operatore pipeline: uno dei champion, J. S. Choi, ha aggiunto il supporto per due nuovi token che puoi provare con l'opzione topicToken:
{
"plugins": [
["@babel/plugin-proposal-pipeline-operator", {
"proposal": "hack",
"topicToken": "^^" // or "@@"
}]
]
}
Puoi leggere di più sulle variazioni supportate nella documentazione di @babel/plugin-proposal-pipeline-operator.
Riscrittura sperimentale di @babel/register (#13782)
Pianifichiamo di rilasciare Babel 8 come pacchetto ESM. Tuttavia, questo pone un grosso problema: come caricarlo ed eseguirlo in modo sincrono nei pacchetti CommonJS?
Di solito la maggior parte dei consumer di Babel possono eseguire Babel in modo asincrono, o almeno caricarlo in modo asincrono. Questo non è vero per @babel/eslint-parser (che integra il parser di Babel con ESLint) e @babel/register (che può essere utilizzato per transpilare file Node.js al volo), dove dobbiamo spostare l'analisi e la trasformazione in un worker separato.
Babel 7.16.0 espone la nuova implementazione sperimentale di @babel/register in @babel/register/experimental-worker: internamente esegue Babel in modo asincrono, quindi è compatibile con i file di configurazione .mjs e con i plugin Babel .mjs. Sarà abilitata per impostazione predefinita in Babel 8, e puoi già usarla come sostituto di @babel/register con alcune avvertenze:
-
Se specifichi opzioni per
@babel/registera livello di codice (tramiterequire("@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.jso in un filebabel.config.js. -
La nuova implementazione è ancora sperimentale: dovrebbe avere le stesse funzionalità di quella esistente, ma ci sono alcuni miglioramenti che stiamo esplorando.
Abbiamo già rilasciato la nuova implementazione sperimentale di @babel/eslint-parser in Babel 7.15.0, esposta in @babel/eslint-parser/experimental-worker.