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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.