Node.js は、バックエンドで JavaScript を利用できるため、すぐに Web アプリやシステム ソフトウェアを構築するための標準になりました。 Express などの人気のあるフレームワークや Webpack などのツールが、その普及に貢献しています。 Deno や Bun などの競合他社は存在しますが、Node は依然として主要なサーバーサイド JavaScript プラットフォームです。
JavaScript のマルチパラダイムの性質により、さまざまなプログラミング スタイルが可能になりますが、スコープやオブジェクトの変更などのリスクも伴います。末尾呼び出しの最適化が欠如しているため、大規模な再帰反復は危険であり、Node のシングルスレッド アーキテクチャでは効率を高めるために非同期コードが必要です。課題はありますが、JavaScript の主要な概念とベスト プラクティスに従うことは、Node.js 開発者がスケーラブルで効率的なコードを作成するのに役立ちます。
1. JavaScript クロージャー
JavaScript のクロージャは、外部関数が制御を返した後でも、外部関数のスコープにアクセスできる内部関数です。クロージャは、内部関数の変数をプライベートにします。 関数型プログラミングの人気が爆発的に高まり、クロージャは Node 開発者キットの重要な部分となっています。以下は JavaScript でのクロージャーの簡単な例です:
2. JavaScript プロトタイプ
すべての JavaScript 関数には、プロパティとメソッドをアタッチするために使用されるプロトタイプ プロパティがあります。このプロパティは列挙可能ではありません。これにより、開発者はオブジェクトにメソッドやメンバー関数をアタッチできるようになります。 JavaScript は、プロトタイプ プロパティを介した継承のみをサポートします。継承されたオブジェクトの場合、プロトタイプ プロパティはオブジェクトの親を指します。関数にメソッドを付加する一般的なアプローチは、次に示すようにプロトタイプを使用することです:
最新の JavaScript は非常に洗練されたクラス サポートを備えていますが、内部では依然としてプロトタイプ システムを使用しています。これが言語の柔軟性の多くの源です。
3.ハッシュ名を使用したプライベート プロパティの定義
昔は、変数がプライベートであることを示すために、変数の前にアンダースコアを付けるという規則が使用されていました。ただし、これは単なる提案であり、プラットフォームによって強制される制限ではありません。最新の JavaScript は、クラスに ハッシュタグのプライベート メンバーとメソッド を提供します:
プライベート ハッシュ名は JavaScript の新しい、非常に歓迎される機能です。最近の Node バージョンとブラウザはこれをサポートしており、Chrome devtools を使用すると、プライベート変数に直接アクセスできるので便利です。
4.クロージャを使用したプライベート プロパティの定義
JavaScript のプロトタイプ システムにおけるプライベート プロパティの欠如を回避するために時々見かけるもう 1 つのアプローチは、クロージャーを使用することです。最新の JavaScript では、上の例に示すように、ハッシュタグ プレフィックスを使用してプライベート プロパティを定義できます。ただし、これは JavaScript プロトタイプ システムでは機能しません。また、これはコードでよく見られるトリックであり、その動作を理解することが重要です。
クロージャを使用してプライベート プロパティを定義すると、プライベート変数をシミュレートできます。プライベート プロパティにアクセスする必要があるメンバー関数は、オブジェクト自体で定義する必要があります。クロージャを使用してプライベート プロパティを作成するための構文は次のとおりです:
5. JavaScript モジュール
かつて、JavaScript にはモジュール システムがなかったため、開発者は機能するものを用意するための巧妙なトリック (モジュール パターンと呼ばれる) を考案しました。 JavaScript が進化するにつれて、CommonJS include 構文と ES6 require 構文という 1 つではなく 2 つのモジュール システムが生成されました。
Node は従来 CommonJS を使用していましたが、ブラウザーは ES6 を使用していました。ただし、Node の最近のバージョン (ここ数年) は ES6 もサポートしています。現在のトレンドは ES6 モジュールを使用することであり、いつか JavaScript 全体で使用できるモジュール構文が 1 つだけになるでしょう。 ES6 は次のようになります (デフォルトのモジュールをエクスポートしてからインポートします):
CommonJS は引き続き表示され、モジュールをインポートするためにそれを使用する必要がある場合があります。 CommonJS を使用してデフォルト モジュールをエクスポートしてインポートする様子は次のとおりです:
6.エラー処理
使用している言語や環境に関係なく、エラー処理は不可欠であり、避けられません。ノードも例外ではありません。エラーに対処する基本的な方法は 3 つあります。try/catch ブロック、新しいエラーのスロー、および on() ハンドラーです。
try/catch を含むブロックは、問題が発生したときにエラーをキャプチャするための実証済みの手段です:
この場合、console.error を使用してエラーをコンソールに記録します。エラーをスローして次のハンドラーに渡すこともできます。これにより、コード フローの実行が中断されることに注意してください。つまり、現在の実行が停止し、スタック上の次のエラー ハンドラーが引き継ぎます:
Modern JavaScript では、スタック トレースを確認するための Error.stack など、Error オブジェクトに多数の便利なプロパティが提供されています。上の例では、コンストラクター引数を使用して Error.message プロパティと Error.cause を設定しています。
エラーが見つかるもう 1 つの場所は、.then() で通常の結果を処理する非同期コード ブロックです。この場合、Promise がエラーを返す方法に応じて、on(‘error’) ハンドラーまたは onerror イベントを使用できます。場合によっては、API は通常の値とともに 2 番目の戻り値としてエラー オブジェクトを返します。 (非同期呼び出しで await を使用する場合は、try/catch でラップしてエラーを処理できます。) 非同期エラーを処理する簡単な例を次に示します。
finally{} ブロックを指定すると、エラーが無視されることに注意してください。)
7. JavaScript カリー化
カリー化は、関数をより柔軟にする方法です。カリー化された関数を使用すると、関数が予期しているすべての引数を渡して結果を取得することも、引数のサブセットのみを渡し、残りの引数を待機する関数を受け取ることもできます。これはカレーの簡単な例です:
8. JavaScript の適用、呼び出し、バインド メソッド
これらを毎日使用するわけではありませんが、call、apply、bind メソッドが何であるかを理解しておくとよいでしょう。ここでは、言語の大幅な柔軟性を扱っています。基本的に、これらのメソッドを使用すると、this キーワードが何に解決されるかを指定できます。
3 つの関数すべてで、最初の引数は常に、関数に与えるthis 値またはコンテキストです。
3 つのうち、call が最も簡単です。これは、コンテキストを指定して関数を呼び出すのと同じです。以下に例を示します:
apply は call とほぼ同じであることに注意してください。唯一の違いは、引数を個別に渡すのではなく、配列として渡すことです。配列は JavaScript での操作が容易で、関数を操作する可能性がさらに広がります。 apply と call: を使用した例を次に示します。
bind メソッドを使用すると、関数を呼び出さずに関数に引数を渡すことができます。新しい関数は、それ以降の引数の前に、制限された引数を付けて返されます。以下に例を示します:
9. JavaScript のメモ化
メモ化は、高コストの操作の結果を保存し、同じ入力セットが再度発生したときにキャッシュされた結果を返すことによって関数の実行を高速化する最適化手法です。 JavaScript オブジェクトは連想配列のように動作するため、JavaScript でのメモ化の実装が簡単になります。再帰階乗関数をメモ化階乗関数に変換する方法は次のとおりです:
10. JavaScript IIFE
即時呼び出し関数式 (IIFE) は、作成されるとすぐに実行される関数です。イベントや非同期実行とは何の関係もありません。ここに示すように IIFE を定義できます:
function(){...} は、かっこ内のコードを式に変換します。2 番目のかっこのペアは、式の結果として得られる関数を呼び出します。 IIFE は、自己呼び出し型の匿名関数として記述することもできます。最も一般的な使用法は、var によって作成された変数のスコープを制限するか、名前の衝突を避けるためにコンテキストをカプセル化することです。
await を使用して関数を呼び出す必要があるが、非同期関数ブロック内にいない場合もあります。これは、ファイルを直接実行可能にし、モジュールとしてもインポートしたい場合に発生することがあります。このような関数呼び出しは、 のように IIFE ブロックでラップできます。
11.便利な引数機能
JavaScript はメソッドのオーバーロードをサポートしていませんが (関数で任意の引数数を処理できるため)、引数を処理するための強力な機能がいくつかあります。 1 つは、関数またはメソッドをデフォルト値で定義できることです:
rest 演算子を使用して、すべての引数を配列に収集します。
arguments 変数を自動的に提供します。
結論
Node に慣れるにつれて、ほぼすべての問題を解決する方法がたくさんあることに気づくでしょう。正しいアプローチが必ずしも明らかであるとは限りません。場合によっては、特定の状況に対して複数の有効なアプローチが存在することがあります。利用可能な多くのオプションについて知っておくと役立ちます。ここで説明する 10 の JavaScript の概念は、すべての Node 開発者が知っておくと有益となる基本です。しかし、それらは氷山の一角です。 JavaScript は強力で複雑な言語です。使えば使うほど、JavaScript が実際にどれほど広大で、それを使ってどれだけのことができるかが理解できるようになります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3