亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

優化Node.js Web應用運行速度的10個技巧

2019-11-20 14:12:18
字體:
來源:轉載
供稿:網友

Node.js 受益于它的事件驅動和異步的特征,已經很快了。但是,在現代網絡中只是快是不行的。如果你打算用 Node.js 開發你的下一個Web 應用的話,那么你就應該無所不用其極,讓你的應用更快,異常的快。本文將介紹 10 條,經過檢驗得知可大大提高 Node 應用的技巧。廢話不多說,讓我們逐條來看看。

1. 并行

創建 Web 應用的時候,你可能要多次調用內部 API 來獲取各種數據。比如說,假設在 Dashboard 頁面上,你要執行下面這幾個調用:

用戶信息 -getUserProfile().

當前活動 -getRecentActivity().

訂閱內容 -getSubscriptions().

通知內容 -getNotifications().

為了拿到這些信息,你應該會為每個方法創建獨立的中間件,然后將它們鏈接到 Dashboard 路由上。不過問題是,這些方法的執行是線性的,上一個沒結束之前下一個不會開始??尚薪鉀Q案是并行調用它們。

如你所知由于異步性,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 都有它們的同步版本。下面代碼演示了文件讀取的同步和異步兩種操作:

復制代碼 代碼如下:

// 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 壓縮瀏覽器請求某些資源的時候,服務器會在響應返回給瀏覽器之前進行壓縮。如果你不用 gzip 壓縮你的靜態資源,瀏覽器拿到它們可能會花費更長時間。

在 Express 應用中,我們可以用內建 express.static() 中間件來處理靜態內容。此外,還可以用 compression 中間件壓縮和處理靜態內容。下面是使用例:

復制代碼 代碼如下:

var compression = require('compression');

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

5. 如果可以,在用客戶端渲染

現在有超多功能強勁的客戶端 MVC/MVVM 框架,比如說AngularJS,Ember,Meteor, 等等,構建一個單頁面應用變得非常簡單。基本上,你只要公開一個 API,返回JSON響應給客戶端就可以了,而不需要在服務端渲染頁面。在客戶端,你可以用框架來組織 JSON 然后把它們顯示在 UI 上。服務端只發送 JSON 響應可以節省帶寬,改善性能,因為你不需要在每個響應里面都返回布局標記了,對吧,你只需要返回純 JSON,然后在客戶端渲染它們。

看下我的 這個教程 ,它是關于怎樣用 Express 4 公開一個 RESTful APIs的。我還寫了 另一篇教程 ,演示了怎樣把這些 APIs 和 AngularJS 結合起來。

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. 用標準的 V8 方法

集合上的一些操作,比如 map,reduce,和 forEach 不一定支持所有瀏覽器。我們可以通過前臺的庫解決部分瀏覽器兼容性問題。但對于 Node.js,你要確切知道 Google 的V8 JavaScript 引擎支持哪些操作。這樣,你就可以在服務端直接用這些內建方法來操作集合了。

9. 在 Node 前面用 Nginx

Nginx是個微小型輕量 Web 服務器,用它可以降低你的Node.js服務器的負載。你可以把靜態資源配置到 nginx 上,而不是在 Node 上。你可以在 nginx 上用 gzip 壓縮響應,讓所有的響應都變得更小。所以,如果你有個正在營運的產品,我覺得你應該會想用 nginx 來改善運行速度的。

10. 打包 JavaScript

最后,你還可以大大提高頁面應用速度,通過把多個 JS 文件打包。當瀏覽器在頁面渲染中碰到 <script> 元素的時候會被堵塞,直到拿到這個腳本才繼續運行(除非設置了異步屬性)。比如,如果你的頁面有五個 JavaScript 文件,瀏覽器會發出五個獨立的 HTTP 請求來獲取他們。如果把這五個文件壓縮打包成一個,整體性能將可以大幅提升。CSS 文件也是一樣。你可以用諸如 Grunt/Gulp 這樣的編譯工具來打包你的資源文件。

結論

上面 10 條技巧肯定可以提高你的 Web 應用的速度的。不過,我知道還有改善和優化的空間。如果你有任何改善性能的技巧的話,在回復里告訴我。

