總括 :這篇文章十分生動形象的的介紹了Node,知足了讀者想去了解Node的需求。做者是Node的第一批貢獻者之一,德國前端大神。譯者以爲做者的比喻很適合初學者理解Node,特此翻譯。javascript
譯者 :原文網址裏有隻小螞蟻的效果頗有意思(屢次鼠標懸浮會有驚喜),哈哈哈,能夠去看一下哦。前端
原文地址:[Understanding node.js]java
原文做者:Felix Geisendörfernode
Node小應用:Node-samplegit
譯者:Damonaregithub
本文屬於譯文web
當我向別人介紹Node.js 的時候通常會有兩種反應,要麼是立馬就弄明白它是個什麼玩意兒,要麼是被它搞的很糊塗。數據庫
若是你如今還處於後者,下面就是我對於node
的解釋:npm
它是一個命令行工具,你能夠下載一個tarball文件,編譯而後安裝源文件;編程
它可讓你在你的終端輸入node my_app.js
來運行Javascript程序;
Node的JS代碼是由 V8 javascript 引擎(就是那個使得Chrome如此之快的東西)所執行的;
Node提供了諸如訪問網絡或是操做文件系統的Javascript API
我聽到你說的話了,你是對的。Node
不是狡猾的獨角獸,這點很抱歉,它不會幫你作你該作的事。它僅僅是一個工具,並且他也不會替代你如今所經常使用的一些工具,至少如今不會。
好的,我會的,當你須要同時作好幾件事的時候Node
會表現的十分優秀。你有寫了一段代碼而後對他說"我想你能夠並行運行!"的體驗嗎?哈哈哈,在Node中除了你的代碼全部的東西都是並行運行的。
是的,沒錯,除了你的代碼以外全部的代碼都是並行運行的。爲了理解這一點,你能夠把你本身的代碼想象成一個國王,而Node
就是他的僕人軍隊。
新的一天是這樣開始的:某個僕人叫醒了國王,而後問他是否須要什麼。國王給了這個僕人一個任務清單而後就回去繼續睡覺了。而後這個僕人就把任務清單上的任務分發下去,僕人們開始工做了。
當一個僕人完成了他的任務的時候,他就跑到國王寢宮外面排隊等候報告。國王一次只能聽取一個僕人報告任務,有的時候國王會在僕人報告結束的時候給他更多的任務。(看你代碼咋寫咯)
生活是美好的,由於國王的諸多僕人同時執行多個任務,但報告結果的時候是一個一個來的,因此國王可以很專一。
好的,一個node
程序或許是下面這樣的:
var fs = require('fs') , sys = require('sys'); //譯者注:sys is deprecated. Use util instead.這裏咱們直接用console.log便可 fs.readFile('treasure-chamber-report.txt', function(report) { //sys.puts("oh, look at all my money: "+report); console.log("oh, look at all my money: "+report) }); fs.writeFile('letter-to-princess.txt', '...', function() { //sys.puts("can't wait to hear back from her!"); console.log("can't wait to hear back from her!") });
你的代碼(國王)給了node
(僕人)兩個任務即讀(readFile)和寫(writeFile)文件,而後就去睡大覺了。一旦node完成了某個任務,跟這個任務對應的回調就會觸發。但同一時間只能有一個回調被觸發,在那個回調執行完成以前,全部其它的回調都得排隊等待。進一步說,回調觸發的順序是不能被保證的。
你確實理解了,這就是JavaScript的單進程/事件循環設計美麗的地方。
一個緣由是效率。在一個web應用中,響應時間主要是花在了執行數據庫查詢上面,而用node
,你能夠一次性執行全部的數據庫查詢。將響應時間減小到了執行最慢的數據庫查詢所用的時間。
另外一個緣由是Javascript
。你可使用Node
讓你的瀏覽器和後端共享代碼。Javascript也在漸漸成爲一門真正的通用語言。無論你在過去是用Python, Ruby, Java, PHP, ...等等,你都或多或少的使用過Javasctipt,對嗎?
最後一個緣由是原生速度。V8正在不斷的推動做爲地球上最快的動態語言編譯器之一的邊界,我也想不到有任何其它的語言在速度上可以像Javascript同樣不斷的高歌猛進。再進一步說,node
的I/O設備真的十分的輕量,可以讓你儘量最大程度的利用系統的I/O容量。
是也不是,一旦你開始舞弄node
這柄錘子,全部的東西都會開始變得像釘子。但若是你當前的工做有一個deadline,你能夠參考下面的幾點來作決定用不用node
:
低響應時間/高併發是否重要?Node真的很擅長處理這倆問題;
項目有多大?小項目沒問題,若是是大項目就應該認真評估了(可用的庫,修復一個bug所需的資源或者two upstream等等)
這是一個好問題!答案是不行,DOM是瀏覽器的東西嗎,不過幸虧node的JS引擎(V8)跟那些混亂的東西是徹底分離的。不過,有人在以node模塊的形式來實現DOM,或許帶來使人興奮的可能性好比對客戶端代碼進行單元測試。(譯者注:如今已經有人實現了這個模塊,詳情查看Node-dom)。
這取決於你本身,若是你已經學會了如何在瀏覽器裏調用Ajax或是調用某個事件,那麼學習node對你不會是什麼難題。
同時,測試驅動開發可以真正的幫助你從作一個可維護的設計開始學習node。
Tim Caswell正在運做優秀的How To Node博客。在twitter上Follow nodejs。訂閱郵件列表。(譯者注:也能夠結合Node.js 6.9.5 文檔進行學習,另外,譯者寫了一個node的小應用node-sample能夠clone下來看下)
本篇文章的好比講真是有些簡單了,但從現實事物中找到真正相對應的也是在太難。,另外,因爲時間緣由,本文一些不妥之處或是當時還處在實驗性階段的東西譯者或刪或改。能力有限,水平通常,翻譯不妥之處,還望指正。感謝。