現在JavaScriptの設定が無効になっています。このページを利用するにはJavaScriptの設定を有効にしてください。2015の2日目の記事です。一覧はこちらこんにちは。情報システム本部の伊藤(@koh110)です。社内システムの開発、運用を担当しています。LTS(v4.x)へバージョンアップしました。それに伴い実施したES6対応の中から3つの事例を紹介したいと思います。constに置き換えます。基本はconstに置き換えます。メリットは以下の点で、コードの品質向上につながると思います。プログラム中で変更不可である事を明示的に示せる。誤った使い方をした時にバグとして検出される。varを利用するとブロックの外までスコープが残ってしまいます。constを利用するとスコープがブロック内に収められ、誤った使い方をした時に検出されるようになります。ES6対応の中ではすごく簡単なので、まずはここから手をつけるといいのではと思います。なにより対応した気になれてモチベーションを保ったまま作業できるのが個人的に一番のメリットです。definedNode.jsのconstはただの再代入禁止なので、オブジェクトの操作は可能です。基本的に変数はconstを使うと思っておけば大丈夫でしょう。requireなんかはconstの格好の餌食です。constにしましょう。variable.letはどうしても再代入が必要な部分でしか使いません。今の所for文のiくらいに収めきれています。eslintで以下の2つのルールをあてています。functionに置き換えます。他の言語をすでに習得している人がJavaScriptを学習して、一番つまずきやすいのはthisだと思います。functionが入れ子になっていたりする中でthisが使われるともう初学者にはお手上げな状態です。今までだと、thisを一度別の変数に置き換えたり、bindしたりしていました。functionで以下のようにかけます。data;};文法的には()や{}を省略できたりするのですが、最低でも上のように()と{}はつけたほうが読みやすかったです。functionによって、thisの問題が解決する上に記述量が減るメリットがあります。eslintで以下ののルールをあてています。http://eslint.org/docs/rules/prefer-arrow-callback.htmlhttp://eslint.org/docs/rules/arrow-parens.htmlcallbackを撲滅しよう個人的にES6対応で一番恩恵が大きかったのはPromiseとGeneratorです。Node.jsではブラウザに比べてcallback地獄になりがちです。今までのNode.jsではおとなしくcallbackを書いたり、asyncといったモジュールが利用されてきました。これがPromiseとGeneratorで同期処理のようにかけるようになりました。v4がリリースされて以降、多くのモジュールがPromise対応しています。node-mongodb-nativeやioredisなど、すでにPromiseに対応しているモジュールも数多くあります。http://mongodb.github.io/node-mongodb-native/2.0/api/index.htmlhttps://www.npmjs.com/package/ioredis今のうちにPromiseやGeneratorを利用する事は、Promise化されゆくモジュールの対応にも役立つ事になるのでメリットは十分にあると思います。callback地獄については以下の記事がわかりやすいです。こちらの記事でも述べられていますが、実際にGeneratorによってNode.jsの書き方は大きく変わったと感じました。https://techblog.yahoo.co.jp/programming/js_callback/簡単に例をあげてみます。ex)処理したら1秒待つ。}});for文が使えるようになった分、同期的にみえませんか?Generatorではyieldという文字列を使うと、そこでPromiseの実行を待機してくれます。上の例で言うと、sleepという関数がsetTimeoutで何ms後かに解決するPromiseを返します。for文の中のyieldでPromiseが解決されるまで処理が待機され、Promiseが解決されると次の処理へ進みます。上の例ではPromiseを扱いやすくするためにcoというモジュールを利用しています。Promiseを扱うモジュールはbluebirdとcoが有名ですので、今はどちらかを利用するのがいいと思います。PromiseとGeneratorへ移行してみようファイル読み込み、書き込みを例にとってPromiseとGeneratorへの移行方法を見てみましょう。ファイルを読み込み、内容を加えて別ファイルに書き出し、書き出したファイルを再び読み込むという処理です。すべてのcallbackでエラー処理をしなければならない典型的なcallback地獄です。})});Promise化まずはPromise化します。function化もしてしまいます。自前でそれぞれの関数をPromiseラップしてもいいのですが、bluebirdなどがpromisifyというPromise化する関数を提供しているので利用すると楽です。promisifyAllを利用するとモジュールに実装されている関数のPromise版を「関数名Async」という名前で追加してくれます。外部モジュールに頼りたくないという気持ちはあるのですが、今後はいろいろなモジュールがPromise対応をするはずです。promisifyを利用してもPromise対応されたら、2行ほど直すだけなので移行コストはかからないと予想して、今の所promisifyを利用する方針です。console.log(err);});Promiseを使うとthenメソッドで呼び出す事ができるようになるので、フローがわかりやすくなります。catchを使って1カ所でエラーを受け取る事ができます。実行部分のコードが長いですし、同期的とは言いづらいです。ちなみにpromisifyを使わないで自前でPromise化をすると以下のようになります。実行部分をGenerator化してみましょう。console.log(err);});Generatorを利用する事で同期的に返り値を受け取れたり、ネストが一段に統一できました。callbackを使う時に比べて、かなり見通しがよくなったのではないかと思います。採用するデメリットもあり、Generatorはcallbackに比べて遅いと言われています。読みやすさと処理速度のトレードオフになると思いますが、今の所自分の利用範囲では処理速度がボトルネックになっている事はありません。そのレベルでチューニングが必要になると他に解消するべき部分があったりします。個人的に読みやすく書けることが一番重要と考えているので、「同期的に書ける」「ネストが深くなりにくい」というメリットをとり、Generatorを採用しています。おまけGeneratorで並列処理を書くGeneratorを使うと同期処理が簡単にかけるといいましたが、並列処理もとてもシンプルにかけます。1000);});おわりにES6対応で行った3事例を紹介しました。thisの扱いを均一化。他にもいろいろと移行できる点はありますが、まずはこの3点を中心に書き換えをしていくとES6のメリットを受けやすいのではないかと思います。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。