javascript - Babel'i CLI programı için nasıl kullanabilirim?


Babel kullanarak node üzerinde bazı CLI programları yazmaya çalışıyorum. Nasıl bir node CLI programında Babel kullanırım? sorusunu görmüştüm ve orada loganfsmyth şunu dedi:

İdealde, paketinizin dağıtımını yapmadan önce önceden derleme yaparsınız.

Tamam, şimdi kullanıyorum:

"scripts": {
    "transpile": "babel cli.js --out-file cli.es5.js",
    "prepublish": "npm run transpile",
}

Ama Babel, #!/usr/bin/env node başlığının hemen arkasına 'use strict'; satırını eklediğinde problemle karşılaştım. Örneğin, eğer benim cli.js dosyam varsa:

#!/usr/bin/env node

import pkg from './package'

console.log(pkg.version);

Bunu ben alırım:

#!/usr/bin/env node'use strict';

var _package = require('./package');

… … …

Ve bu işe yaramıyor. Çalıştırmayı denediğimde her zaman şunu alıyorum:

/usr/bin/env: node'use strict';: This file or directory does'nt exist

Bu problemi nasıl çözebilirim?

Cevap #1

@DanPrince'in çözümü tamamen kabul edilebilir ancak alternatif bir yol var

cli.js

bu dosyayı es5 olarak tut

#!/usr/bin/env node
require("./run.es5.js");

run.js

// Put the contents of your existing cli.js file here,
// but this time *without* the shebang
// ...

Betiklerinizi güncelleyin

"scripts": {
    "transpile": "babel run.js > run.es5.js",
    "prepublish": "npm run transpile",
}

Buradaki fikir, cli.js ara dosyasının transpile edilmesine gerek olmadığı için o dosyada shebang'inizi koruyabilmenizdir.

cli.js, sadece run.js'in Babel ile derlenmiş versiyonu olan run.es5.js'yi yükleyecektir.

Cevap #2

Yapı sürecinizin son aşaması olarak shebang eklemek için başka bir NPM betiği kullanabilirsiniz. Estetik olmayabilir ama işe yarar.

"scripts": {
  "transpile": "babel cli.js --out-file es5.js",
  "shebang": "echo -e '#!/usr/bin/env/node\n' $(cat es5.js) > cli.es5.js",
  "prepublish": "npm run transpile && npm run shebang",
}

O zaman orijinal cli.js dosyanız şöyle olurdu

import pkg from './package'

console.log(pkg.version);

Ortaya çıkan es5.js dosyası olur

'use strict';

var _package = require('./package');

Ve son olarak, cli.es5.js olur

#!/usr/bin/env node
'use strict';

var _package = require('./package');

Bu, temiz bir senaryo ile geliştirilebilir.

"scripts": {
  "transpile": "babel cli.js --out-file es5.js",
  "shebang": "echo -e '#!/usr/bin/env/node\n' $(cat es5.js) > cli.es5.js",
  "clean": "rm es5.js cli.es5.js",
  "prepublish": "npm run clean && npm run transpile && npm run shebang",
}

Elbette, bu, bash (veya bazı alternatif uyumlu kabuklar) olan bir sistemde olmanızı gerektirir, ancak bu komutların Node ile uygulanmaları için build betiklerini yeniden yazarak ShellJS gibi bir şeyle çapraz platform yapabilirsiniz.