¿Cómo hacer que el bloque fuente org-babel funcione con ES6-7?

9

Tengo dificultades para que org-babel evalúe este bloque de código con

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

 # + BEGIN_SRC js: cmd "babel-node"

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

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

 # + END_SRC


La salida se ve así

/ tmp / babel-3700Vaq / js-script-37003RN: 2
dejar arr = [1, 2]; ^^^ SyntaxError: las declaraciones de ámbito de bloque (let, const, function, class) aún no se admiten fuera del modo estricto en exportaciones.runInThisContext (vm.js: 53: 16) en Module._compile (module.js: 404: 25) en el cargador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5) en Object.require.extensions. (función anónima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7) en Module.load (module.js: 356: 32) en Function.Module._load (module.js: 311: 12) en Function.Module.runMain (module.js: 457: 10) en /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 en el objeto (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) en Module._compile (module.js: 425: 26) *

Pero este bloque fuente parece estar bien

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

 # + END_SRC

 # + RESULTADOS:
 El | 100 200 300 500 |


Editar: Se agregó la función de ejecución automática con "uso estricto"

# + BEGIN_SRC js: cmd "babel-node" 
(función xy () {
"uso estricto";
dejar arr = [1, 2];
let [x, y] = arr;
console.log (x);
console.log (y);
}) ()

# + END_SRC

# + RESULTADOS:

La salida se ve así

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

Error de sintaxis: símbolo inesperado [
    en exportaciones.runInThisContext (vm.js: 53: 16)
    en Module._compile (module.js: 404: 25)
    en el cargador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:5)
    en Object.require.extensions. (función anónima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    en Module.load (module.js: 356: 32)
    en Function.Module._load (module.js: 311: 12)
    en Function.Module.runMain (module.js: 457: 10)
    en /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
    en el objeto (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)
    en Module._compile (module.js: 425: 26)


Editar: Gracias a @ebpa, he logrado resolverlo con

npm install -g babel-preset-es2015


Este es el resultado que obtengo después de evaluar el bloque fuente predeterminado, que no tiene un contenedor de funciones de ejecución automática.

/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372
          lanzar un nuevo error ("No se pudo encontrar el preajuste" + JSON.stringify (val) + "relativo al directorio" + JSON.stringify (dirname));
          ^

Error: No se pudo encontrar el preset "es2015" relativo al directorio "/ tmp / babel-270346ez"
    en /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372:17
    en Array.map (nativo)
    en OptionManager.resolvePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:364:20)
    en OptionManager.mergePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:348:10)
    en OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:307:14)
    en OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:465:10)
    en la compilación (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:81:45)
    en el cargador (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:14)
    en Object.require.extensions. (función anónima) [como .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    en Module.load (module.js: 356: 32)


Editar: Encienda una terminal y ejecutó babel-node

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

Salida

Error: no se puede encontrar el módulo 'babel-preset-es2015'
    en Function.Module._resolveFilename (module.js: 337: 15)
    en Function.Module._load (module.js: 287: 25)
    en Module.require (module.js: 366: 17)
    en require (module.js: 385: 17)
    en la respuesta: 1: 1
    en Object.exports.runInThisContext (vm.js: 54: 17)
    en _eval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:102:26)
    en REPLServer.replEval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:187:14)
    en el límite (domain.js: 280: 14)
    en REPLServer.runBound [como eval] (domain.js: 293: 12)

Editar: un seguimiento para ponerlo en funcionamiento

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

Editar: Esta publicación me dio alguna pista sobre esta pieza de rompecabezas

https://phabricator.babeljs.io/T6723

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

Editar: Finalmente lo hice funcionar instalando una copia 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

creó un enlace suave para 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

Agregué esto a mi init.el

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

salida

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

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

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

# + END_SRC

# + RESULTADOS:
: 1
: 2
: indefinido

Por ahora tengo una copia local y global de babel-cli, babel-core, babel-preset-es2015. Lo que todavía no podía entender por completo, ya que es una pérdida de recursos.

Pero funciona.

Johnathan Foong
fuente
¿Intentaste agregar "strict"la primera línea de tu código fuente? Esto es lo que parece sugerir el error.
wvxvw
No funcionó. ¿Lograste que funcionen? Si es así, ¿podría elaborar los pasos dados?
Johnathan Foong
@JohnathanFoong Creo que @wvxvw "use strict"no quiso decir "strict", inténtalo.
Jordon Biondo
este es el error que obtengo después de agregar "use estricto" SyntaxError: token inesperado [en exportaciones.runInThisContext (vm.js: 53: 16) en Module._compile (module.js: 404: 25) ...
Johnathan Foong
Tal vez debería envolver ese código en una función de invocación automática y agregarlo "use strict";al principio.
caisah

Respuestas:

5

Este es un problema con la transición de Babel 6 al uso exclusivo de complementos. Debe instalar el complemento preestablecido es2015:

npm install -g babel-preset-es2015

y también lo requieren en el comando de invocación:

#+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
fuente
Gracias por la solución, y ahora me enfrento a un nuevo desafío a continuación
Johnathan Foong
¿Y lo tienes instalado globalmente? Intente ejecutar un script fuera de emacs solo require ('babel-preset-es2015');para ver que está instalado y accesible
ebpa
Ejecuté lo anterior en babel-node en una terminal y la salida fue Error: No se puede encontrar el módulo 'babel-preset-es2015' ...
Johnathan Foong
después de una carrera rápida en babel-doctor, me doy cuenta de que me falta un .babelrc. ¿Cómo debo lidiar con esto?
Johnathan Foong
si babel-preset-es2015se instaló correctamente a nivel mundial, probablemente tenga un problema con su NODE_PATH. En lo que respecta a .babelrc, babel-node --presets es2015logra lo mismo que { "presets": ["es2015"] }en su .babelrc, por lo que un .babelrc no es estrictamente necesario. Definitivamente se preferiría .babelrc, pero por alguna razón babel-node nunca considera ~ / .babelrc en mi sistema.
ebpa