アレは主にクライアント版に重点を置いた内容だったので、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 件のコメント:
コメントを投稿