NodeJsをより速くする10のテクニック

5542 ワード

Node.jsはそのイベントの駆動と非同期の特徴から恩恵を受けて、すでにとても速くなりました.しかし、現代のネットでは、速いだけではだめです.Node.jsを使ってあなたの次のWebアプリケーションを開発するつもりなら、あなたはその極を使わないべきで、あなたの応用をもっと速くして、非常に速いです.本論文では10条を紹介し、テストを経てNodeアプリケーションのスキルを大幅に向上させることがわかった.余計なことを言わないで、逐条見てみましょう.
1.並列
Webアプリケーションを作成するときは、内部APIを何度も呼び出して、各種データを取得することができます.例えば、Dashboardページで次のような呼び出しを実行します.
  • ユーザ情報-getsUserProfile().
  • 現在のアクティビティ-get Recent Activity().
  • 購読内容-get Subscriptions().
  • 通知内容-get Notifications().
  • これらの情報を得るためには、各方法のために独立したミドルウェアを作成し、それをDashboardルートにリンクするはずです.問題は,これらの方法の実行は線形で,前の方が終わる前に次の方が開始されません.実行可能な解決策は並行してそれらを呼び出すことです.
    ご存知のように、非同期性のために、Node.jsは並行して複数の方法を呼び出すのがとても上手です.私たちは物を粗末に使ってはいけません.上記の方法は依存性がないので、それらを並列に実行できます.これで中間部品の数量を削減して、大幅にスピードを上げることができます.
    私たちはASync.jsを使ってパラレル処理ができます.JavaScriptの非同期を専門に教えるNodeモジュールです.次のコードはasync.jsで複数の方法を並列に呼び出す方法を示しています.
    function runInParallel() {
      async.parallel([
        getUserProfile,
        getRecentActivity,
        getSubscriptions,
        getNotifications
      ], function(err, results) {
        //This callback runs when all the functions complete
      });
    }
    async.jsをもっと深く知りたいなら、GitHubページに移動してください.
    2.非同期
    デザインによってNode.jsはシングルスレッドです.この点に基づいて、同期コードはアプリケーション全体に詰まります.例えば、複数のファイルシステムAPIは、それらの同期バージョンを有する.ファイル読み込みの同期と非同期の2つの動作を以下のコードで示します.
    // Asynchronous
    fs.readFile('file.txt', function(err, buffer) {
      var content = buffer.toString();
    });
    
    // Synchronous
    var content = fs.readFileSync('file.txt').toString();
    しかし、長時間のブロック操作を行うと、メインスレッドはこれらの操作が完了するまでブロックされます.これはあなたの応用の性能を大きく低下させます.ですから、あなたのコードの中では非同期のAPIが使われていることを確認したほうがいいです.少なくとも性能ノードで非同期になるべきです.また、第三者のモジュールを選ぶ時も注意してください.なぜなら、同期操作をあなたのコードから削除した後、外部ライブラリの同期呼び出しが元の機能を放棄させ、アプリケーションの性能を低下させるためです.
    3.キャッシュ
    あまり変わらないデータを使うなら、それをキャッシュして性能を向上させるべきです.例えば、下のコードは最新のスレッドを取得して表示する例です.
    var router = express.Router();
    
    router.route('/latestPosts').get(function(req, res) {
      Post.getLatest(function(err, posts) {
        if (err) {
          throw 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('/latestPosts').get(function(req,res){
      client.get('posts', function (err, posts) {
        if (posts) {
          return res.render('posts', { posts: JSON.parse(posts) });
        }
    
        Post.getLatest(function(err, posts) {
          if (err) {
            throw err;
          }
    
          client.set('posts', JSON.stringify(posts));    
          res.render('posts', { posts: posts });
        });
      });
    });
    見ましたよね.まずRedisキャッシュを確認して、招待状がありますか?もしあるならば、私達はキャッシュからこれらの招待状のリストを持ちます.データベースの内容を検索して結果をキャッシュします.また、一定時間後には、Redisキャッシュを整理して、内容を更新することができます.
    4.gzip圧縮
    gzip圧縮をオンにすると、あなたのWebアプリケーションに大きな影響を与えます.gzip圧縮ブラウザがあるリソースを要求すると、サーバは応答をブラウザに返す前に圧縮します.もしあなたが静的リソースを圧縮しないなら、ブラウザでそれらを取得するのに時間がかかります.
    Expressアプリケーションでは、インラインexpress.static()ミドルウェアで静的な内容を処理できます.さらに,静的な内容をcomppression中間部品で圧縮して処理することもできる.以下は使用例です.
    var compression = require('compression');
    
    app.use(compression()); //use compression 
    app.use(express.static(path.join(__dirname, 'public')));
    5.できれば、クライアントでレンダリングしています.
    今は超多機能の強いクライアントMVC/MVMフレームがあります.アングラーJS、Ember、Meteorなど、単一ページアプリケーションを構築するのはとても簡単です.基本的に、APIを公開して、JSONに戻ってクライアントに応答すればいいです.サービス端末でページをレンダリングする必要はありません.クライアントでは、フレームワークでJSONを組織し、UIに表示することができます.サービス側はJSON応答だけを送信して帯域幅を節約して性能を向上させることができます.各応答の中でレイアウトマークに戻る必要がないからですよね.純粋なJSONに戻って、クライアントでそれらをレンダリングするだけです.
    私のこの教程を見てください.これはどのようにExpress 4でRESTful APIを公開するかについてです.私はまた別の教程を書いて、これらのAPIとAnglarJSをどう結合するかを実証しました.
    6.Sessionsに多くのデータを記憶しないでください.
    典型的なExpressページアプリケーションでは、Sessionデータはデフォルトでメモリに保存されます.あなたがSessionに多くのデータを保存すると、サーバーのオーバーヘッドが著しく増大します.ですから、他の保存方法に切り替えてSessionデータを保存するか、あるいはSessionに格納されているデータ量をできるだけ減らすようにします.
    例えば、ユーザーがあなたのアプリケーションにログインすると、ユーザー全体のデータオブジェクトではなく、Sessionに彼らのIDだけを保存することができます.また、IDから対象の照会ができるということは、MongoDBやRedisでsessionデータを記憶することが好きです.
    7.クエリの最適化
    ブログがあったら、ホームページに最新の書き込みを表示してください.Mongooseを通じてデータを取るかもしれません.
    Post.find().limit(10).exec(function(err, posts) {
      //send posts to client
    });
    ただし、問題はMongooseのfind()方法で、対象のフィールドはすべて検索されますが、多くのフィールドはホームページでは要求されません.例えば、commentsisは特定の書き込みの返信を保存しています.私たちは記事の返信を表示する必要がないので、調べている間に削除してもいいです.これはきっとスピードを上げます.このように上のクエリを最適化できます.
    Post.find().limit(10).exclude('comments').exec(function(err, posts) {
      //send posts to client
    });
    8.標準的なV 8の方法で
    集合上のいくつかの操作、例えばmap、reduce、およびforEachはすべてのブラウザをサポートするとは限りません.私たちはフロントの倉庫を通して一部のブラウザの互換性の問題を解決できます.しかし、Node.jsについては、GoogleのV 8 JavaScriptエンジンがどのような操作をサポートしているかを正確に知る必要があります.そうすると、サービスセンターで直接にこれらの内建ての方法で集合を操作できます.
    9.Nodeの前でNgixを使う
    Nginnxは、微小な軽量のWebサーバーです.Node.jsサーバーの負荷を低減することができます.Nodeではなく、静的なリソースをinx上に配置することができます.gzipで応答を圧縮することで、すべての応答をより小さくすることができます.だから、もしあなたが運営している製品があれば、インゲンで運行速度を改善したいと思います.
    10.包装JavaScript
    最後に、複数のJSファイルを梱包することで、ページのアプリケーション速度を大幅に向上させることができます.ブラウザがページレンダリング中に「スクリプト」の要素に出会うと、このスクリプトを入手してから実行を継続します.例えば、あなたのページにJavaScriptファイルが5つあると、ブラウザから独立したHTTP要求が5つ出てきます.この五つのファイルを一つに圧縮したら、全体の性能が大幅に向上します.CSSファイルも同じです.Gunt/Gulpのようなコンパイルツールであなたのリソースファイルを包装してもいいです.
    結論
    上の10の技術はきっとあなたのWebアプリケーションのスピードを高めることができます.しかし、改善と最適化の余地があると知っています.性能を改善する技術があれば、返事の中で教えてください.
    読んでくれてありがとうございます