理解 Node.js(譯文)

Damonare發表於2017-02-09

前言

總括 :這篇文章十分生動形象的的介紹了Node,滿足了讀者想去了解Node的需求。作者是Node的第一批貢獻者之一,德國前端大神。譯者覺得作者的比喻很適合初學者理解Node,特此翻譯。

譯者 :原文網址裡有隻小螞蟻的效果很有意思(多次滑鼠懸浮會有驚喜),哈哈哈,可以去看一下哦。

本文屬於譯文

正文

當我向別人介紹Node.js 的時候一般會有兩種反應,要麼是立馬就弄明白它是個什麼玩意兒,要麼是被它搞的很糊塗。

如果你現在還處於後者,下面就是我對於node的解釋:

  • 它是一個命令列工具,你可以下載一個tarball檔案,編譯然後安裝原始檔;
  • 它可以讓你在你的終端輸入node my_app.js來執行Javascript程式;
  • Node的JS程式碼是由 V8 javascript 引擎(就是那個使得Chrome如此之快的東西)所執行的;
  • Node提供了諸如訪問網路或是操作檔案系統的Javascript API

“但我也可以用 Ruby, Python, Php,Java, ...等語言來做我想要做的事啊”

我聽到你說的話了,你是對的。Node不是狡猾的獨角獸,這點很抱歉,它不會幫你做你該做的事。它僅僅是一個工具,而且他也不會替代你現在所常用的一些工具,至少現在不會。

"說重點!!!"

好的,我會的,當你需要同時做好幾件事的時候Node會表現的十分優秀。你有寫了一段程式碼然後對他說"我想你可以並行執行!"的體驗嗎?哈哈哈,在Node中除了你的程式碼所有的東西都是並行執行的。

"啊?!"

是的,沒錯,除了你的程式碼之外所有的程式碼都是並行執行的。為了理解這一點,你可以把你自己的程式碼想象成一個國王,而Node就是他的僕人軍隊。

新的一天是這樣開始的:某個僕人叫醒了國王,然後問他是否需要什麼。國王給了這個僕人一個任務清單然後就回去繼續睡覺了。然後這個僕人就把任務清單上的任務分發下去,僕人們開始工作了。

當一個僕人完成了他的任務的時候,他就跑到國王寢宮外面排隊等候報告。國王一次只能聽取一個僕人報告任務,有的時候國王會在僕人報告結束的時候給他更多的任務。(看你程式碼咋寫咯)

生活是美好的,因為國王的諸多僕人同時執行多個任務,但報告結果的時候是一個一個來的,所以國王能夠很專注。

"那確實很美好,但你能結束這個愚蠢的比喻用更加geek的方式來告訴我嗎?"

好的,一個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寫我所有的應用麼?"

是也不是,一旦你開始舞弄node這柄錘子,所有的東西都會開始變得像釘子。但如果你當前的工作有一個deadline,你可以參考下面的幾點來做決定用不用node:

  • 低響應時間/高併發是否重要?Node真的很擅長處理這倆問題;
  • 專案有多大?小專案沒問題,如果是大專案就應該認真評估了(可用的庫,修復一個bug所需的資源或者two upstream等等)

"我能在Node中訪問DOM嗎?"

這是一個好問題!答案是不行,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下來看下)

後記

本篇文章的比如講真是有些簡單了,但從現實事物中找到真正相對應的也是在太難。,另外,由於時間原因,本文一些不妥之處或是當時還處在實驗性階段的東西譯者或刪或改。能力有限,水平一般,翻譯不妥之處,還望指正。感謝。

相關文章