Node.js 應用跑得更快 10 個技巧_node.js

來源:互聯網
上載者:User

NodeJS是一個伺服器端JavaScript解譯器,它將改變伺服器應該如何工作的概念。它的目標是協助程式員構建高度可伸縮的應用程式,編寫能夠處理數萬條同時串連到一個(只有一個)物理機的串連代碼。

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

1.並行

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

使用者資訊 -getUserProfile().

當前活動 -getRecentActivity().

訂閱內容 -getSubscriptions().

通知內容 -getNotifications().

為了拿到這些資訊,你應該會為每個方法建立獨立的中介軟體,然後將它們連結到 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 都有它們的同步版本。下面代碼示範了檔案讀取的同步和非同步兩種操作:

// Asynchronousfs.readFile('file.txt', function(err, buffer) {var content = buffer.toString();});// Synchronousvar 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,然後在用戶端渲染它們。

6.不要在Session儲存太多資料

典型的 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 這樣的編譯工具來打包你的資源檔。

通過以上十個方面給大家介紹了Node.js 應用跑得更快的技巧,希望對大家有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.