Edited at

今日から使う ES6 & async/await (Node編)

More than 1 year has passed since last update.

NodeでもES6のかなりの部分が動くようになってきました。v6以降、import/export以外は、割と気にせず書けるようになって嬉しい限りです。v7からはasync/awaitについても試験導入され、--harmony-async-awaitをつければ動くようになりました。(ただし、執筆時点ではNightly Buildのみ)

$ node --harmony-async-await index.js

そんな状況の中、ふつふつと...


  • Node v6あたりでもasync/awaitを動かしたい

  • もうBabelは避けたい (巨大な依存性を抱え込むことになるので)

  • あと、import/exportもやっぱり使いたいよね

という内なる声が聞こえてきます。


import/exportをどうにかする

reifyを使います。reifyは、次のようなソースコードを、

import a, { b, c as d } from "./module"

下のような感じに書き換えます。exportについても同様の変換がかかります。

let a, b, d;

module.import("./module", {
default: value => { a = value; },
b: value => { b = value; },
c: value => { d = value; },
});


async/awaitをどうにかする

async-to-genを使います。async-to-genは、次のようなソースコードを、

async function start() {

await doSomethingAsync()
}

下のような感じに書き換えます。

function start () {return __async(function*(){

yield doSomethingAsync()
}())}
function __async(g){......}

__asyncは、だいたいcoと同様の働きをする関数です。


合わせて...

上記のふたつを、とりあえずインストール。

$ npm install reify async-to-gen

実行時に使うには、nodeコマンドに--requireオプションをつければOK。index.jsを実行するのであれば、次のようになります。

$ node --require reify --require async-to-gen/register index.js

ちなみに、この2つを加えても追加される依存性はこれだけです。さようならBabel!

├─┬ async-to-gen@1.3.0 

│ ├── babylon@6.15.0
│ └─┬ magic-string@0.19.0
│ └── vlq@0.2.1
└─┬ reify@0.4.4
├── acorn@3.3.0
├── acorn-es7-plugin@1.1.5
├── ast-types@0.9.3
└── magic-string@0.16.0


まとめ

諸々、Nodeの正式対応までは待とうと思っていたのですが、フロントエンドとバックエンドのコードを行ったり来たりしていると、「あー、もー!」ってときがあるのは否定できません。今までは、ES6の文法は積極的に使いつつも、



  • require()する


  • async/awaitcoでガマンする

の方針で来ていました。でも、そろそろバックエンドでも、



  • import/exportで書く


  • async/awaitで書く

という方向に統一していこうかなと思う、2017年初頭です。

遅くなりましたが、みなさま明けましておめでとうございます m(_ _)m