Come far funzionare il blocco sorgente org-babel con ES6-7?


9

Sto avendo difficoltà a convincere org-babel a valutare questo blocco di codice con

emacs v24.5
node v5.0.0
babel-node v.6.6.5

 # + BEGIN_SRC js: cmd "nodo babele"

   let arr = [1, 2]; 
   let [x, y] = arr;

   console.log (x);
   console.log (y);

 # + END_SRC


L'output è simile al seguente

/ Tmp / babel-3700Vaq / js-script-37003RN: 2
let arr = [1, 2]; ^^^ SyntaxError: dichiarazioni nell'ambito del blocco (let, const, funzione, classe) non ancora supportate al di fuori della modalità rigorosa su exports.runInThisContext (vm.js: 53: 16) at Module._compile (module.js: 404: 25) at loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5) at Object.require.extensions. (funzione anonima) [as .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7) at Module.load (module.js: 356: 32) at Function.Module._load (module.js: 311: 12) at Function.Module.runMain (module.js: 457: 10) at /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 all'oggetto. (/Usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) at Module._compile (module.js: 425: 26) *

Ma questo blocco sorgente sembra a posto

 # + BEGIN_SRC js: cmd "nodo babele"
 numeri const = [10,20,30,50];
 const multiplyBy10 = numbers.map (a => a * 10);
 console.log (multiplyBy10);

 # + END_SRC

 # + RISULTATI:
 | 100 | 200 | 300 | 500 |


Modifica: aggiunta la funzione di auto-esecuzione con "usa rigoroso"

# + BEGIN_SRC js: cmd "nodo babele" 
(funzione xy () {
"usa rigoroso";
let arr = [1, 2];
let [x, y] = arr;
console.log (x);
console.log (y);
}) ()

# + END_SRC

# + RISULTATI:

L'output è simile al seguente

/ Tmp / babel-13529OHt / js-script-13529MVq: 6
    let [x, y] = arr;
        ^

SyntaxError: token imprevisto [
    su exports.runInThisContext (vm.js: 53: 16)
    at Module._compile (module.js: 404: 25)
    at loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5)
    at Object.require.extensions. (funzione anonima) [as .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    at Module.load (module.js: 356: 32)
    at Function.Module._load (module.js: 311: 12)
    at Function.Module.runMain (module.js: 457: 10)
    at /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
    all'oggetto. (/Usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)
    at Module._compile (module.js: 425: 26)


Modifica: grazie a @ebpa sono riuscito a risolverlo con

npm installa -g babel-preset-es2015


Questo è l'output che sto ottenendo dopo aver valutato il blocco sorgente predefinito, che non ha un wrapper di funzione auto-eseguibile.

/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372
          genera un nuovo errore ("Impossibile trovare la preselezione" + JSON.stringify (val) + "relativo alla directory" + JSON.stringify (dirname));
          ^

Errore: Impossibile trovare la preimpostazione "es2015" relativa alla directory "/ tmp / babel-270346ez"
    at /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372:17
    su Array.map (nativo)
    su OptionManager.resolvePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:364:20)
    su OptionManager.mergePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:348:10)
    su OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:307:14)
    su OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:465:10)
    at compile (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:81:45)
    at loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:14)
    at Object.require.extensions. (funzione anonima) [as .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    at Module.load (module.js: 356: 32)


Modifica: avvia un terminale ed esegue il nodo babel

> request ('babel-preset-es2015');

Produzione

Errore: Impossibile trovare il modulo 'babel-preset-es2015'
    at Function.Module._resolveFilename (module.js: 337: 15)
    at Function.Module._load (module.js: 287: 25)
    at Module.require (module.js: 366: 17)
    at request (module.js: 385: 17)
    a sostitu: 1: 1
    at Object.exports.runInThisContext (vm.js: 54: 17)
    at _eval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:102:26)
    su REPLServer.replEval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:187:14)
    at bound (domain.js: 280: 14)
    at REPLServer.runBound [come eval] (domain.js: 293: 12)

