LoginSignup
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-14

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20