2015-12-01 8 views
9

Nota: ho trovato questa domanda su Babel issue tracker (https://phabricator.babeljs.io/T2653) ed è stata rifiutata, ma AFAIK il suo autore non l'ha chiesto qui.Babel v6: Come/Posso scrivere un plug-in che aggiunge una nuova sintassi (ovvero un nuovo operatore)?

Ho controllato i plugin Babel come packages/babel-plugin-syntax-do-expressions e sembrava che questi ES6 + nuova sintassi/gli operatori non sono stati effettivamente definiti nel plugin a tutti, ma essendo implemented in Babylon e semplicemente essere toggled on da questi plugin.

Lasciando il reclamo nello newest blog post che "Gli sviluppatori hanno costruito tutto dagli strumenti di debug [...] alle nuove sintassi sperimentali [...] per applicare regole complesse sui loro codebase" dubbioso - in realtà, ho cercato il intero ecosistema di plug-in, ma non ha trovato alcun plug-in in grado di offrire nuovi operatori/sintassi e solo un plug-in in grado di offrire un sovraccarico dell'operatore per alcuni operatori esistenti.

Quindi, è proprio vero che con Babel v6 saremo in grado di vedere i nuovi operatori/sintassi in fase di definizione nel campo utente e come?

Questa è anche l'occasione per ringraziare l'intero team Babel per il buon lavoro svolto!

PS: Ho iniziato a cercare come estendere la sintassi del parser di Babylon al fine di implementare un plugin che implementasse la "corrispondenza del modello" come in Julia methods.

+0

Ho la stessa domanda, ma sono riuscito a far funzionare un plug-in di sintassi senza aver hackerato alcun file di base. È un plug-in per [DCI] (http://fulloo.info/) ed è ancora in sviluppo, ma [TransferMoney.js] (https://github.com/mbrowne/babel-dci/blob/master/babel- il file di esempio plugin-transform-dci/examples/TransferMoney/TransferMoney.js) viene analizzato correttamente: https://github.com/mbrowne/babel-dci. Il modo in cui ho importato la libreria 'babylon' sembra però fragile; speriamo che ci sia un modo migliore/più ufficiale per farlo. Probabilmente seguirò la community Slack ... –

+0

Nota che per poter funzionare, devi prendere l'istanza di 'babylon' usata dal parser attualmente caricato ... quindi non puoi farlo 'npm install babylon' all'interno della cartella del plugin - che caricarebbe una copia separata di babylon. Ecco perché l'ho importato come 'babel-cli/node_modules/babel-core/node_modules/babylon/...'. –

+0

Si noti che il team Babel non ha ancora reso pubblica l'API del plug-in del parser, quindi tutto ciò è soggetto a modifiche comunque. Sono sicuro che ci sarà un modo migliore per scrivere plug-in parser in futuro. –

risposta

0

Il plug-in babel-plugin-transform-exponentiation-operator aggiunge un nuovo operatore (**). Sembra che tu debba essere in grado di iniziare con il loro codice (è piuttosto semplice) creare il tuo operatore, diverso.

+1

'**' non è un nuovo operatore. È un tipo valido ['BinaryExpression'] (https://github.com/babel/babel/tree/master/packages/babel-types#binaryexpression). È supportato da Babylon. – Gajus

+0

L'operatore "esponenziazione" è stato introdotto in ES7. Da MDN: "Questa è una tecnologia sperimentale, parte della proposta ECMAScript 2016 (ES7)." (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Exponentiation_(**)). Naturalmente, quello che fa Babel è il business di Babel, ma perché questo plugin esiste anche se "**" è supportato nella base Babel? – machineghost

+2

Mi spiace, il mio fraseggio è sbagliato. Per quanto riguarda "non un nuovo operatore", intendevo: è un operatore supportato da Babylon e non un nuovo operatore aggiunto da un plugin. "ma perché", perché Babylon è un parser e Babel è un transpiler. I plugin Babel sono transpilers. – Gajus

0

A partire da Babel v6.18.0, parserOpts è stata aggiunta l'opzione che consente di passare la configurazione al parser, ovvero a Babylon.

Babylon accetta le opzioni plugins, che possono essere utilizzate per specificare un elenco di nomi di plug-in da abilitare. Al momento della stesura di questo documento, è possibile fare riferimento solo a uno degli plugins built into Babylon.

Ci sono stati più suggerimenti per consentire plug-in esterni, ad es.

Il consenso è ~

Siamo stati contro l'idea di consentire estensioni esterne a Babilonia nel passato. Sarebbe molto più difficile supportare l'analisi personalizzata piuttosto che supportare le trasformazioni personalizzate. Babel ha già molto da supportare, quindi non abbiamo voluto aprirlo.

- https://github.com/babel/babylon/pull/5#issuecomment-195801336

Per abilitare l'analisi personalizzata, è necessario:

1

Qualche tempo fa, ho costruito un sottile wrapper Babel v6 per abilitare i plugin "avanzate" (vale a dire i plugin che aggiunge nuova sintassi):

https://github.com/lukehorvat/babby

Babby è puramente un esperimento, e non qualcosa che dovresti davvero usare. Ma mostra le modifiche minime che dovrebbero essere apportate a Babel/Babylon per supportare il tipo di plugin di cui l'OP sta parlando.