我已經介紹過Node.js一般會引起兩種反應:人們一般會立即“理解”或者因為困惑而終止。
如果你現在已經在第二組里,請看我試著解釋node:
它是一個命令行工具。你下載一個tarball,解壓并安裝源代碼。
它允許你在終端輸入'node my_app.js'運行Javascript程序。
JS運行于V8 javascript engine(它是的Google Chrome如此之快)。
Node提供一個Javascript APT來鏈接網絡和文件系統。
“但我能用ruby, python, php, java, ... 做任何事!”
我聽到了。你是對的!對不起,Node不是來幫你做工作的奇怪的獨角獸。它只是一個工具,它可能不會完全地代替你常規的工具,至少目前不會。
"直截了當地說!"
好吧,我會的。基本上,當你需要同時做很多事的時候,Node很好。你曾經寫過一段兒代碼并說“我希望這能夠并行的運行”?好,Node里一切都是并行的運行,除了你的代碼。
"嗯?"
就是這樣,一切都是并行運行的,除了你的代碼。為了理解這點,想象你的代碼是國王,node是他的仆人軍隊。
日子是從一個仆人喚醒國王問他所需開始的。國王給這位仆人一張任務列表然后再小睡一會。這位仆人開始向他的同事們分發任務并讓他們工作。
每當一位仆人完成一份工作,當他完成一個任務,他就排列好給國王匯報。國王每次讓一名仆人進來聽他匯報。有時,當他走出去的時候國王會給他更多的的任務。
生活很美好,對于國王的仆人,他們并行地攜帶他的任務,但是同事只匯報一個結果, 這樣國王可以專注。
"那太棒了,但是你能不做愚蠢的比喻而認真的對我講嗎?
當然。一個簡單的Node程序這這樣的:
你的代碼給Node兩個任務讀寫一個文件,然后休眠。當Node完成一個任務,回調函數被觸發。但是這里只能同時運行一個回調函數。直到回調函數執行完畢之前,所有其他回調函數需要排隊等待。另外,執行任何一個回調函數是無序的。
“所以我不需要擔心代碼同時解除相同的數據?”
你明白了!這就是全部Javascript單線程/事件輪詢的精華!
"很好,但是我為什么要用他呢?"
一個原因是高效。在一個web應用中,主要的響應花費在執行查詢數據庫。使用Node,會減少響應的時間當執行最慢的查詢。
另外一個原因是JavaScript。你能在瀏覽器和服務器之間分享代碼。JavaScript也正在成為全球性的編程語言。無論你過去是否做過python, ruby, java, php...... 在過程中你可能會用到javascript,對吧?
最后一個原因就是運行速度。V8引擎在這個星球上不斷擴張他的境界。我現在 無法想到哪個語言會在速度方面對JavaScript造成威脅。另外,In addition to that, node的I/O設備非常輕量,會讓你盡可能地完全地利用你全部系統的空間。
"所以你勸說我從現在開始用node來做所有我的應用?"
可以這么說但又不是。一旦你開始揮動node的錘子,一切都看起來像個釘子。但是如果你正在做一個很緊迫的項目,你也許需要以下幾個依據來做決定:
低響應時間,高并行更重要?Node擅長于此。
項目多大? 小項目還適合。大項目應該仔細評估(多種類庫,資源用來修改問題,或者逆流而上,等等)。
"Node可以運行在windows嗎?"
不行。如果你在windows,你需要用Linux運行一個虛擬機(我推薦VirtualBox)。Windows支持node在計劃之中,除非你想幫助他,否則你得屏住呼吸等幾個月。
"在node中我能鏈接DOM嗎?"
問的非常好!答案是不行,DOM是瀏覽器的東西,node JS的運行引擎應該從那混亂中完全地分開。然而,有些人正在做這樣的事:the DOM as a node module, 這會讓許多有趣的事變成可能,比如在可以互動進行單元測試。
"事件驅動編程很難嗎?"
那就不一定了。如果你已經學會了在瀏覽器里玩AJAX的請求和響應,那么適應node應該不是問題。無論如何,測試驅動開發能幫你想到可維護的設計。
"誰在用呢?"
這里是一個小的不完全的列表node wiki(找到 "Companies using Node").Yahoo正在給YUI做node實驗Plurk正在應用于很多的comet。并且, Paul Bakaus 正在建立mind-blowing game engine一些node后端的東西。
??????? ———— 2015.10.15?摘自Debuggable,原文鏈接