Comment faire fonctionner le bloc source org-babel avec ES6-7?

9

J'ai du mal à obtenir org-babel pour évaluer ce bloc de code avec

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

 # + BEGIN_SRC js: cmd "babel-node"

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

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

 # + END_SRC


La sortie ressemble à ceci

/ tmp / babel-3700Vaq / js-script-37003RN: 2
soit arr = [1, 2]; ^^^ SyntaxError: déclarations de portée de bloc (let, const, fonction, classe) non encore prises en charge en dehors du mode strict à exports.runInThisContext (vm.js: 53: 16) à Module._compile (module.js: 404: 25) au chargeur (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5)) sur Object.require.extensions. (fonction anonyme) [comme .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7) à Module.load (module.js: 356: 32) à Function.Module._load (module.js: 311: 12) sur Function.Module.runMain (module.js: 457: 10) à /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 à Object. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) sur Module._compile (module.js: 425: 26) *

Mais ce bloc source semble bien

 # + BEGIN_SRC js: cmd "babel-node"
 const const = [10,20,30,50];
 const multiplyBy10 = numéros.map (a => a * 10);
 console.log (multiplyBy10);

 # + END_SRC

 # + RÉSULTATS:
 | 100 | 200 | 300 | 500 |


Edit: Ajout de la fonction auto-exécutable avec "use strict"

# + BEGIN_SRC js: cmd "babel-node" 
(fonction xy () {
"utiliser strict";
soit arr = [1, 2];
soit [x, y] = arr;
console.log (x);
console.log (y);
}) ()

# + END_SRC

# + RÉSULTATS:

La sortie ressemble à ceci

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

SyntaxError: jeton inattendu [
    à exports.runInThisContext (vm.js: 53: 16)
    à Module._compile (module.js: 404: 25)
    au chargeur (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5))
    sur Object.require.extensions. (fonction anonyme) [comme .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    à Module.load (module.js: 356: 32)
    à Function.Module._load (module.js: 311: 12)
    sur Function.Module.runMain (module.js: 457: 10)
    à /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
    à Object. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)
    à Module._compile (module.js: 425: 26)


Edit: Grâce à @ebpa, j'ai réussi à le résoudre avec

npm install -g babel-preset-es2015


C'est la sortie que j'obtiens après avoir évalué le bloc source par défaut, qui n'a pas de wrapper de fonction auto-exécutable.

/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372
          jeter une nouvelle erreur ("Impossible de trouver le préréglage" + JSON.stringify (val) + "par rapport au répertoire" + JSON.stringify (dirname));
          ^

Erreur: impossible de trouver le préréglage "es2015" par rapport au répertoire "/ tmp / babel-270346ez"
    à /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372:17
    sur Array.map (natif)
    sur OptionManager.resolvePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:364:20)
    sur OptionManager.mergePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:348:10)
    sur OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:307:14)
    sur OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:465:10)
    lors de la compilation (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:81:45)
    au chargeur (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:14)
    sur Object.require.extensions. (fonction anonyme) [comme .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    à Module.load (module.js: 356: 32)


Edit: Lancez un terminal et exécutez babel-node

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

Production

Erreur: impossible de trouver le module 'babel-preset-es2015'
    à Function.Module._resolveFilename (module.js: 337: 15)
    à Function.Module._load (module.js: 287: 25)
    à Module.require (module.js: 366: 17)
    au besoin (module.js: 385: 17)
    au repl: 1: 1
    sur Object.exports.runInThisContext (vm.js: 54: 17)
    à _eval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:102:26)
    sur REPLServer.replEval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:187:14)
    à lié (domain.js: 280: 14)
    sur REPLServer.runBound [comme eval] (domain.js: 293: 12)

Edit: un suivi pour le mettre en service

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

Edit: Ce post m'a donné un indice sur cette pièce de puzzle

https://phabricator.babeljs.io/T6723

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

Edit: Enfin, il a fonctionné en installant une copie 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

créé un softlink pour 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

Ajouté ceci à mon init.el

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

production

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

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

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

# + END_SRC

# + RÉSULTATS:
: 1
: 2
: indéfini

Pour l'instant, j'ai une copie locale et globale de babel-cli, babel-core, babel-preset-es2015. Ce qui ne pouvait toujours pas me permettre de comprendre cela, car c'est une sorte de gaspillage de ressources.

Mais ça marche.

Johnathan Foong
la source
Avez-vous essayé d'ajouter "strict"la première ligne de votre code source? C'est ce que l'erreur semble suggérer.
wvxvw
ça n'a pas marché. Avez-vous réussi à les faire travailler? dans l'affirmative, pourriez-vous préciser les mesures prises.
Johnathan Foong
@JohnathanFoong Je pense que @wvxvw "use strict"ne voulait pas dire "strict", essayez ça.
Jordon Biondo
c'est l'erreur que j'obtiens après avoir ajouté "use strict" SyntaxError: Token inattendu [à exports.runInThisContext (vm.js: 53: 16) à Module._compile (module.js: 404: 25) ...
Johnathan Foong
Vous devriez peut-être envelopper ce code dans une fonction auto-invoquante et l'ajouter "use strict";au début.
caisah

Réponses:

5

Il s'agit d'un problème lié à la transition de Babel 6 vers l'utilisation exclusive de plugins. Vous devez installer le plugin prédéfini es2015:

npm install -g babel-preset-es2015

et l'exigent également dans la commande d'invocation:

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

console.log(x);
console.log(y);
#+END_SRC
ebpa
la source
Merci pour la correction, et maintenant je fais face à un nouveau défi ci
Johnathan Foong
Et vous l'avez installé dans le monde? Essayez d'exécuter un script en dehors d'emacs avec juste require ('babel-preset-es2015');pour voir qu'il est installé et accessible
ebpa
J'ai exécuté ce qui précède sur babel-node dans un terminal et la sortie était Erreur: Impossible de trouver le module 'babel-preset-es2015' ....
Johnathan Foong
après un petit tour sur babel-doctor, je remarque qu'il me manque un .babelrc. Comment dois-je gérer cela?
Johnathan Foong
si a babel-preset-es2015été installé avec succès dans le monde, vous avez probablement un problème avec votre NODE_PATH. Dans la mesure où .babelrc va babel-node --presets es2015accomplit la même chose que { "presets": ["es2015"] }dans votre .babelrc, donc un .babelrc n'est pas strictement nécessaire. .babelrc serait certainement préféré, mais pour une raison quelconque, babel-node ne considère jamais ~ / .babelrc sur mon système.
ebpa