Node.js Web application_node.js の速度を最適化するための 10 のヒント

WBOY
リリース: 2016-05-16 16:37:42
オリジナル
1004 人が閲覧しました

Node.js は、イベント駆動型で非同期の性質があるため、すでに高速です。ただし、最新のネットワークでは、速いだけでは十分ではありません。 Node.js を使用して次の Web アプリケーションを開発する場合は、アプリケーションを驚異的に高速化するために必要なことはすべて行う必要があります。この記事では、Node アプリケーションを大幅に改善できる、テスト済みの 10 のヒントを紹介します。早速、一つずつ見ていきましょう。

1. パラレル

Web アプリケーションを作成する場合、さまざまなデータを取得するために内部 API を複数回呼び出す必要がある場合があります。たとえば、ダッシュボード ページで次の呼び出しを実行するとします:

ユーザー情報 -getUserProfile().

現在のアクティビティ -getRecentActivity().

サブスクリプションコンテンツ -getSubscriptions().

通知コンテンツ -getNotifications().

この情報を取得するには、メソッドごとに個別のミドルウェアを作成し、それらをダッシュ​​ボード ルートにリンクします。しかし、問題は、これらのメソッドの実行が直線的であり、前のメソッドが終了するまで次のメソッドが開始されないことです。考えられる解決策は、それらを並行して呼び出すことです。

ご存知のとおり、Node.js は非同期性により複数のメソッドを並行して呼び出すのが非常に得意です。私たちは資源を無駄にすることはできません。上で説明したこれらのメソッドには依存関係がないため、並行して実行できます。このようにして、ミドルウェアの量を減らし、速度を大幅に向上させることができます。

async.js を使用して並列処理を処理できます。これは、JavaScript を非同期的に調整するために特別に使用される Node モジュールです。次のコードは、async.js を使用して複数のメソッドを並行して呼び出す方法を示しています。

コードをコピー コードは次のとおりです:
関数 runInParallel() {
async.Parallel([
GetUserProfile、
GetRecentActivity、
GetSubscriptions、
通知を取得
]、関数(エラー、結果) {
//このコールバックは、すべての関数が完了すると実行されます
});
}
async.js について詳しく知りたい場合は、
GitHub ページにアクセスしてください。

2. 非同期

Node.js は設計上シングルスレッドです。これに基づいて、同期コードはアプリケーション全体を詰まらせる可能性があります。たとえば、ほとんどのファイル システム API には同期バージョンがあります。次のコードは、ファイル読み取りの同期操作と非同期操作の両方を示しています。


// 非同期
fs.readFile('file.txt', function(err,buffer) {
var content =buffer.toString();
});

// 同期 var content = fs.readFileSync('file.txt').toString();



ただし、長期的なブロック操作を実行すると、これらの操作が完了するまでメインスレッドはブロックされます。これにより、アプリケーションのパフォーマンスが大幅に低下します。したがって、コードが非同期バージョンの API を使用していることを確認することが最善であり、少なくともパフォーマンス ノードでは非同期である必要があります。また、サードパーティ製モジュールを選択するときは注意が必要です。コードから同期操作を排除しようとすると、外部ライブラリからの同期呼び出しによってすべての作業が無効になり、アプリケーションのパフォーマンスが低下するためです。


3. キャッシング

頻繁に変更されないデータを使用する場合は、パフォーマンスを向上させるためにデータをキャッシュする必要があります。たとえば、次のコードは、最新の投稿を取得して表示する例です。


コードをコピー コードは次のとおりです: var router = Express.Router();
router.route('/latestPosts').get(function(req, res) {
Post.getlatest(function(err, 投稿) { (エラー) {

の場合 エラーを投げます;
}

res.render('投稿', { 投稿: 投稿 });
});

});



頻繁に投稿しない場合は、投稿のリストをキャッシュし、一定期間後に削除できます。たとえば、Redis モジュールを使用してこの目的を達成できます。もちろん、サーバーに Redis がインストールされている必要があります。その後、node_redis というクライアントを使用してキーと値のペアを保存できます。次の例は、投稿をキャッシュする方法を示しています:



コードをコピー コードは次のとおりです:

var redis = require('redis'),
Client = redis.createClient(null, null, { detect_buffers: true }),
ルーター = Express.Router();

router.route('/latestPosts').get(function(req,res){
client.get('posts', function (err, 投稿) {
If (投稿) {
Return res.render('posts', { post: JSON.parse(posts) });
}

Post.getlatest(function(err, 投稿) {
(エラー) {
の場合 エラーを投げます;
}

client.set('posts', JSON.stringify(posts)); res.render('投稿', { 投稿: 投稿 });
});
});
});