謝謝閱讀!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品自产拍| 日韩视频免费在线观看| 久久久久久久久爱| 色偷偷88888欧美精品久久久| xxx欧美精品| 精品久久中文字幕| 亚洲精品一区二区网址| 国内成人精品一区| 欧美日韩在线一区| 日韩中文综合网| 亚洲深夜福利网站| 亚洲精品成人久久电影| 欧美日本黄视频| 欧美日韩国产综合新一区| 亚洲成色777777女色窝| 日韩欧美在线看| 中文字幕精品www乱入免费视频| 伊人男人综合视频网| 欧美日韩在线看| 欧美精品videossex性护士| 欧美日韩在线观看视频小说| 日本精品久久中文字幕佐佐木| 国产精品国模在线| 免费不卡欧美自拍视频| 日韩有码片在线观看| 97香蕉超级碰碰久久免费软件| 91亚洲国产成人精品性色| 亚洲美女自拍视频| 97超级碰碰碰久久久| 在线精品视频视频中文字幕| 91在线观看免费高清完整版在线观看| 亚洲一区二区三区sesese| 深夜福利亚洲导航| 久久精品美女视频网站| 亚洲视频专区在线| 午夜精品一区二区三区av| 久久综合国产精品台湾中文娱乐网| 欧美亚洲国产精品| 国产精品欧美日韩一区二区| 国产日韩欧美另类| 中文字幕亚洲一区| 91日本在线视频| xxxxx91麻豆| 尤物九九久久国产精品的特点| 92福利视频午夜1000合集在线观看| 日韩久久精品成人| 亚洲欧洲激情在线| 欧美麻豆久久久久久中文| 欧美成人高清视频| 国产手机视频精品| 国产精品白丝jk喷水视频一区| 亚洲新声在线观看| 2018日韩中文字幕| 欧美色道久久88综合亚洲精品| 97精品欧美一区二区三区| 亚洲成人网av| 国外成人在线播放| 欧美日韩亚洲激情| 国产亚洲人成a一在线v站| 欧美激情亚洲国产| 日日骚av一区| 中文字幕欧美国内| 亚洲aa在线观看| 欧美国产日韩二区| 国产成人精品免高潮费视频| 成人免费看吃奶视频网站| 欧美激情中文字幕在线| 丝袜亚洲另类欧美重口| 久久久99久久精品女同性| 日韩亚洲欧美成人| 欧美日韩视频免费播放| 精品亚洲一区二区三区在线播放| 久久久国产精品视频| 97福利一区二区| 亚洲va久久久噜噜噜久久天堂| 欧美在线激情网| 国产欧美日韩精品丝袜高跟鞋| 成人黄色午夜影院| 成人久久18免费网站图片| 91深夜福利视频| 欧美福利视频网站| 这里只有精品视频| 欧美日韩ab片| 日韩精品视频中文在线观看| 欧美精品一区二区三区国产精品| 欧美激情一区二区三区成人| 国产丝袜精品视频| 91禁国产网站| 午夜精品在线视频| 国产精品手机播放| 日韩av在线高清| 黄网站色欧美视频| 亚州欧美日韩中文视频| 精品久久久久久亚洲国产300| 亚洲男人天堂手机在线| 精品国产乱码久久久久久天美| 久久久久久久久久久国产| 亚洲一区二区三区视频播放| 国产精品pans私拍| 亚洲高清一区二| 啊v视频在线一区二区三区| 精品国产网站地址| 亚洲国产成人久久| 久青草国产97香蕉在线视频| 欧美自拍大量在线观看| 91在线观看免费高清| 热re91久久精品国99热蜜臀| 日韩国产精品视频| 亚洲www永久成人夜色| 国产91在线播放精品91| 亚洲一级黄色片| 亚洲女同性videos| 久久精品99久久久久久久久| 日韩国产高清视频在线| 欧美床上激情在线观看| 亚洲精品福利在线| 另类美女黄大片| 91影院在线免费观看视频| 久久久99久久精品女同性| 欧洲美女7788成人免费视频| 亚洲精品久久久久久久久久久| 国产在线观看一区二区三区| 亚洲精品福利资源站| 亚洲成人网在线观看| 国产精品视频播放| 国产激情视频一区| 这里只有精品视频在线| 日韩中文综合网| 欧美成人午夜激情视频| 青青久久av北条麻妃黑人| 97在线看福利| 中文字幕亚洲欧美| 亚洲在线免费视频| 高清一区二区三区日本久| 韩国美女主播一区| 国产97在线|日韩| 亚洲性生活视频| 人人做人人澡人人爽欧美| 国产日韩av在线播放| 91精品国产亚洲| 国产精品久久一| 欧美激情性做爰免费视频| 欧美精品18videos性欧美| 国内揄拍国内精品| 日韩精品免费综合视频在线播放| 久久精品视频导航| 中文字幕精品影院| 色系列之999| 亚洲在线免费观看| 国产精品久久在线观看| 在线成人激情黄色| 在线视频日本亚洲性| 影音先锋欧美精品| 国产精品高清网站| 亚洲福利视频网站| 亚洲国产第一页| 亚洲视频自拍偷拍| 亚洲国产成人爱av在线播放| 北条麻妃99精品青青久久| 欧美日韩国产成人在线| 在线国产精品播放| 久久久精品2019中文字幕神马| 美女精品视频一区| 亚洲欧美日韩中文视频|