科普文一則,說說我對Node.js的一些認識,以及我作為前端工程師為什麼會向後端工程師推薦Node.js。
「Node.js 是伺服器端的 JavaScript 運行環境,它具有無阻塞(non-blocking)和事件驅動(event-driven)等的特色,Node.js 採用V8引擎,同樣,Node.js實現了類似 Apache 和 nginx 的web服務,讓你可以通過它來搭建基於 JavaScript的Web App。」
我想不僅僅是Node.js,當我們要引入任何一種新技術前都必須要搞清楚幾個問題:
1. 我們遇到了什麼問題?
2. 這項新技術解決什麼問題,是否契合我們遇到的問題?
3. 我們遇到問題的多種解決方案中,當前這項新技術的優勢體現在哪兒?
4. 使用新技術,帶來哪些新問題,嚴重麼,我們能否解決掉?
我們的問題:Server端阻塞
Node.js被設計用來解決服務端阻塞問題.下面通過一段簡單的代碼解釋何為阻塞:
1 2 3 4 | //根據ID,在資料庫中Persons表中查出Name var name = db.query(select name from persons where id=1); //進程等待數據查詢完畢,然後使用查詢結果。 output(name) |
1 2 3 4 5 6 | //定義如何後續數據處理函數 function onDataLoad(name){ output(name); } //發起數據請求,同時指定數據返回後的回調函數 db.query(select name from persons where id=1,onDataLoad); |
1 2 3 | db.query(select name from persons where id=1,function(name){ output(name); }); |
1 2 3 4 5 6 7 | //傳統同步寫法:將查詢和結果列印抽象為一個方法 function main(){ var id = 1; var name = db.query(select name from persons where id= + id); output(person id: + id + , name: + name); } main(); |
1 2 3 4 5 6 7 8 | //異步寫法: function main(){ var id = 1; db.query(select name from persons where id= + id,function(name){ output(person id: + id + , name: + name);//n秒後數據返回後執行回調 }); } main(); |
1 2 3 4 5 6 7 8 9 | function main(){ var id = 1; var currentState = new Object(); currentState.person_id = id; db.query(select name from persons where id= + id, function(name,state){ output(person id: + state.person_id + , name: + name); },currentState);//注意currentState是db.query的第三個參數 } main(); |
1 2 3 4 5 6 7 8 9 10 | function main(){ var id = 1; var currentState = new Object(); currentState.person_id = id; function onDataLoad(name){ output(person id: + onDataLoad.state.person_id + , name: + name); } onDataLoad.state = currentState ;//為函數指定state屬性,用於保持狀態 db.query(select name from persons where id= + id, onDataLoad); } |