2016年11月13日日曜日

コーディングガイドライン: JavaScript編(サーバサイドJavaScript)

以前、JavaScriptのコーディングガイドラインを公開しました。
アレは主にクライアント版に重点を置いた内容だったので、Node.jsを使ったサーバサイドJavaScriptについてのガイドラインも公開しておきます。


Promiseについて熟知する

  • おそらく一番重要なので最初に書きました。
  • あとで詳しく書きます。

ES6の文法を使ってもよい

  • V8はES6にも一部対応している
    • 配列・オブジェクトの最後のカンマ
    • テンプレートリテラル
    • class
  • 対応していない文法もある
    • import / export
    • 関数のデフォルト引数
    • 関数の可変引数
    • let / const (use strictモードなら使用可)
  • 従来のJavaScript(ES5)と区別をつけるため、拡張子は .es6 にする
  • リソースがもったいないので babel-node は使わない

原則として非同期処理

  • Java ServletやPHPとは全く別の考えが必要
  • 非同期が面倒だからといって同期バージョンの関数(fs.readFileSync とか XMLHttpRequst の同期通信とか)を使うと、処理完了まで他のリクエストが全部ブロックされる

Promiseを使いこなす

  • 大事なことなので2回書きました。
  • とにかくPromiseについて熟知しておくこと
    • 大事なことなので3回書きました。
  • Promiseを使うとコールバック地獄やネスト地獄を回避できる
  • 複数のクエリやAjaxリクエストを並列で走らせて、全ての結果を取得できたら別の処理を行うといったこともでき、効率がいい
  • Promiseについて(MDN)
  • Promiseを使うと何がうれしいかの説明
    • ただし、ここに出てくる`done()`や`fail()`は標準には含まれていない

時間のかかる処理、ループ回数を見積もれない処理はしない

  • 例1. ユーザが入力した数値分繰り返し処理
  • 例2. DBから全件取得(取得自体は非同期だけど、取得後に何らかの処理をする場合に時間がかかる)
  • ServletやPHPと同じ感覚で書いていると簡単にハマる
  • 関数内での処理は最小限にとどめ、終わったらすぐシステムに処理を戻す
    • ループ処理は、多くても10〜20回程度にとどめる
    • DBからデータを取得する場合は必ず LIMIT で件数を絞る
    • どうしても必要な場合は、別プロセスを起動するかcron等でオフライン処理にする

サーバ起動には生Nodeではなくpm2を使う

  • プロセスをデーモン化してくれる
  • ブート時に自動実行もできる
  • コア数分のプロセスを自動で立ち上げてクラスタリングできる
  • ログ記録とかモニタとか便利な機能がたくさん

その他

  • 本格運用するならフロントエンドにnginxを置く
    • HTTPS・gzip圧縮・負荷分散などリバースプロキシとして使い、Node.jsの仕事を最小限にする
    • スケールアウトしやすくする
  • 静的ファイルもnginxから配布したほうが速い

0 件のコメント:

コメントを投稿