herokuにNode.jsのアプリをデプロイする
Getting Started on Heroku with Node.js | Heroku Dev Center
herokuにNode.jsのアプリをデプロイするチュートリアル
package.jsonをよんでデプロイしてくれる
heroku localでローカルに展開できる
当然npm installしていないとエラーになるので注意
heroku openでデプロイ先のURLを開く
デフォルトでは/、第二引数で指定すれば/指定したpathにアクセスする
yarnを使いたい場合はengineに記述しておく
https://yarnpkg.com/lang/en/docs/package-json/#toc-engines
heroku configでconfの設定ができる
KEY=VALUE format
Best Practices for Node.js Development | Heroku Dev Center
Start every new project with npm init
Use a smart .npmrc
上の2つはyarnを使うのでとばす
Hop on the ES6 train
ES6の文法を使うと便利
Stick with lowercase
PSRみたいにクラス名とファイル名を一致させる規約もあるけど使っちゃだめ
理由:Node.jsがクロスプラットフォームだから
OSXやWindowsはmyclassとMyClassを同じに扱うがLinuxは別に扱う
ポータビリティのため
代わりに、lowercaseを使おう
Cluster your app
nodeのランタイムは1CPU、約1.5GBのメモリに制限されているので、クラスタ化されてないアプリをつよつよサーバにいれてもリソースの無駄
マルチコアをつかったり1.5GB以上のメモリを使いたいので、クラスタサポートをアプリに組み込もう
nodeはクラスタをサポートしている
Cluster | Node.js v10.6.0 Documentation
もしも今、よわよわハードで1つのプロセスしか動かさないとしても、将来に対応するハメになるからやっとくといいよ
自分のアプリが必要なプロセスの数を決定する方法は?
テストをすること
Optimizing Node.js Application Concurrency | Heroku Dev Centerでプラットフォームごとに提供される合理的なデフォルトからはじめてもいい
クラスタのプロセス管理の実装はnpmにいろいろある。自分にあったclusterの抽象化を選ぼう
masterとworkerのファイルを分割したいなら forky - npm
エントリポイントや機能が1つがいいなら throng - npm
Be environmentally aware
環境変数の利点をうまく使おう
Node向けのForemanを使う
Foreman is a manager for Procfile-based applications. Its aim is to abstract away the details of the Procfile format, and allow you to either run your application directly or export it to some other process management format.
ローカル開発が楽になる
Avoid garbage
V8はlazyでgreedyなGCを使う
デフォルトのメモリ制限が1.5GBぐらいで、未使用のメモリを再生する前に、制限に完全に達するまで待つことがあります
With its default limit of about 1.5 GB, it sometimes waits until it absolutely has to before reclaiming unused memory.
翻訳怪しいkadoyau.icon
メモリ利用量が増えていてリークはしていないのなら、nodeのlazyのふるまいだろう
GCを制御したいならProcfileにV8のフラグをつける
これは1.5GBよりメモリが少ない環境でアプリを動かしたいとき特に重要
Hook things up
npmのライフサイクルスクリプトは自動化のために便利なhook
ビルド前になんかしたいならpreinstall
ビルド後になんかしたいならpostinstall
環境変数も使える
hookのスクリプトが大きくなりすぎた場合は別ファイルに切り出せる
Only git the important bits
余計なもの(コンパイル結果やnode_modules)は.gitignoreして
理由
ネイティブでコンパイルする依存関係があると間違ったアーキテクチャでビルドしたバイナリが含まれてしまうので、ポータビリティがおちる