Bagaimana cara mendapatkan blok sumber org-babel bekerja dengan ES6-7?

9

Saya mengalami kesulitan mendapatkan org-babel untuk mengevaluasi blok kode ini

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

 # + BEGIN_SRC js: cmd "babel-node"

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

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

 # + END_SRC


Outputnya terlihat seperti ini

/ tmp / babel-3700Vaq / js-script-37003RN: 2
biarkan arr = [1, 2]; ^^^ SyntaxError: Deklarasi blok-lingkup (biarkan, konst, fungsi, kelas) belum didukung di luar mode ketat di exports.runInThisContext (vm.js: 53: 16) di Module._compile (module.js: 404: 25) di loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126#) di Object.require.extensions. (fungsi anonim) [sebagai .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7) di Module.load (module.js: 356: 32) di Function.Module._load (module.js: 311: 12) di Function.Module.runMain (module.js: 457: 10) di /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 di Object. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) di Module._compile (module.js: 425: 26) *

Tapi blok sumber ini tampaknya baik

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

 # + END_SRC

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


Sunting: Menambahkan fungsi pelaksana mandiri dengan "gunakan ketat"

# + BEGIN_SRC js: cmd "babel-node" 
(function xy () {
"gunakan ketat";
biarkan arr = [1, 2];
biarkan [x, y] = arr;
console.log (x);
console.log (y);
}) ()

# + END_SRC

# + HASIL:

Outputnya terlihat seperti ini

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

SyntaxError: Token yang tidak terduga [
    di exports.runInThisContext (vm.js: 53: 16)
    di Module._compile (module.js: 404: 25)
    di loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126#)
    di Object.require.extensions. (fungsi anonim) [sebagai .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    di Module.load (module.js: 356: 32)
    di Function.Module._load (module.js: 311: 12)
    di Function.Module.runMain (module.js: 457: 10)
    di /usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:161:27
    di Object. (/usr/local/lib/node_modules/babel-cli/lib/_babel-node.js:162:7)
    di Module._compile (module.js: 425: 26)


Sunting: Berkat @ebpa saya berhasil menyelesaikannya

npm install -g babel-preset-es2015


Ini adalah output yang saya dapatkan setelah mengevaluasi blok sumber default, yang tidak memiliki fungsi wrapper mengeksekusi sendiri.

/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372
          throw new Error ("Tidak dapat menemukan preset" + JSON.stringify (val) + "relatif ke direktori" + JSON.stringify (dirname));
          ^

Kesalahan: Tidak dapat menemukan preset "es2015" relatif terhadap direktori "/ tmp / babel-270346ez"
    di /usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:372:17
    di Array.map (asli)
    di OptionManager.resolvePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:364:20)
    di OptionManager.mergePresets (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:348:10)
    di OptionManager.mergeOptions (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:307:14)
    di OptionManager.init (/usr/local/lib/node_modules/babel-cli/node_modules/babel-core/lib/transformation/file/options/option-manager.js:465:10)
    di compile (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:81:45)
    di loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:126:14)
    di Object.require.extensions. (fungsi anonim) [sebagai .js] (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:136:7)
    di Module.load (module.js: 356: 32)


Sunting: Jalankan terminal dan jalankan babel-node

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

Keluaran

Kesalahan: Tidak dapat menemukan modul 'babel-preset-es2015'
    di Function.Module._resolveFilename (module.js: 337: 15)
    di Function.Module._load (module.js: 287: 25)
    di Module.require (module.js: 366: 17)
    di butuhkan (module.js: 385: 17)
    di repl: 1: 1
    di Object.exports.runInThisContext (vm.js: 54: 17)
    di _eval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:102:26)
    di REPLServer.replEval (/home/johnwind/.nvm/versions/node/v5.0.0/lib/node_modules/babel-cli/lib/_babel-node.js:187:14)
    di terikat (domain.js: 280: 14)
    di REPLServer.runBound [as eval] (domain.js: 293: 12)

Sunting: Tindak lanjut untuk menjalankan dan menjalankannya

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

Sunting: Posting ini memberi saya petunjuk untuk bagian puzzle ini

https://phabricator.babeljs.io/T6723

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

Sunting: Akhirnya berhasil dengan menginstal salinan lokal

$ mkdir local_babel
$ cd local_babel
$ npm init
install $ npm --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

menciptakan softlink untuk 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

Menambahkan ini ke init.el saya

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

keluaran

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

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

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

# + END_SRC

# + HASIL:
: 1
: 2
: tidak terdefinisi

Untuk saat ini saya memiliki salinan lokal dari babel-cli, babel-core, babel-preset-es2015. Yang masih belum bisa membungkus kepalaku karena ini seperti pemborosan sumber daya.

Tapi itu berhasil.

Johnathan Foong
sumber
Apakah Anda mencoba menambahkan "strict"di baris pertama kode sumber Anda? Inilah yang tampaknya menyarankan kesalahan.
wvxvw
tidak berhasil. Apakah Anda berhasil membuatnya bekerja? jika demikian, dapatkah Anda menguraikan langkah-langkah yang diambil.
Johnathan Foong
@JohnathanFoong Saya pikir @wvxvw "use strict"tidak berarti "strict", coba itu.
Jordon Biondo
ini adalah kesalahan yang saya dapat setelah menambahkan SyntaxError "use strict": Token tak terduga [at exports.runInThisContext (vm.js: 53: 16) di Module._compile (module.js: 404: 25) ...
Johnathan Foong
Mungkin Anda harus membungkus kode itu ke dalam fungsi self invaging, dan tambahkan "use strict";di awal.
caisah

Jawaban:

5

Ini adalah masalah dengan transisi Babel 6 untuk menggunakan plugin secara eksklusif. Anda perlu menginstal plugin preset es2015:

npm install -g babel-preset-es2015

dan juga membutuhkannya dalam perintah doa:

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

console.log(x);
console.log(y);
#+END_SRC
Epa
sumber
Terima kasih atas perbaikannya, dan sekarang saya menghadapi tantangan baru di bawah ini
Johnathan Foong
Dan Anda sudah menginstalnya secara global? Coba jalankan skrip di luar emacs hanya require ('babel-preset-es2015');untuk melihat bahwa skrip itu diinstal dan dapat diakses
ebpa
Saya menjalankan di atas pada babel-node di terminal dan hasilnya adalah Kesalahan: Tidak dapat menemukan modul 'babel-preset-es2015' ....
Johnathan Foong
setelah menjalankan cepat pada babel-doctor, saya perhatikan saya kehilangan .babelrc. Bagaimana saya harus berurusan dengan ini?
Johnathan Foong
jika babel-preset-es2015berhasil diinstal secara global, Anda mungkin memiliki masalah dengan NODE_PATH. Sejauh .babelrc babel-node --presets es2015melakukan hal yang sama seperti { "presets": ["es2015"] }pada .babelrc Anda, maka .babelrc tidak sepenuhnya diperlukan. .babelrc pasti akan lebih disukai, tetapi untuk beberapa alasan, babel-node tidak pernah mempertimbangkan ~ / .babelrc di sistem saya.
ebpa