まず、Redis キャッシュをチェックして投稿があるかどうかを確認します。存在する場合は、キャッシュから投稿のリストを取得します。それ以外の場合は、データベースの内容を取得して結果をキャッシュします。さらに、一定の時間が経過すると、コンテンツを更新できるように Redis キャッシュをクリアできます。

4. gzip 圧縮

gzip 圧縮を有効にすると、Web アプリケーションに大きな影響を与える可能性があります。 gzip 圧縮されたブラウザが何らかのリソースを要求すると、サーバーは応答を圧縮してからブラウザに返します。静的リソースを gzip 圧縮しない場合、ブラウザーが静的リソースを取得するのに時間がかかる可能性があります。

Express アプリケーションでは、組み込みの Express.static() ミドルウェアを使用して静的コンテンツを処理できます。さらに、静的コンテンツは、圧縮ミドルウェアを使用して圧縮および処理できます。以下は使用例です:


コードをコピー コードは次のとおりです:
var 圧縮 = require('compression');
app.use(compression()) //圧縮を使用します

app.use(express.static(path.join(__dirname, 'public')));

5. 可能であれば、クライアント側レンダリングを使用します

現在、AngularJS、Ember、Meteor など、多用途で強力なクライアント側 MVC/MVVM フレームワークが数多く存在し、シングルページ アプリケーションを非常に簡単に構築できるようになりました。基本的には、サーバー側でページをレンダリングせずに、API を公開して JSON 応答をクライアントに返すだけです。クライアント側では、フレームを使用して JSON を整理し、UI に表示できます。サーバー上で JSON 応答のみを送信すると、すべての応答でレイアウト マークアップを返す必要がないため、帯域幅が節約され、パフォーマンスが向上します。純粋な JSON を返してクライアントでレンダリングするだけで済みます。

Express 4 で RESTful API を公開する方法については、私のこのチュートリアルをご覧ください。これらの API を AngularJS と組み合わせる方法を示す別のチュートリアルも作成しました。

6. セッションに大量のデータを保存しないでください

一般的な Express ページ アプリケーションでは、セッション データはデフォルトでメモリに保存されます。セッションに保存するデータが多すぎると、サーバーのオーバーヘッドが大幅に増加します。そのため、別のストレージ方法に切り替えてセッション データを保存するか、セッションに保存されるデータの量を減らしてみます。

たとえば、ユーザーがアプリケーションにログインするときに、ユーザー データ オブジェクト全体ではなく、ユーザーの ID のみをセッションに保存できます。また、ID によってオブジェクトを取得できるクエリの場合は、MongoDB または Redis を使用してセッション データを保存するとよいでしょう。

7. クエリを最適化します

ブログをお持ちで、ホームページに最新の投稿を表示したいとします。次のように Mongoose を通じてデータを取得できます:


コードをコピー コードは次のとおりです:
Post.find().limit(10).exec(function(err, 投稿) {
//投稿をクライアントに送信します
});
しかし、問題は、Mongoose の find() メソッドがオブジェクトのすべてのフィールドをクエリするため、ホームページでは多くのフィールドが必要ないことです。たとえば、commentis には特定の投稿への返信が保存されます。記事への返信を表示する必要がないため、クエリ時に除外できます。これで確実に速度が上がります。上記のクエリは次のように最適化できます:

コードをコピー コードは次のとおりです:
Post.find().limit(10).exclude('comments').exec(function(err, 投稿) {
//投稿をクライアントに送信します
});

8. 標準の V8 メソッドを使用します

map、reduce、forEach などのコレクションに対する一部の操作は、ブラウザによってはサポートされていない場合があります。ブラウザーの互換性の問題の一部は、フロントエンド ライブラリを通じて解決できます。ただし、Node.js の場合は、Google の V8 JavaScript エンジンがどのような操作をサポートしているかを正確に知る必要があります。このようにして、これらの組み込みメソッドを直接使用して、サーバー側のコレクションを操作できます。

9. ノードの前で Nginx を使用します

Nginx は、Node.js サーバーの負荷を軽減できる小型で軽量の Web サーバーです。 Node の代わりに nginx で静的リソースを構成できます。 gzip を使用して nginx 上の応答を圧縮すると、すべての応答が小さくなります。そのため、動作している製品がある場合は、nginxを使用して動作速度を向上させたいと思うでしょう。

10. JavaScript のパッケージ化

最後に、複数の JS ファイルをパッケージ化することで、ページのアプリケーション速度を大幅に向上させることもできます。ブラウザーがページのレンダリング中に

人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!