如何使用Babel进行CLI程序?

时间:2015-10-31 12:50:24

标签: javascript node.js ecmascript-6 babeljs

我尝试使用Babel在节点上编写一些CLI程序。我见过问题How do I use babel in a node CLI program?,而loganfsmyth说:

  

理想情况下,您需要在分发包之前进行预编译。

好的,现在我正在使用:

startActivity(new Intent(CurrentActivity.this, NewActivity.class));

但是,当Babel在"scripts": { "transpile": "babel cli.js --out-file cli.es5.js", "prepublish": "npm run transpile", } 标题后添加'use strict';行时,我遇到了问题。例如,如果我有#!/usr/bin/env node

cli.js

我会得到这个:

#!/usr/bin/env node

import pkg from './package'

console.log(pkg.version);

这不起作用。当我尝试运行它时,我总是得到:

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

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

… … …

我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:6)

来自@DanPrince的解决方案是完全可以接受的,但还有另一种选择

<强> cli.js

保留此文件es5

#!/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
// ...

将脚本更新为

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

这里的想法是cli.js垫片不需要传送,所以你可以将你的shebang保存在该文件中。

cli.js只会加载run.es5.js,这是run.js的babel-transiled版本。

答案 1 :(得分:1)

您可以使用另一个NPM脚本将shebang添加为构建过程的最后一部分。它不漂亮,但它有效。

"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",
}

然后您的原始cli.js将成为

import pkg from './package'

console.log(pkg.version);

生成的es5.js文件变为

'use strict';

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

最后,cli.es5.js变为

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

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

使用干净的脚本可以改善这一点。

"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",
}

当然,这需要您使用bash(或某些备用兼容shell)的系统,但是您可以通过重写构建脚本以使用这些命令的节点实现来使其成为跨平台{{3 }}。