ホームページ >ウェブフロントエンド >jsチュートリアル >10 node.jsベストプラクティス:ノードの達人からの啓発

10 node.jsベストプラクティス:ノードの達人からの啓発

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-17 09:26:09151ブラウズ

10 node.jsベストプラクティス:ノードの達人からの啓発

キーテイクアウト

  • ビルド、テスト、アプリの起動などのタスクを整理するためにNPMスクリプトを使用します。これは、開発者が新しいプロジェクトを見ると、単一の真実の源を提供します。 プロジェクトの初期段階から、process.env.node_envなどの環境変数を採用します。これにより、機密情報の漏れが保証されず、最初からコードを適切に構築します。 イベントループと、setimmediate()またはsetimeout()を使用して次のイベントループサイクルにCPU集約型タスクをオフロードする方法を理解してください。
  • 単純さのために機能的継承を使用し、プロトタイプの継承またはクラスの複雑さを回避します。これは、多くの多作なノード貢献者の中で好ましい方法です。
  • TypeScript、Flow、ELM、ClojureScript、CoffeeScriptなどのJavaScriptの代替案を検討してください。これは、セットアップが非常に少ないチームに利益をもたらす可能性があります。
  • 10 node.jsベストプラクティス:ノードの達人からの啓発は、ゲスト作家のAzat Mardanによるものです。 SitePointのゲスト投稿は、Webコミュニティの著名な作家やスピーカーからの魅力的なコンテンツを提供することを目指しています。 2017年に優れたノード開発者になるための以前の第10条のヒントで、今日のコードに適用できる10のnode.jsのヒント、トリック、テクニックを紹介しました。この投稿は、ノードスキルを次のレベルに引き上げるのに役立つ、さらに10のベストプラクティスを備えたその流れで続きます。これが私たちがカバーしようとしているものです:
    1. NPMスクリプトを使用します - NPMスクリプトとノードでよりよく整理できるときに、BASHスクリプトの書き込みを停止します。たとえば、NPMの実行ビルド、開始、テスト。 NPMスクリプトは、ノード開発者が新しいプロジェクトを見るときの単一の真実の源のようなものです。
    2. env varsを使用します - 開発、または生産に設定して、process.env.node_envを使用します。一部のフレームワークもこの変数を使用するので、コンベンションでプレイしてください。
    3. イベントループを理解します - setimmediate()は即時ではありませんが、次のTick()は次のものではありません。 setimmediate()またはsetimeout()を使用して、次のイベントループサイクルにCPU集約型タスクをオフロードします。
    4. 機能的継承の使用 - 最も多産なノード貢献者のように機能的継承を使用するだけで、プロトタイプの継承またはクラスのデバッグとデバッグと理解の脳を排出するトラップに入ることを避けます。
    5. 適切に名前を付ける - ドキュメントとして役立つ意味のある名前を付けます。また、大文字のファイル名はありません。必要に応じてダッシュを使用してください。ファイル名の大文字は奇妙に見えるだけでなく、クロスプラットフォームの問題を引き起こす可能性があります。
    6. JavaScriptを使用しないことを検討してください - ES6/7は、Coffeescriptと呼ばれるより良いJavaScriptをすでに持っていたときに、6年間の会議から生まれた哀れな追加です。発送コードをより速くしたい場合は、var/const/let、セミコロン、クラス、その他の議論の議論を止めるのを止めてください。
    7. ネイティブコードを提供する - トランスピラーを使用する場合、ネイティブJSコード(ビルドの結果)をコミットして、プロジェクトがビルドなしで実行できるように
    8. gzipを使用 - duh! npm i圧縮-Sおよび正気なロギング - 環境に応じて少しではない。 npm i morgan -s
    9. スケールアップ - ノード開発の初日からクラスタリングとステートレスサービスを使用することについて考え始めます。 PM2またはStrongloopのクラスター制御
    10. を使用します
    11. キャッシュリクエスト - NginxやCDNキャッシュなどのNginxや要求レベルキャッシュなどの静的ファイルサーバーの後ろに隠して、ノードサーバーから最大ジュースを取得します。
    12. それでは、それぞれを個別に見てみましょう。私たちは?
    13. にしましょう
    14. npmスクリプトを使用
    15. ビルド、テスト、そして最も重要なこととして、アプリを開始するためのNPMスクリプトを作成することは、現在ほとんど標準です。これは、Node開発者が新しいノードプロジェクトに遭遇したときに最初の場所です。一部の人々(1、2、3、4)は、より低レベルではあるが信頼できるNPMスクリプトのために、グラント、ガルプなどを捨てています。私は彼らの議論を完全に理解することができます。 NPMスクリプトにはフック前とポストフックがあることを考えると、非常に洗練されたレベルの自動化に到達できます。
      <span>"scripts": {
      </span>  <span>"preinstall": "node prepare.js",
      </span>  <span>"postintall": "node clean.js",
      </span>  <span>"build": "webpack",
      </span>  <span>"postbuild": "node index.js",
      </span>  <span>"postversion": "npm publish"
      </span><span>}
      </span>

      フロントエンドのために開発する際には、コードを再構築するために2つ以上の時計プロセスを実行する必要があります。たとえば、1つはWebパック用、もう1つはNodemon用です。最初のコマンドがプロンプトをリリースしないため、&&でこれを行うことができます。ただし、複数のプロセスを生成して同時に実行できる、同時に呼ばれる便利なモジュールがあります。 また、競合を回避するために、

      webpack、nodemon、gulp、mochaなどの開発コマンドラインツールをインストールします。たとえば、./node_modules/.bin/mochaを指すか、この行をbash/zshプロファイル(path!)に追加できます。

      env varsを使用します プロジェクトの初期段階でも環境変数を利用して、機密情報の漏れがないことを確認し、最初からコードを適切に構築するためだけに使用します。さらに、一部のライブラリとフレームワーク(Expressが確かに行うことは知っています)は、node_envのような情報を引き込み、動作を変更します。それを生産に設定します。 Mongo_uriとapi_keyの値も設定します。シェルファイル(start.shなど)を作成し、.gitignoreに追加できます。

      <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
      </span>
      nodemonには、env varsを配置できる構成ファイルもあります(例):

      イベントループを理解してください

      <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
      </span>
      強力で巧妙なイベントループは、入力タスクと出力タスクが完了するのを待っているすべての時間を無駄にすることで、ノードを非常に高速で素晴らしいものにするものです。したがって、ノードはI/Oバウンドシステムの最適化に優れています

      CPU集約型(例:計算、パスワードのハッシュ、または圧縮)を実行する必要がある場合は、それらのCPUタスクの新しいプロセスを生成することに加えて、Setimmediateでタスクの延期を調査することをお勧めします()またはsetimeout() - コールバックのコードは、次のイベントループサイクルで継続します。 NextTick()は、名前に反して同じサイクルで動作します。 argh!

      <span>{
      </span>  <span>"env": {
      </span>    <span>"NODE_ENV": "production",
      </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
      </span>  <span>}
      </span><span>}
      </span>
      イベントループに取り組んだバートベルダーの図です。彼は、イベントループがどのように機能するかを明確に知っています!

      機能的継承を使用

      javaScriptは、オブジェクトが他のオブジェクトから継承されるときであるプロトタイプ継承をサポートします。クラスオペレーターもES6を使用して言語に追加されました。ただし、機能的継承と比較して明白に複雑です。ほとんどのノードの達人は、後者のシンプルさを好みます。単純な機能工場パターンによって実装されており、プロトタイプ、新品またはこれを使用する必要はありません。機能的継承では、各オブジェクトが独自のメソッドのコピーを使用するため、プロトタイプを更新するとき(すべてのインスタンスも変更します)。

      Express、Mocha、Connect、Superagent、および他の数十のノードモジュールの背後にある多作な天才であるTJ Holowaychukのコードを検討してください。 Expressは機能的継承を使用します(完全なソースコード):

      <span>"scripts": {
      </span>  <span>"preinstall": "node prepare.js",
      </span>  <span>"postintall": "node clean.js",
      </span>  <span>"build": "webpack",
      </span>  <span>"postbuild": "node index.js",
      </span>  <span>"postversion": "npm publish"
      </span><span>}
      </span>

      客観的であるために、コアノードモジュールはプロトタイプ継承を非常に使用します。そのパターンに従う場合は、それがどのように機能するかを確認してください。 JavaScript継承パターンの詳細については、

      をご覧ください

      適切に名前を付けます

      これは明らかです。良い名前はドキュメントとして機能します。どちらが好きですか?

      <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
      </span>

      app.use()のみを見ると、デクスターが何をしているのかわかりません。より意味のある別の名前はどうですか:

      <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
      </span>

      同じ方法で、ファイル名は内部のコードの目的を正しく反映する必要があります。プラットフォームにバンドルされたすべてのコアモジュールを備えたノード(GitHubリンク)のLIBフォルダーをご覧ください。ファイル/モジュールの明確な命名が表示されます(たとえすべてに精通していない場合でもコアモジュール):

      <span>{
      </span>  <span>"env": {
      </span>    <span>"NODE_ENV": "production",
      </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
      </span>  <span>}
      </span><span>}
      </span>

      内部モジュールには、コードのメソッドと変数と同様に、アンダースコア(_debugger.js、_http_agent.js、_http_client.js)がマークされています。これは、これが内部インターフェイスであることを開発者に警告するのに役立ち、あなたがそれを使用している場合、あなたは自分で存在します - それがリファクタリングされるか、削除されたかどうか不平を言うことはありません。

      javascript

      を使用しないことを検討してください

      huh?正しく読んだだけですか?しかし、一体何?はい。それは正しいです。 ES6とES2016/ES7によって追加された2つの機能がある場合でも、JavaScriptにはまだ癖があります。 JavaScript以外には、あなたまたはあなたのチームがセットアップがほとんどなくても恩恵を受けることができる他のオプションがあります。専門知識レベルとアプリの性質に応じて、強力なタイピングを提供するTypeScriptまたはFlowを使用する方が良いかもしれません。スペクトルのもう一方の端には、純粋に機能的なエルムまたはClojureScriptがあります。 Coffeescriptは、もう1つの素晴らしいバトルテストされたオプションです。 Dart 2.0も見てみましょう。 必要なのはほんの数個のマクロ(マクロが必要な言語をまさに

      することを許可することを可能にする)だけでなく、まったく新しい言語ではなく、まさにそれを行うsweet.jsを検討してください。コードを生成するコードを記述する。

      JavaScript以外のルートを使用する場合は、一部の開発者が適切に構築するのに十分な言語を十分に理解できない可能性があるため、コンパイルされたコードを含めてください。たとえば、VSコードは最大のタイプスクリプトプロジェクトの1つであり、おそらくAngular 2の後に、CodeはTypeScriptを使用して、タイプを備えたノードのコアモジュールをパッチすることです。 VSCODE/SRC/VS/BASE/NODE/VS CODE REPO(LINK)のbase/node/では、Crypto、Processなどの馴染みのあるモジュール名を見ることができますが、TS拡張機能を備えています。リポジトリには他のTSファイルがあります。ただし、ネイティブJavaScriptコードを使用したvscode/buildも含まれています

      Express Middlewareを知っている

      Expressは、非常に成熟したフレームワークです。それは、他の多くのモジュールがその動作を構成できるようにすることから来ています。したがって、最も使用されているミドルウェアを知る必要があり、それをどのように使用するかを知る必要があります。それで、なぜ私のエクスプレスチートシートをつかみませんか。メインミドルウェアモジュールがそこにリストされています。たとえば、NPM I圧縮-Sは、応答をデフレーすることにより、ダウンロード速度を低下させます。 logger( 'tiny')またはlogger( 'common')は、それぞれ(dev)以上(prod)ログを提供します。 スケールアップ ノードは非ブロッキングI/OのためにASYNCに最適であり、スレッドが1つしかないため、この非同期のコーディング方法をシンプルに保ちます。これは、コードの最初の行でさえ、早い段階でスケーリングを開始する機会です。あまり多くの問題なく垂直にスケーリングできるコアクラスターモジュールがあります。ただし、さらに良い方法は、PM2やStrongloopのクラスター制御などのツールを使用することです。 たとえば、

      これはPM2:

      を始める方法です

      その後、同じサーバーの4つのインスタンスを開始できます。

      Dockerの場合、PM2バージョン2にはPM2ドッカーがあります。したがって、あなたのdockerfileは次のようになります:

      <span>"scripts": {
      </span>  <span>"preinstall": "node prepare.js",
      </span>  <span>"postintall": "node clean.js",
      </span>  <span>"build": "webpack",
      </span>  <span>"postbuild": "node index.js",
      </span>  <span>"postversion": "npm publish"
      </span><span>}
      </span>

      公式の高山Linux PM2画像はDocker Hubにあります。

      キャッシュリクエスト
      <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
      </span>

      これは、ノードインスタンスからより多くのジュースを取り出すことができるDevOpsのベストプラクティスです(PM2以下で複数のジュースを取得します。上記を参照)。道は、ノードサーバーにリクエストの作成、データの処理、ビジネスロジックの実行など、Apache httpdやnginxなどの別のWebサーバーにトラフィックを静的ファイルにオフロードするなどのアプリを実行できるようにすることです。繰り返しになりますが、おそらくセットアップにDockerを使用する必要があります:

      <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
      </span>

      Docker Composeを使用して、複数のコンテナ(Nginx、ノード、Redis、Mongodb)を互いに動作させるのが好きです。たとえば、

      要約

      この時代とオープンソースソフトウェアの時代には、開いている信頼できるテストコードから学習しない言い訳はありません。入るために内側のサークルにいる必要はありません。学習は止まることはなく、すぐに私たちが経験する失敗と成功に基づいてさまざまなベストプラクティスがあると確信しています。それらは保証されています。
      <span>{
      </span>  <span>"env": {
      </span>    <span>"NODE_ENV": "production",
      </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
      </span>  <span>}
      </span><span>}
      </span>

      最後に、私はソフトウェアが世界をどのように食べているか、JavaScriptがどのようにソフトウェアを食べているかについて書きたかったのですが、毎年標準リリース、たくさんのNPMモジュール、ツール、会議などの素晴らしいことがありますが、代わりに終了します。注意して。

      exports <span>= module.exports = createApplication;
      </span><span>// ...
      </span><span>function createApplication() {
      </span>  <span>var app = function(req<span>, res, next</span>) {
      </span>    app<span>.handle(req, res, next);
      </span>  <span>};
      </span>
        <span>mixin(app, EventEmitter.prototype, false);
      </span>  <span>mixin(app, proto, false);
      </span>
        app<span>.request = { __proto__: req, app: app };
      </span>  app<span>.response = { __proto__: res, app: app };
      </span>  app<span>.init();
      </span>  <span>return app;
      </span><span>}
      </span>
      次の新しいフレームワークや言語をどのように追いかけるかがわかります。それは光沢のあるオブジェクト症候群です。彼らは毎週新しいライブラリと毎月新しいフレームワークを学びます。彼らは、Twitter、Reddit、Hacker News、JS Weeklyを強制的にチェックします。彼らは、JavaScriptの世界で圧倒的なレベルの活動を使用して先延ばしにします。彼らは空の公共のgithubの歴史を持っています。

      新しいことを学ぶのは良いことですが、実際に物を構築するために混同しないでください。 重要なのは、あなたの給料を支払うものは、実際に物を構築することです。エンジニアリングを停止します。次のFacebookを構築していません。約束と発電機とAsync待ち声は私にとって論争です。なぜなら、誰かがディスカッションでスレッドに返信する頃には、私はすでにコールバックを書いたからです(そして、coffeescriptを使用して、プレーンES5/6/7よりも2倍速いです! )。

      最終的なベストプラクティスは、ベストプラクティスを使用することであり、最高の最高のプラクティスは基礎を習得することです。ソースコードを読んで、コードで新しいものを試して、最も重要なことは、自分で大量のコードを書くことです。さて、この時点で、重要なコードを読んで出荷するのをやめてください!

      この投稿が十分ではない場合に備えて、ここでは最高のノードプラクティスについてもっと読みます:

      https://blog.risingstack.com/nodejs-at-scale-npm-best-practices
    • https://devcenter.heroku.com/articles/node-best-practics
    • https://blog.risingStack.com/Node-js-best-practics
    • https://expressjs.com/en/advanced/best-practice-performance.html
    • https://www.codementor.io/nodejs/tutorial/nodejs-best-practics
    • Node.jsのベストプラクティスに関するよくある質問(FAQ)

    node.js開発の最も重要なベストプラクティスのいくつかは何ですか?

    node.js開発には、アプリケーションの効率とスケーラビリティを大幅に向上させることができるいくつかのベストプラクティスが含まれます。これらには、非ブロッキング操作が可能になり、パフォーマンスが向上する非同期プログラミングの使用が含まれます。また、アプリケーションのクラッシュを防ぐために、エラーを適切に処理することも重要です。その他のベストプラクティスには、リナーを使用してコードの品質を実施し、構成に環境変数を使用して、コードベースを管理しやすく理解できるようにするための小さなモジュールを作成することが含まれます。 🎜>

    node.jsアプリケーションのパフォーマンスを改善する方法はいくつかあります。最も効果的な方法の1つは、クラスターモジュールを使用することです。これにより、すべてがサーバーポートを共有する子プロセスを作成できます。これにより、アプリケーションがより多くのリクエストを同時に処理できるようにすることで、アプリケーションのパフォーマンスを大幅に改善できます。さらに、PM2などのツールを使用してnode.jsアプリケーションを管理および監視することができます。これにより、パフォーマンスの問題を特定して対処することができます。 >

    node.jsで開発する際に避けるべき一般的な間違いは、イベントループのブロック、エラーを適切に処理するのではなく、コードの品質を実施するためにリンターなどのツールを使用しないことが含まれます。イベントループをブロックすると、他の操作が実行されないようにするため、パフォーマンスの問題につながる可能性があります。エラーを適切に処理しないとアプリケーションのクラッシュにつながる可能性がありますが、リンサーを使用しないと、コードの品質と潜在的なバグが一貫性のない場合があります。 node.jsアプリケーションが安全であることを確認するにはどうすればよいですか?

    node.jsアプリケーションのセキュリティには、いくつかのベストプラクティスが含まれます。これらには、安全な通信のためにHTTPSを使用して、注入攻撃を防ぐためのユーザー入力の検証と消毒、および一般的なWebの脆弱性から保護するためのセキュリティヘッダーを使用することが含まれます。時代遅れの依存関係には既知のセキュリティの脆弱性が含まれている可能性があるため、依存関係を最新の状態に保つことも重要です。 node.js開発、そして従うべきいくつかのベストプラクティスがあります。これらには、アプリケーションの個々のコンポーネントをテストするためのユニットテストの作成、これらのコンポーネントがどのように相互作用するかをテストする統合テスト、およびアプリケーション全体をテストするエンドツーエンドテストが含まれます。また、継続的な統合(CI)システムを使用して、コードベースに変更が加えられるたびにテストを自動的に実行することも重要です。 node.jsは通常、node.jsのデフォルトパッケージマネージャーであるNPMを使用して行われます。 Package.jsonファイルに依存関係の正確なバージョンを指定して、アプリケーションが期待どおりに機能することを確認することが重要です。また、バグの修正とセキュリティパッチの恩恵を受けるために依存関係を定期的に更新する必要があります。

    node.jsでエラー処理のためのベストプラクティスは何ですか? JS開発。ベストプラクティスには、Try/Catchブロックを使用して同期エラーをキャッチし、非同期エラーを処理するためのエラーファーストコールバックを使用し、一元的にすべてのエラーを処理するための集中型エラー処理メカニズムを使用することが含まれます。また、デバッグの目的でエラーをログに記録し、適切なエラーメッセージでクライアントに応答することも重要です。いくつかのベストプラクティスが含まれます。これらには、コードの品質を強制するためにリナーを使用し、一貫したコーディングスタイルに従って、テストを作成するためのテストを早期にキャッチすることが含まれます。また、バージョンコントロール(GITなど)を使用してコードベースの変更を追跡し、潜在的な問題をキャッチするためにコードレビューを実行することも重要です。 node.jsアプリケーションは、いくつかの方法で実現できます。一般的な方法の1つは、クラスターモジュールを使用してサーバーポートを共有する子プロセスを作成し、アプリケーションがより多くの要求を同時に処理できるようにすることです。ロードバランスを使用して、複数のサーバー全体に着信ネットワークトラフィックを配布し、ニーズに応じて水平スケーリング(マシンを追加)または垂直スケーリング(単一のマシンにリソースを追加)することもできます。

    node.jsアプリケーションを展開するためのベストプラクティスは何ですか?

    node.jsアプリケーションの展開には、いくつかのベストプラクティスが含まれます。これらには、構成に環境変数を使用し、PM2のようなプロセスマネージャーを使用してアプリケーションを管理すること、およびCodeBaseに変更されたときに継続的な統合(CI)システムを使用してアプリケーションを自動的に展開することが含まれます。また、パフォーマンスの問題を特定して対処するためにアプリケーションを監視することも重要です。

以上が10 node.jsベストプラクティス:ノードの達人からの啓発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。