node.jsは、イベント主導の非同期機能の恩恵を受けており、すぐにあります。ただし、最新のネットワークで速くなることはできません。 Node.jsを使用して次のWebアプリケーションを開発する予定がある場合は、アプリケーションをより速く速くするためにすべてを行う必要があります。この記事では10個のアイテムを紹介します。テスト後、ノードアプリケーションのスキルを大幅に向上させることができます。これ以上苦労せずに、一つずつ見てみましょう。
1。パラレル
Webアプリケーションを作成する場合、さまざまなデータを取得するには、内部APIを複数回呼び出す必要がある場合があります。たとえば、ダッシュボードページで、次の呼び出しを実行する必要があります。
ユーザー情報-GetUserProfile()。
現在のアクティビティ-GetRecentActivity()。
content -getSubscriptions()を購読します。
通知コンテンツ-GetNotification()。
この情報を取得するには、各メソッドの個別のミドルウェアを作成し、ダッシュボードルートにリンクする必要があります。しかし、問題は、これらのメソッドの実行が線形であり、次のメソッドは前の方法が終了するまで開始されないことです。実行可能な解決策は、それらを並行して呼び出すことです。
ご存知のように、node.jsは非同期性のために複数の方法を並行して呼び出すのが非常に優れています。天然資源を無駄にすることはできません。上記の方法には依存関係がないため、それらを並行して実行できます。このようにして、ミドルウェアの数を減らし、速度を大幅に上げることができます。
async.jsを使用して、並列性を処理できます。これは、JavaScriptを非同期にトレーニングするために特別に使用されるノードモジュールです。次のコードは、async.jsを使用して複数の方法を並行して呼び出す方法を示しています。
コードコピーは次のとおりです。
function runInParallel() {
async.parallel([
getUserProfile、
受信性を得る、
GetSubscriptions、
入手
]、function(err、results){
//このコールバックは、すべての機能が完了したときに実行されます
});
}
async.jsをもっと詳細に見たい場合は、githubページに移動してください。
2。非同期
Design node.jsは単一のスレッドです。これに基づいて、同期コードはアプリケーション全体をブロックします。たとえば、ほとんどのファイルシステムAPIには同期バージョンがあります。次のコードは、2つの操作を示しています。同期および非同期ファイルの読み取り:
コードコピーは次のとおりです。
//非同期
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( '/rest posts')。get(function(req、res){{
post.getLatest(function(err、posts){
if(err){
エラーを投げます。
}
res.Render( 'posts'、{posts:posts});
});
});
頻繁に投稿しない場合は、投稿リストをキャッシュしてしばらくするとクリーンアップできます。たとえば、Redisモジュールを使用してこの目標を達成できます。もちろん、サーバーにRedisをインストールする必要があります。次に、node_redisというクライアントを使用してキー/値のペアを保存できます。次の例は、投稿のキャッシュ方法を示しています。
コードコピーは次のとおりです。
var redis = require( 'redis')、
client = redis.createclient(null、null、{detect_buffers:true})、
router = express.router();
router.route( '/rest posts')。get(function(req、res){{
client.get( 'posts'、function(err、posts){
if(posts){
Retress.Render( 'posts'、{posts:json.parse(posts)});
}
post.getLatest(function(err、posts){
if(err){
エラーを投げます。
}
client.set( 'posts'、json.stringify(posts));
res.Render( 'posts'、{posts:posts});
});
});
});
参照してください。最初にRedisキャッシュをチェックして、投稿があるかどうかを確認しましょう。その場合、これらの投稿リストをキャッシュから取得します。それ以外の場合は、データベースコンテンツを取得し、結果をキャッシュします。さらに、一定の期間の後、コンテンツを更新できるようにRedisキャッシュをクリーニングできます。
4。GZIP圧縮
GZIP圧縮をオンにすると、Webアプリケーションに大きな影響があります。 GZIP圧縮ブラウザーが特定のリソースを要求すると、応答がブラウザに返される前にサーバーが圧縮されます。 GZIPを使用して静的リソースを圧縮しないと、ブラウザがそれらを取得するのに時間がかかる場合があります。
Expressアプリケーションでは、組み込みのExpress.static()ミドルウェアを使用して静的コンテンツを処理できます。さらに、静的コンテンツは圧縮ミドルウェアを使用して圧縮して処理できます。使用の例は次のとおりです。
コードコピーは次のとおりです。
var圧縮= require( '圧縮');
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、posts){
//クライアントに投稿を送信します
});
ただし、問題は、MongooseのFind()メソッドがオブジェクトのすべてのフィールドを照会し、ホームページでは多くのフィールドが必要ないことです。たとえば、Commentsisは特定の投稿への返信を保存します。記事の返信を表示する必要はないため、クエリ時に削除できます。これにより、間違いなく速度が向上します。上記のクエリは次のように最適化できます。
コードコピーは次のとおりです。
post.find()。limit(10).exclude( 'comments')。exec(function(err、posts){
//クライアントに投稿を送信します
});
8。標準V8メソッドを使用します
マップ、削減、foreachなどのコレクションの一部の操作は、必ずしもすべてのブラウザをサポートするわけではありません。フォアグラウンドライブラリを介して、ブラウザの互換性の問題をいくつか解決できます。ただし、node.jsの場合、GoogleのV8 JavaScriptエンジンがサポートする操作を正確に知る必要があります。このようにして、これらの組み込みの方法を使用して、サーバー側でコレクションを操作することができます。
9.ノードの前でnginxを使用します
Nginxは、node.jsサーバーの負荷を減らすことができる小型で軽量のWebサーバーです。ノードではなく、nginxで静的リソースを構成できます。 NginxでGZIPを使用して応答を圧縮して、すべての応答を小さくすることができます。したがって、動作している製品がある場合は、nginxを使用して走行速度を向上させる必要があると思います。
10。パッケージングJavaScript
最後に、複数のJSファイルをパッケージ化することにより、ページアプリケーションの速度を大幅に改善することもできます。ブラウザがページレンダリングの<script>要素に遭遇すると、ブロックされ、スクリプトが取得されるまで実行され続けません(非同期プロパティが設定されていない限り)。たとえば、ページに5つのJavaScriptファイルがある場合、ブラウザは5つの個別のHTTP要求を発行してそれらを取得します。これらの5つのファイルが圧縮され、1つにパッケージ化されている場合、全体的なパフォーマンスが大幅に改善されます。 CSSファイルについても同じことが言えます。 Grunt/Gulpなどのコンパイルツールを使用して、リソースファイルをパッケージ化できます。
結論は
上記の10のヒントは、Webアプリケーションの速度を確実に改善できます。しかし、改善と最適化の余地があることは知っています。パフォーマンスを改善するためのヒントがある場合は、返信でお知らせください。
読んでくれてありがとう!