Como obter o bloco de origem org-babel trabalhando com o ES6-7?

9

Estou tendo dificuldade em obter o org-babel para avaliar este bloco de código com


nó do emacs v24.5 v5.0.0 nó
babel v.6.6.5

 # + BEGIN_SRC js: cmd "nó de babel"

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

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

 # + END_SRC


A saída é assim

/ tmp / babel-3700Vaq / js-script-37003RN: 2
let arr = [1, 2]; ^^^ SyntaxError: Declarações com escopo em bloco (let, const, function, class) ainda não suportadas fora do modo estrito em export.runInThisContext (vm.js: 53: 16) em Module._compile (module.js: 404: 25) no carregador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5) em Object.require.extensions. (função anônima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7) em Module.load (module.js: 356: 32) em Function.Module._load (module.js: 311: 12) em Function.Module.runMain (module.js: 457: 10) em /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 no objeto. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) em Module._compile (module.js: 425: 26) *

Mas esse bloco de origem parece bom

 # + BEGIN_SRC js: cmd "nó de babel"
 números const = [10,20,30,50];
 const multiplyBy10 = numbers.map (a => a * 10);
 console.log (multiplyBy10);

 # + END_SRC

 # + RESULTADOS:
 | 100 200 300 500


Edit: Adicionado função de execução automática com "use strict"

# + BEGIN_SRC js: cmd "nó de babel" 
(função xy () {
"use strict";
let arr = [1, 2];
let [x, y] = arr;
console.log (x);
console.log (y);
}) ()

# + END_SRC

# + RESULTADOS:

A saída é assim

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

SyntaxError: token inesperado [
    em export.runInThisContext (vm.js: 53: 16)
    em Module._compile (module.js: 404: 25)
    no carregador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5)
    em Object.require.extensions. (função anônima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    em Module.load (module.js: 356: 32)
    em Function.Module._load (module.js: 311: 12)
    em Function.Module.runMain (module.js: 457: 10)
    em /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
    no objeto. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)
    em Module._compile (module.js: 425: 26)


Edit: Graças a @ebpa eu consegui resolver isso com

npm install -g babel-preset-es2015


Esta é a saída que estou obtendo após avaliar o bloco de origem padrão, que não possui um wrapper de função auto-executável.

/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372
          throw new Error ("Não foi possível encontrar a predefinição" + JSON.stringify (val) + "relativo ao diretório" + JSON.stringify (dirname));
          ^

Erro: não foi possível encontrar a predefinição "es2015" relativa ao diretório "/ tmp / babel-270346ez"
    em /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372:17
    em Array.map (nativo)
    em OptionManager.resolvePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:364:20)
    em OptionManager.mergePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:348:10)
    em OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:307:14)
    em OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:465:10)
    na compilação (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:81:45)
    no carregador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:14)
    em Object.require.extensions. (função anônima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    em Module.load (module.js: 356: 32)


Edit: Inicie um terminal e execute o nó babel

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

Resultado

Erro: Não foi possível encontrar o módulo 'babel-preset-es2015'
    em Function.Module._resolveFilename (module.js: 337: 15)
    em Function.Module._load (module.js: 287: 25)
    em Module.require (module.js: 366: 17)
    em require (module.js: 385: 17)
    no repl: 1: 1
    em 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)
    em REPLServer.replEval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:187:14)
    no limite (domain.js: 280: 14)
    em REPLServer.runBound [como avaliação] (domain.js: 293: 12)

Edit: Um acompanhamento para colocá-lo em funcionamento

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

Edit: Este post me deu algumas dicas para este pedaço de quebra-cabeça

https://phabricator.babeljs.io/T6723

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

Edit: Finalmente consegui instalar uma cópia local

$ 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

criou um softlink para babel-node

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

.zshrc

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

Adicionei isso ao meu init.el

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

resultado

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

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

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

# + END_SRC

# + RESULTADOS:
: 1
: 2
: Indefinido

Por enquanto, tenho cópia local e global de babel-cli, babel-core, babel-preset-es2015. O que ainda não conseguia entender tudo isso, pois é uma espécie de desperdício de recursos.

Mas funciona.

Johnathan Foong
fonte
Você tentou adicionar "strict"na primeira linha do seu código-fonte? Isto é o que o erro parece sugerir.
wvxvw
não funcionou. Você conseguiu fazê-los funcionar? Nesse caso, você poderia elaborar as etapas adotadas.
Johnathan Foong
@JohnathanFoong Acho que @wvxvw "use strict"não significava "strict", tente isso.
Jordon Biondo
este é o erro que eu estou obtendo após adicionar "use strict" SyntaxError: token inesperado [no exporte.runInThisContext (vm.js: 53: 16) em Module._compile (module.js: 404: 25) ...
Johnathan Foong 31 /
Talvez você deva agrupar esse código em uma função auto-invocável e adicionar "use strict";no início.
caisah

Respostas:

5

Esse é um problema com a transição do Babel 6 para o uso exclusivo de plug-ins. Você precisa instalar o plugin predefinido es2015:

npm install -g babel-preset-es2015

e também requerê-lo no comando de chamada:

#+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
fonte
Obrigado pela correção, e agora eu enfrentar um novo desafio abaixo
Johnathan Foong
E você tem instalado globalmente? Tente executar um script fora emacs com apenas require ('babel-preset-es2015');para ver que ele está instalado e acessível
EBPa
Corri o exposto na babel-node em um terminal e a saída foi de erro: Não é possível encontrar o módulo 'babel-preset-es2015' ....
Johnathan Foong
depois de uma rápida corrida no babel-doctor, percebo que estou sentindo falta de um .babelrc. Como devo lidar com isso?
precisa saber é o seguinte
Se babel-preset-es2015foi instalado com sucesso em todo o mundo, você provavelmente tem um problema com o seu NODE_PATH. No que diz respeito ao .babelrc, babel-node --presets es2015realiza o mesmo que { "presets": ["es2015"] }no seu .babelrc, portanto, um .babelrc não é estritamente necessário. O .babelrc seria definitivamente o preferido, mas por algum motivo o babel-node nunca considera ~ / .babelrc no meu sistema.
Ebpa 08/03