- 原文地址:Before you bury yourself in packages, learn the Node.js runtime itself
- 原文做者:該文章已得到做者 Samer Buna 受權
- 譯文出自:掘金翻譯計劃
- 譯者:fghpdf
- 校對者:rccoder,reid3290
這篇文章將挑戰你 Node.js 的知識極限。javascript
我在 Ryan Dahl 第一次 介紹 Node.js 以後不久就開始學習它,甚至一年前我也不能回答我在這篇文章中提出的許多問題。 若是你能真正地回答全部的問題,那麼你的 Node.js 的知識儲備是迥乎常人的。 咱們應該成爲朋友。html
我發起這個挑戰的緣由可能會讓你大吃一驚,咱們中的許多人一直採用着錯誤的方式來學習 Node。大多數關於 Node 的教程,書籍和課程都關注於 Node 生態,而不是 Node 自己。 他們專一於教你使用的全部的 Node 包,例如 Express 和 Socket.IO,而不是教會你使用 Node 自己的功能。前端
這樣作也有很好的理由。Node 是原生的和靈活的。它不提供完整的解決方案,而是提供一個豐富的,你本身可以實現的解決方案。像 Express.js 和Socket.IO 這樣的庫則是更完整的解決方案,所以教這些庫是更有意義的,這樣可讓學習者使用這些完整的解決方案。java
傳統的觀念彷佛以爲只有那些編寫類庫如 Express.js 和 Socket.IO 的人須要瞭解 Node.js 運行時的一切。但我認爲這樣的觀點是錯誤的。深刻理解 Node.js 自己是使用這些完整的解決方案以前最好的作法。你至少應該有足夠的知識和信心來經過一個包的代碼來判斷你是否應該學習使用它。node
這就是爲何我決定開一個完徹底全專攻於 Node 自己的 Pluralsight 課程。在備課時,我會列出一些具體問題來肯定你對 Node 自己的瞭解是否已經足夠深刻,仍是須要改進。react
若是你能回答這些問題而且正在找工做,請聯繫我!反過來講,若是大多數這些問題使你感到茫然,你則須要優先學習 Node 自己了。你所學的知識將使你成爲一個更加理想的開發人員。android
其中一些問題簡短而容易,而另外一些則須要更長的答案和更深刻的知識。它們的排名不分前後。ios
我知道你會在閱讀這個列表後想要它們的答案。下面的建議部分有一些答案,但我也將在這篇的 freeCodeCamp 文章以後回答全部這些問題。 但讓我試試你的底!git
exports
有時候用 module.exports
?setImmediate
和 process.nextTick
的區別在哪裏?spawn
、 exec
和 fork
的主要區別是什麼?--harmony-*
標誌是什麼?process.argv
? 它擁有什麼類型的數據?uncaughtException
事件的問題是什麼? 它和 exit
事件的區別是什麼?_
意味着什麼?Buffer.alloc
和 Buffer.allocUnsafe
的區別是什麼?slice
在 buffer 上與在 array 上有什麼不一樣?string_decoder
模塊有什麼用? 它和 buffer 轉字符串有何不一樣?package.json
的 main
屬性有什麼用?end()
函數是必須的?*Sync
方法?node-gyp
包有什麼用?exports
、 require
和 module
在全部模塊中都是全局的但在每個模塊中它們都不相同. 這是怎麼作到的?console.log(arguments);
的 Node 腳本文件 , 實際 Node 會輸出什麼?node
命令執行?console.time
函數有什麼用?--inspect
參數對於 node 命令有什麼用?require
函數老是緩存它依賴的模塊. 若是須要屢次執行所需模塊中的代碼,你能夠作什麼?學習 Node.js 可能很具備挑戰性。如下的一些指南但願能在這個旅程中幫到你:github
Node 是一個基於 VM 引擎的能夠編譯 JavaScript 的庫,因此不言而喻,JavaScript 自己的重要功能是 Node 的重要功能的一個子集。故你應該從 JavaScript 自己開始學習之旅。
你理解函數、做用域、綁定這個關鍵字以及新的關鍵字,閉包、類、模塊模式、原型、回調和 promise 嗎?你知道能夠在 Number、String、Array、Set、Object 和 map 上使用的各類方法嗎?適應這個列表上的項目,將使得學習 Node API 更容易。例如,在你很好地理解回調以前,試圖學習 'fs' 模塊方法可能會致使沒必要要的混亂。
回調和 promise(以及 generators/async 模式)對於 Node 特別重要。異步操做是你在 Node 中的第一課。
你能夠將一個 Node 程序中的幾行代碼的非阻塞性質你訂購星巴克咖啡的方式(在商店中,而不是得來速)相比較:
({whippedCream: false})
({whippedCream: false}, callback)
callback(result)
我寫了一篇博客文章來描述這個過程:在星巴克參悟異步編程
棧,堆和隊列。若是你閱讀了有關這個主題的書卻仍然不徹底理解,能夠看看 這個傢伙,我保證你就懂了。
Philip 解釋了在瀏覽器中的事件循環,但在 Node.js 中實際上是幾乎徹底相同的事情(儘管有一些差別)。
Node 進程能夠空閒,但它從不進入 sleep 狀態。它跟蹤全部正在等待執行的回調,若是沒有能夠執行的回調它將直接結束進。爲了保持 Node 進程持續運行,你可使用一個 setInterval
函數,由於這將在事件循環中建立一個永久處於掛起狀態的回調。
它們都定義在一個全局變量裏(一般與瀏覽器中的 window
變量相比較)。在 Node 的 REPL 中,鍵入 global
。並點擊選項卡以查看全部可用的項目(或在空行上的簡單雙擊標籤)。其中一些項目是 JavaScript 結構(如 Array
和 Object
)。其中一些是 Node 庫函數(如 setTimeout
或 console
輸出到 stdout
/ stderr
),其中一些是 Node 全局對象,你能夠將其用於處理某些任務(例如,process.env
可用於讀取主機的環境變量)。
你在表中看到大部份內容的都應該理解。
其中一些人會以爲熟悉,好比 Timers,由於他們也存在於瀏覽器和 Node 模擬的環境中。可是,還有更多要學習的,如 fs
、path
、readline
、http
、net
、stream
、cluster
、……(上面的列表已經包含它們)。
例如,你可使用 fs
讀、寫文件,可使用 「http
」 運行流式 Web 服務器,而且能夠運行 tcp 服務器和使用 「net
」 編程套接字。今天的 Node 比一年前的功能要強大得多,並且它經過社區的代碼提交愈來愈好。在爲你的任務尋找可用的包以前,請確保你沒法首先使用 Node 內置的程序包完成該任務。
event
庫特別重要,由於大多數 Node 架構都是事件驅動的。
在這裏你能夠老是更多地瞭解 Node API, 因此請繼續擴展你的視野吧.
你構建簡單的單進程構建塊(節點),可使用良好的網絡協議組織它們,以使它們彼此通訊並擴展以構建大型分佈式程序。簡化成 Node 應用不是在此以後——它的名字就是從這裏產生的。
選擇一個框架,如 Express,並嘗試理解它的一些代碼。告訴我你不懂的地方。當條件容許我會試着在 slack 頻道回答問題。
最後,用 Node 編寫一個 Web 應用,並且不使用任何框架。嘗試處理儘量多的狀況,使用 HTML 文件,解析查詢字符串,接受表單輸入,並建立一個以 JSON 響應的終端。
還能夠嘗試編寫聊天服務器,發佈 npm 包,併爲開源的基於 Node 的項目作出貢獻。
祝君碼運昌隆!
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。