JavaScript開発者は2015年末までに、膨大な数のツールを自由に使用できました。 このエコシステムで迷子になりやすいので、成功したチームは、時間を無駄にせず、プロジェクトの健全性を維持できるようにする確立されたルールに従います。 Herokuチームによる2016年の記事の翻訳版では、ウェブ開発者の10の習慣について話しています。 書かれていることの80%をすでに知っている可能性が高い-興味深いのは、残りの2つのトリックについて読むことです。
1. npm initで新しいプロジェクトを開始します
このコマンドは、プロジェクトディレクトリの名前とウィザードの質問への回答に基づいて、すぐに正しいpackage.jsonを作成します。
$ mkdir my-awesome-app $ cd my-awesome-app $ npm init --yes
--yesフラグを使用すると、ウィザードの質問に答えず、結果のpackage.jsonの engineフィールドで、必要なバージョンのノード( node -v )をすぐにインストールできます。
"engines": { "node": "4.2.1" }
2.スマート.npmrcを使用する
デフォルトでは、 npmはpackage.jsonにインストール済みの依存関係を書き込みません(常に依存関係を追跡する必要があります!)。
--saveフラグを使用してpackage.jsonを自動的に更新する場合、 npmは ^プレフィックスを付けて依存関係名を保存します。 セマンティックバージョニングは依存関係を危険にさらします。クリーンインストールでは、依存関係の他のバージョンがプロジェクトにインストールされる可能性があり、誰がバグや問題があるかを知っているためです。 この方法は、開発時には有効ですが、実稼働には適していません。 1つの解決策は、依存関係の正確なバージョンを保持することです。
$ npm install foobar --save --save-exact
さらに良いことに、すべてが自動的に行われるように、グローバルnpm設定を〜/ .npmrcに変更します。
$ npm config set save=true $ npm config set save-exact=true $ cat ~/.npmrc
この構成では、依存関係をインストールすると正確なバージョンが保持され、プロジェクトは不気味な「バージョンドリフト」を追い越しません。
開発中に依存関係の最新バージョンを使用し、販売用に凍結する場合は、 shrinkwrap関数を使用できます。 このような構成では、もう少し手間がかかりますが、依存関係をバージョニングするためのより柔軟なアプローチが可能になります。
3.出発するES6列車に注意してください
Node.jsのバージョン4以降、多くのES6機能を使用できます。 シンプルで便利な構文の改善を使用して、コードをより簡単に理解しやすくしてください。
let user = users.find(u => u.id === ID); console.log(`Hello, ${ user.name }!`);
4.小文字に固執する
一部の言語では、クラスと同じ方法でファイルに名前を付けることを推奨しています。 たとえば、 MyClassを実装するファイルはMyClass.jsと呼ばれることが提案されています。 ノードではこれを行わないでください。 小文字を使用:
let MyClass = require('my-class');
Node.jsは、優れたクロスプラットフォームサポートを備えたLinuxプログラムのまれな例です。 OSXとWindowsはファイルmyclass.jsとMyClass.jsを同じファイルと見なしますが、Linuxはそうではありません。 クロスプラットフォームコードを記述したい場合は、 requireに使用するのと同じレジスタ内のファイルに名前を付ける必要があります。
それを正しく行う最も簡単な方法は、小文字、つまりmy-class.js ( 翻訳者注 :またはcss表記法よりもプログラマーの間で人気が高いmy_class.js )を使用することです。
5.アプリケーションをクラスター化する
ノードプロセスは1コアと1.5ギガバイトのRAMに制限されているため、非クラスター化アプリケーションを強力なサーバーにデプロイすると、有用なリソースが無駄になります。 複数のコアと大量のメモリを使用するには、アプリケーションにクラスタリングサポートを追加します。 メモリのギガバイトのシングルコアvpsでアプリケーションを実行している場合でも、クラスタリングを追加することは将来の良い基盤となります。
最適なプロセス数を見つける最良の方法は、もちろんテストです。 しかし、初心者にとっては、プラットフォームが提供するデフォルト値が適切です。 もちろん、適切なフォールバック:
const CONCURRENCY = process.env.WEB_CONCURRENCY || 1;
クラスタリングを使用すると、フロー制御のために車輪を再発明する必要がなくなります。 「master」と「worker」の間でファイルを分離したい場合は、 forkyを試してください。 単一のエントリポイントを使用する場合は、 throngを使用します。
6.環境変数に注意する
構成ファイルの代わりに環境変数を使用します。 これを行うには、 node-foremanをインストールします 。
$ npm install --save --save-exact foreman
次に、 Procfileを作成して、アプリケーションのタイプを示します。
web: bin/web worker: bin/worker
実行するエイリアスをインストールします:
"scripts": { "start": "nf start" }
ここで、環境設定を変更するには、 node- foremanによって自動的にロードされる.envという名前のファイルを作成(および.gitignoreに追加)するだけです:
DATABASE_URL='postgres://localhost/foobar' HTTP_TIMEOUT=10000
このような設定では、1つのnpm startコマンドでWebおよびワーカープロセスを開始し、環境変数に従って設定を適用できます。 「config / abby-dev.js」、「config / brian-dev.js」、「config / qa1.js」、「config / qa2.js」、「config / prod.js」などよりもはるかに簡単です。 。
7.ゴミを避ける
Node.js(V8エンジンで表される)は、「遅延」および「貪欲」なガベージコレクターを使用します。 デフォルトの1.5ギガバイトの制限では、彼は最後まで待機してから未使用のメモリを解放することがよくあります。 使用中のメモリが徐々に増加している場合、これはリークではなく、ノードガベージコレクタの標準的な動作である可能性があります。
ガベージコレクターをより適切に制御するために、V8エンジンのコマンドをProcfileに配置できます。
web: node --optimize_for_size --max_old_space_size=920 --gc_interval=100 server.js
これは、使用可能なメモリが1.5ギガバイト未満のマシンでアプリケーションを実行している場合に特に重要です。 たとえば、メモリが512 MBのコンテナの場合、引数文字列は次のようになります。
web: node --optimize_for_size --max_old_space_size=460 --gc_interval=100 server.js
8.フックを使用する
node.jsの「ライフサイクルスクリプト」は、広範な自動化機能を提供します。 たとえば、アプリケーションをビルドする前に何かを実行する必要がある場合は、 プレインストールスクリプトを使用できます。 grunt、gulp、browserify、またはwebpackを使用してアセットを構築する必要がありますか? postinstallスクリプトを使用します。 これらのスクリプトはすべてpackage.jsonで直接設定できます。
"scripts": { "postinstall": "bower install && grunt build", "start": "nf start" }
そしてもちろん、環境変数を使用してスクリプトを管理できます。
"postinstall": "if $BUILD_ASSETS; then npm run build-assets; fi", "build-assets": "bower install && grunt build"
スクリプトが複雑になりすぎる場合-ファイルに転送します。
"postinstall": "scripts/postinstall.sh"
重要 : package.jsonのスクリプトは、。 / node_modules / .binがPATHに自動的に追加されて実行されるため、webpackなどのローカルにインストールされたnpmパッケージを直接呼び出すことができます。 これにより、パッケージをグローバルにインストールする必要がまったくなくなります。
9.重要なビットのみをGitする
このタイトルがとても気に入ったので、翻訳せずにそのままにしました。 言葉の美しい遊びは、「重要なビットのみ」=「gitにとって重要なものだけを追加する」です。 ほとんどのアプリケーションは、2種類のファイルで構成されています。ファイルは自動的に生成される場合とされない場合があります。 バージョン管理システムを使用する場合、自動的に生成できるファイルをシステムに追加しないでください。
たとえば、アプリケーションには、依存関係がインストールされたnode_modulesディレクトリがあります。 はい、バージョン管理システムに追加する人がいます! これをする必要はありません。 package.jsonで必要な依存関係のバージョンを指定すると、 npm installがnode_modulesをクリアしないため、バージョン管理システムから既にファイルが存在する場合に障害が発生する可能性があるため、はるかに信頼性が高くなります。
また、生成されたファイルを追加すると、リポジトリのログと通知に多くのノイズが発生します。 さらに、一部の依存関係はインストール中にコンパイルを必要とするため、インストールされたバージョンをリポジトリに追加すると、アプリケーションがソート不能になり、奇妙なエラーが発生する可能性があります。
同じ理由で、 bower_componentsまたはコンパイル済みのgruntアセットを追加しないでください。 node_modulesディレクトリがプロジェクトのバージョン管理システムに既に追加されている場合、たとえば次のようにいつでも削除できます。
$ echo 'node_modules' >> .gitignore $ git rm -r --cached node_modules $ git commit -am 'ignore node_modules'
また、通常、コードを乱雑にしないために無視するnpmログを追加します。
$ echo 'npm-debug.log' >> .gitignore $ git commit -am 'ignore npm-debug'
これらの重要度の低いファイルを無視することで、リポジトリのサイズを縮小し、コミットを簡素化し、マージの競合を発生させません。
10.簡素化
ITの予測は、ありがたい仕事です。 しかし、私はまだ一つのことをしています。 JavaScriptの場合、2016年は簡素化の年になると予測しています。
ますます多くのプログラマがソリューションのアーキテクチャを簡素化しています。 モノリシックMVCソリューションは、CDNを介して配布するのに非常に便利な静的フロントエンドと、動的データ用のNode.jsバックエンドに置き換えられています。
また、複雑なアセンブリシステムがプロジェクトを複雑にしていることに気付き始めました。 開発者は、特にbower、gulp、gruntの代わりにnpmスクリプトを使用することにより、これらの決定を簡素化しています。
そして最後に、2016年には、作成したコードを簡素化します。 Douglas CrockfordがThe Better Partsで示したように、場合によっては、これは不要な機能の拒否になります。 または、逆に、新しい機能を追加することで簡素化されます。 私の好きな非同期と待ちます。 ノードにはまだありませんが、BabelJSなどのトランスポーターをいつでも使用できます。
1つのプロジェクトにいくつの新しいテクノロジーを詰め込むことができるかを競い合うのではなく、作業の簡素化に焦点を合わせます。