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/await
はco
でガマンする
の方針で来ていました。でも、そろそろバックエンドでも、
-
import/export
で書く -
async/await
で書く
という方向に統一していこうかなと思う、2017年初頭です。
遅くなりましたが、みなさま明けましておめでとうございます m(_ _)m