Modifica: un seguito per metterlo in funzione

http://rwx.io/posts/org-with-babel-node-updated/

Modifica: questo post mi ha dato qualche indizio su questo pezzo di puzzle

https://phabricator.babeljs.io/T6723

http://discuss.babeljs.io/t/error-parsing-jsx-with-global-installation-babel-preset-react/59/6

Modifica: finalmente ha funzionato installando una copia locale

$ mkdir local_babel
$ cd local_babel
$ npm init
$ npm install --save-dev babel-cli
$ npm install --save-dev babel-core
$ npm install --save-dev babel-preset-es2015
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3

creato un softlink per babel-node

$ cd / usr / local / bin
$ ln -s ~ / local_babel / node_modules / babel-cli / bin / babel-node.js org-babel-node

.zshrc

export npm_config_prefix = $ HOME / .node_modules
export PATH = $ PATH: $ HOME / .node_modules / bin

Aggiunto questo al mio init.el

(setenv "NODE_PATH"
    (concat
        "/ home / johnwind / local_babel / node_modules" ":"
         (getenv "NODE_PATH")
    )
)

produzione

# + BEGIN_SRC js: cmd "org-babel-node --presets es2015" 

let arr = [1, 2];
let [x, y] = arr;

console.log (x);
console.log (y);

# + END_SRC

# + RISULTATI:
: 1
: 2
: non definito

Per ora ho una copia sia locale che globale di babel-cli, babel-core, babel-preset-es2015. Che ancora non riesco ancora a avvolgere la testa perché è una specie di spreco di risorse.

Ma funziona


Hai provato ad aggiungere "strict"nella prima riga del tuo codice sorgente? Questo è ciò che sembra suggerire l'errore.
wvxvw,

non ha funzionato. Sei riuscito a farli funzionare? in tal caso, potresti elaborare i passi fatti.
Johnathan Foong,

@JohnathanFoong Penso che @wvxvw "use strict"non volesse dire "strict", provalo.
Jordon Biondo,

questo è l'errore che sto ricevendo dopo aver aggiunto "usa rigoroso" SintassiError: token imprevisto [at exports.runInThisContext (vm.js: 53: 16) in Module._compile (module.js: 404: 25) ...
Johnathan Foong

Forse dovresti avvolgere quel codice in una funzione auto-invocante e aggiungerlo "use strict";all'inizio.
Caisah

Risposte:


5

Questo è un problema con la transizione di Babel 6 all'uso esclusivo dei plugin. Devi installare il plugin preimpostato es2015:

npm install -g babel-preset-es2015

e anche richiederlo nel comando di invocazione:

#+BEGIN_SRC js :cmd "babel-node --presets es2015"
let arr = [1, 2];
let [x, y] = arr;

console.log(x);
console.log(y);
#+END_SRC

Grazie per la correzione, e ora affronterò una nuova sfida di seguito
Johnathan Foong

E lo hai installato a livello globale? Prova a eseguire uno script all'esterno di emacs solo require ('babel-preset-es2015');per vedere che è installato e accessibile
ebpa

Ho eseguito quanto sopra su babel-node in un terminale e l'output era Errore: Impossibile trovare il modulo 'babel-preset-es2015' ....
Johnathan Foong

dopo una breve corsa su babel-doctor, noto che mi manca un .babelrc. Come dovrei occuparmene?
Johnathan Foong,

se è babel-preset-es2015stato installato con successo a livello globale, probabilmente hai un problema con il tuo NODE_PATH. Per quanto riguarda .babelrc babel-node --presets es2015compie la stessa cosa { "presets": ["es2015"] }del tuo .babelrc, quindi un .babelrc non è strettamente necessario. .babelrc sarebbe sicuramente preferito, ma per qualche ragione babel-node non considera mai ~ / .babelrc sul mio sistema.
ebpa,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.