Vai al contenuto principale

6.16.0 Rilasciato

· Lettura di 9 min
Traduzione Beta Non Ufficiale

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

Happy Birthday Babel 🎂 !

. ; :```` : :; ````;,```` ````;,```` ::, ````:,: :,:````` :,,: ````:.,,```` ````:.,,```` ````:..,.```` ````,,..: ,,..:````` ```.,.`,: :.`.,````` :..,````` ```.,..: :..,.```` ````:..,. ```.,...: .:...,.``` .:...,. ::,,,.,,,:` `:,,,.,,,:, `:,,,.,,,:: :,,.......,: :,.......,,, :,.......,,: :,........., ;++`............;++` ,.........,: :.````````.. '+'+'```````````,+'++` ..````````.: ;,````````.,.+'''',`````````.,''++' ,.````````,: ;,.` ``.,++'''',.`` ``.,''''+,,.`` `.,: :,.`` ..+''''+,. .,'''++;,. ``.,: `:,.`` ..+''''',. .,''''+',. ``.,: +,..`` ..+++''+,. .,+''++;,. ``..:, ,:+,. ..++++++,. .,+++++.,. .,+,` ,,.'',. .,`;+++',. .,+++'.`,. .,+.,: `,,.`++,. .,``...`,. .,...,. .,+..,: ,,..``'+,.``` ```.,``````,.``` ```.,``````,.``` ```.,+```.,: :,.```.,+,.``` ```.,``````,.``` ```.,``````,.``` ```.,'.```.., :,..,,.``` ```.,``````,.``` ```.,``````,.``` ```.,.``````., ,,.```````.,.``` ```.,``````,.``` ```.,``````,.``` ```.,```````..: ,.`````````,.``` ```.,``````,.``` ```.,``````,.``` ```.,````````.,: :,.```````` ,.``` ```.,``````,.``` ```.,``````,.``` ```., ````````., ,.```````.''+'``` ```., ,. .,,.``` ``,''+'```````.,. ,.```````+'''';`` ```., `````,.``` ``..,,. ``+'''';```````,: ,.``````'+''''+ .,``````,. ..,``````,. '+''''+```````.: ,.``````+'''''':`````.., `````,..`````..,,``````,..`````+'''''',``````,: ,.``````+'''''+'.```..,````````,.....,,,...``.+'''''+'`````.,, :.``````+'''''+'......```` ```.......``` `````......+'''''+'`````., :.`````.+++++'+:.....````.''+' ```....```.''+' ````.....+++++'+:`````., ,,.````.:+++++'``````````+'''';``````````+'''';`````````,+++++'..````., .,.````..,;';,.`````````'+''''+ '+''''+ `````````.:';:..`````.: ,.....```````````+'''''', +'''''',```````````....: ,.`````````````````````+'''''+' +'''''+'.,, ,.`````````````````````+'''''+'````````+'''''+'.,. :.+++++'+:``` ````+++++'+:````````````````````.,` :..````````````````````,+++++'```` ````,+++++'., ,,..:';,.``` ````.:';,.., .,. ````````````` ```````````````.: `,.```````````````````` ``````` `````` ` ````````````````..: ,..``````````````````` ````````````````````.,: ,...`````````````````````` ``` ```````````````````````````.,, :....````````````````````````````````````````````````````````````.,. :,.....`````````````````````````````````````````````````````````.., :,......`````````````````````````````````````````````````````.....: ,,........```````````````````````````````````````````````````.....: .,........```````````````````````````````````````````````````....,: ,..........```````````````````````````````````````````````......,: :...........`````````````````````````````````````````````.......,: :,...........````````````````````````````````````````````.......,, :,..........``````````````````````````````````````````..........,` :,............````````````````````````````````````````..........: :,............````````````````````````````````````````.........,: .,..............```````````````````````````````````............,: `,,..............``````````````````````````````````............,: :,...........`..````````````````````````````````..............,: :,..............````````````````````````````````..............:. ,,,...........................,: :,.............````````````````````````````````............,:, :,.............````````````````````````````..............,,: .:,............```````````````````````````..............,:: .:,,..........````````````````````````````............,:: :,,..........````````````````````````.............,,:, ,:,,.........``````````````````````............,,:; ::,,........``````````````````.............,,:: ,::,,........``````..``............,,,:;` :::,,,........`.............,,,:::. ,:::,,,,..............,,,,,:::: .::::::,,,,,,,::::::,`

È difficile credere siano già passati 2 anni! Un enorme grazie a Sebastian per aver creato questo progetto straordinario!

Abbiamo fatto grandi progressi:

  • Oltre 200 contributori

  • Circa 113 release dalla 6.0.0 per un totale di 512 versioni

  • ~4.5 milioni di download di babel-core nell'ultimo mese

  • Oltre 1400 risultati per babel-plugin su npm

  • Oltre 700 risultati per babel-preset su npm

  • Oltre 4500 utenti sul nostro Slack

Grazie infinite per l'utilizzo e i contributi alla nostra comunità!

Se non l'avete ancora visto, siamo tornati su Github Issues! Tutto merito di @danez

Come molti progetti open source, Babel è mantenuto da poche persone nel tempo libero. Lavoreremo per semplificare i contributi in vari modi (non solo al codice principale).

Quanto affermato da Evan Czaplicki in Code is the Easy Part è molto rilevante per qualsiasi progetto. Contribuire significa anche parlare, utilizzare e scrivere del progetto.

In quest'ottica, dovremmo creare una Pagina Risorse curata e aggiornata, e magari una newsletter per condividere progetti fantastici realizzati con Babel (nuovi plugin, strumenti o semplici idee).

Speriamo di collaborare maggiormente con TC-39, come già avviene per i proposal attuali e i nostri preset/plugin stage-x. Dovremmo eseguire test262 con Babel.

Abbiamo anche rilasciato Babili, il nostro minifier e iniziato a lavorare su babel-preset-env, l'"autoprefixer" per Babel.

Il futuro di Babel è radioso!

👓 Conformità alle specifiche

#3473 via #4576 Implementa il supporto per funzioni generatore asincrone e istruzioni for-await. (@zenparsing)

Questa modifica implementa la proposta di iterazione asincrona, attualmente allo stage 2 (e prevista per lo stage 3 nell'attuale meeting TC-39). Include:

  • Trasforma funzioni generatore asincrone (async function* g() { }) in funzioni generatore incapsulate, simile all'attuale trasformazione async-to-generator
JavaScript
async function* agf() {
await 1;
yield 2;
}
  • Trasforma istruzioni for-await in cicli for contenenti espressioni yield
JavaScript
async function f() {
for await (let x of y) {
g(x);
}
}

Esempio d'uso

JavaScript
async function* genAnswers() {
var stream = [ Promise.resolve(4), Promise.resolve(9), Promise.resolve(12) ];
var total = 0;
for await (let val of stream) {
total += await val;
yield total;
}
}

function forEach(ai, fn) {
return ai.next().then(function (r) {
if (!r.done) {
fn(r);
return forEach(ai, fn);
}
});
}

var output = 0;
return forEach(genAnswers(), function(val) { output += val.value })
.then(function () {
assert.equal(output, 42);
});

#4500 Supporto per proprietà di classe calcolate. (@motiz88)

Il supporto del parser è stato aggiunto in babylon@6.11.0 con babel/babylon#121

JavaScript
// Example
class Foo {
[x]
['y']
}

class Bar {
[p]
[m] () {}
}

#3702 Flow: genera annotazioni di tipo oggetto esatto. (@bhosmer)

Il supporto del parser è stato aggiunto in babylon@6.10.0 con babel/babylon#104

JavaScript
// Example
var a : {| x: number, y: string |} = { x: 0, y: 'foo' };

🚀 Nuova Funzionalità

#3561 babel-core: aggiunge opzioni per un parser o generatore diverso. (@hzoo)

Babel ora accetta anche le opzioni: parserOpts e generatorOpts (come oggetti).

parserOpts passerà tutte le proprietà al parser predefinito babylon. È possibile passare anche un'opzione parser per sostituirlo con un parser diverso.

Ciò permetterà di passare qualsiasi opzioni di babylon's:

JavaScript
{
"parserOpts": {
"allowImportExportEverywhere": true,
"allowReturnOutsideFunction": true,
"sourceType": "module",
"plugins": ["flow"]
}
}

È possibile passare anche parserOpts.parser e generatorOpts.generator. Ciò abiliterà l'uso di recast con Babel.

Recast è utilizzato in jscodeshift, uno strumento per creare codemod. Potreste conoscerli perché anche il team di React li pubblica per aiutare nella conversione tra le versioni di React.

recast

JSON
{
"parserOpts": {
"parser": "recast"
},
"generatorOpts": {
"generator": "recast"
}
}

Babel come compilatore ha 3 fasi: parsing, trasformazione e generazione.

A livello generale, il processo è:

  • parsing: prende una stringa (codice di input) e la trasforma in JSON

  • trasformazione (plugin): prende JSON e crea una struttura JSON diversa

  • generazione del codice: trasforma il JSON di nuovo in una stringa (codice di output)

L'ultima fase di Babel è il generatore di codice. Tradizionalmente, il generatore di codice non ha bisogno di preoccuparsi del formato del codice (spazi, virgolette, ecc.). Questo perché il codice di output è il tuo codice "compilato" e probabilmente finirà nella directory dist, che verrà successivamente minificata, ecc.

Ma cosa succede se vuoi scrivere un plugin Babel che viene eseguito sul codice sorgente e restituisce il risultato nel sorgente (babel src -d src invece di babel src -d lib)? Vorresti che il diff risultante fosse leggibile e che il plugin modificasse solo ciò che è necessario, rispettando la tua guida di stile.

Questo perché desideri scrivere un plugin che trasformi il sorgente stesso. Un caso d'uso è un progetto chiamato lebab che è in pratica l'opposto di Babel (in precedenza chiamato 5to6). Attualmente, non è un plugin Babel e quindi volevamo aiutare a supportare questo caso d'uso.

Una volta che benjamn/recast#299 e benjamn/ast-types#162 saranno uniti, dovresti essere in grado di creare i tuoi codemod anche con Babel!

#4542 Aggiunta del supporto per le scorciatoie di organizzazione dei preset. (@nkt)

JavaScript
{
presets: ["@org/babel-preset-name"], // actual package
presets: ["@org/name"] // shorthand name
}

#4491 Aggiunta dell'opzione useBuiltIns per lo spread/rest sugli oggetti. (@hzoo)

useBuiltIns - Non utilizza gli helper di Babel e si limita a trasformare per usare il metodo integrato (disattivata di default).

JavaScript
{
"plugins": [
["transform-object-rest-spread", { "useBuiltIns": true }]
]
}

// source
z = { x, ...y };
// compiled
z = Object.assign({ x }, y);

#4561 babel-code-frame: aggiunta opzioni per linesBefore, linesAfter. (@hzoo)

babel-code-frame è un pacchetto standalone che utilizziamo in Babel per segnalare gli errori.

Ora è disponibile un'opzione per specificare il numero di righe sopra e sotto l'errore.

JavaScript
  1 | class Foo {
> 2 | constructor()
| ^
3 | }

#3695 via #4566 Consentire ai preset di utilizzare export default ES6 (@johanssj)

In precedenza creavamo i preset con export commonjs.

babel.config.js
module.exports = {
plugins: [
require("babel-plugin-syntax-trailing-function-commas")
]
};

Ora è possibile utilizzare anche export default.

JavaScript
import syntaxTrailingCommas from "...";
export default {
plugins: [
syntaxTrailingCommas
]
};

💅 Rifiniture

#4572, #4579 Miglioramento dei colori per l'evidenziazione della sintassi. (@lydell)

Prima

screen shot 2016-09-27 at 11 12 47 am

Dopo

screen shot 2016-09-27 at 3 50 02 pm

🐛 Correzioni di bug degne di nota

#3686 Correzione di typeof Symbol.prototype. (@brainlock)

JavaScript
// `typeof Symbol.prototype` should be 'object'
typeof Symbol.prototype === 'object'

#4507 Imposta le opzioni in babel-cli solo se diverse dai valori predefiniti. (@danez)

Risolto un problema relativo alle impostazioni predefinite non sovrascritte. Ciò causava il malfunzionamento di opzioni come comments: false.

#4524 Correzione dell'export di default con funzioni freccia e denominazione di funzioni. (@danharper)

// this wasn't exporting correctly before
export default ({ onClick }) => {
return <div onClick={() => onClick()}></div>;
}

#4518 Correzione delle classi esportate di default prive di nome. (@danez)

JavaScript
export default class {};
// wasn't correctly transforming to
exports["default"] = class {}
// with the es3-transforms

#4521 Correzione della rimozione dei typeParameters dalle funzioni freccia. (@danez)

JavaScript
// <X> wasn't stripped out
const find = <X> (f: (x:X) => X, xs: Array<X>): ?X => (
xs.reduce(((b, x) => b ? b : f(x) ? x : null), null)
)

#4552 Correzione della valutazione del destructuring con espressioni di chiamata. (@danez)

Abbiamo notato che non possiamo applicare queste ottimizzazioni se sono presenti chiamate di funzione o espressioni di membro sul lato destro dell'assegnazione, poiché la chiamata di funzione o l'espressione di membro (che potrebbe essere un getter con effetti collaterali) potrebbe potenzialmente alterare le variabili a cui stiamo assegnando.

JavaScript
[x, y] = [a(), obj.x];
// was transforming to
x = a();
y = obj.x;
// now transforms to
var _ref = [a(), obj.x];
x = _ref[0];
y = _ref[1];

#4587 Prevenire la rimozione completa di ClassProperty da parte di flow-strip-types/flow-comments. (@danharper)


Consulta GitHub per il resto del changelog!