[譯] 在你沉迷於包的海洋以前,仍是瞭解一下運行時 Node.js 的自己

在你沉迷於包的海洋以前,仍是瞭解一下運行時 Node.js 的自己

這篇文章將挑戰你 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

Node.js 知識挑戰:

其中一些問題簡短而容易,而另外一些則須要更長的答案和更深刻的知識。它們的排名不分前後。ios

我知道你會在閱讀這個列表後想要它們的答案。下面的建議部分有一些答案,但我也將在這篇的 freeCodeCamp 文章以後回答全部這些問題。 但讓我試試你的底!git

  1. Node.js 和 V8 之間的關係是什麼?能夠在沒有 V8 的狀況下運行 Node 嗎?
  2. 當你在任何一個 Node.js 文件中聲明一個全局變量時,它對於全部模塊都是真的全局嗎?
  3. 當暴露一個 Node 模塊的 API 時, 爲何咱們有時候用 exports 有時候用 module.exports?
  4. 咱們能夠依賴不使用相對路徑的本地文件嗎?
  5. 能夠在同一個應用中使用相同包的不一樣版本嗎?
  6. 什麼是事件循環?它是 V8 的一部分嗎?
  7. 什麼是調用棧?它是 V8 的一部分嗎?
  8. setImmediateprocess.nextTick 的區別在哪裏?
  9. 如何使異步函數返回值?
  10. 回調能夠與 promise 一塊兒使用嗎?他們仍是同一種方式仍是兩種不一樣的方式?
  11. 什麼 Node 模塊由許多其餘 Node 模塊實現?
  12. spawnexecfork 的主要區別是什麼?
  13. 集羣模塊如何工做?它與使用負載均衡有何不一樣?
  14. --harmony-* 標誌是什麼?
  15. 如何讀取和檢查 Node.js 進程的內存使用狀況?
  16. 當調用棧和事件循環隊列都爲空時,Node 將作什麼?
  17. 什麼是 V8 對象和函數模板?
  18. 什麼是libuv, Node.js 如何使用它?
  19. 如何使 Node 的 REPL 老是使用 JavaScript 嚴格模式?
  20. 什麼是 process.argv? 它擁有什麼類型的數據?
  21. 在 Node 進程結束以前,咱們該如何作最後一個操做?該操做能夠異步完成嗎?
  22. 你能夠在 Node REPL 中使用哪些內置命令?
  23. 除了 V8 和 libuv,Node 還有什麼其餘外部依賴?
  24. 進程 uncaughtException 事件的問題是什麼? 它和 exit 事件的區別是什麼?
  25. 在 Node’s REPL 中 _ 意味着什麼?
  26. Node buffer 使用V8內存嗎?能夠調整他們的大小嗎?
  27. Buffer.allocBuffer.allocUnsafe 的區別是什麼?
  28. slice 在 buffer 上與在 array 上有什麼不一樣?
  29. string_decoder 模塊有什麼用? 它和 buffer 轉字符串有何不一樣?
  30. require 函數須要執行的 5 個主要步驟是什麼?
  31. 如何檢查本地模塊是否存在?
  32. package.jsonmain 屬性有什麼用?
  33. 什麼是 Node 中的模塊循環依賴,如何避免?
  34. require 函數自動嘗試的 3 個文件擴展名是什麼?
  35. 當建立一個 HTTP 服務並對請求做出響應時, 爲何 end() 函數是必須的?
  36. 什麼狀況下適合使用文件系統的 *Sync 方法?
  37. 如何只打印深層嵌套對象的一個級別?
  38. node-gyp 包有什麼用?
  39. 對象 exportsrequiremodule 在全部模塊中都是全局的但在每個模塊中它們都不相同. 這是怎麼作到的?
  40. 若是你執行一個只有 console.log(arguments); 的 Node 腳本文件 , 實際 Node 會輸出什麼?
  41. 如何作到一個模塊能夠同時被其餘模塊使用,而且能夠經過 node 命令執行?
  42. 舉一個可讀寫的內置流的例子。
  43. 當在 Node 腳本中執行 cluster.fork() 時會發生什麼?
  44. 使用事件發射器和使用簡單的回調函數來容許異步處理代碼有什麼區別?
  45. console.time 函數有什麼用?
  46. 可讀流的「已暫停」和「流動」模式之間有什麼區別?
  47. --inspect 參數對於 node 命令有什麼用?
  48. 如何從已鏈接的套接字中讀取數據?
  49. require 函數老是緩存它依賴的模塊. 若是須要屢次執行所需模塊中的代碼,你能夠作什麼?
  50. 使用流時,你什麼時候使用管道功能以及什麼時候使用事件? 這兩種方法能夠組合嗎?

我採起了最好的方式來學習 Node.js

學習 Node.js 可能很具備挑戰性。如下的一些指南但願能在這個旅程中幫到你:github

學習 JavaScript 的好的部分並學習它的現代語法( ES2015 及更高版本)

Node 是一個基於 VM 引擎的能夠編譯 JavaScript 的庫,因此不言而喻,JavaScript 自己的重要功能是 Node 的重要功能的一個子集。故你應該從 JavaScript 自己開始學習之旅。

你理解函數、做用域、綁定這個關鍵字以及新的關鍵字,閉包、類、模塊模式、原型、回調和 promise 嗎?你知道能夠在 Number、String、Array、Set、Object 和 map 上使用的各類方法嗎?適應這個列表上的項目,將使得學習 Node API 更容易。例如,在你很好地理解回調以前,試圖學習 'fs' 模塊方法可能會致使沒必要要的混亂。

瞭解 Node 的非阻塞性質

回調和 promise(以及 generators/async 模式)對於 Node 特別重要。異步操做是你在 Node 中的第一課。

你能夠將一個 Node 程序中的幾行代碼的非阻塞性質你訂購星巴克咖啡的方式(在商店中,而不是得來速)相比較:

  1. 下訂單 | 給 Node 一些執行指令(一個函數)
  2. 自定義你的訂單,例如沒有生奶油 | 給函數一些參數:({whippedCream: false})
  3. 在你的訂單上告訴星巴克員工你的命令 | 經過回調告訴 Node 執行你的函數: ({whippedCream: false}, callback)
  4. 而後靠邊站,星巴克的員工會從排在你後面的人接到訂單 | Node 將從你的後面的代碼接收指令。
  5. 當你要的咖啡準備好了,星巴克員工會叫你的名字,並給咖啡 | 當你的函數計算結束 Node.js 就會根據計算結果執行回調:callback(result)

我寫了一篇博客文章來描述這個過程:在星巴克參悟異步編程

瞭解 JavaScript 併發模型及其如何基於事件循環而運做

棧,堆和隊列。若是你閱讀了有關這個主題的書卻仍然不徹底理解,能夠看看 這個傢伙,我保證你就懂了。

Philip 解釋了在瀏覽器中的事件循環,但在 Node.js 中實際上是幾乎徹底相同的事情(儘管有一些差別)。

瞭解一個 Node 進程如何不進如入 sleep 狀態,而且當沒有什麼要作的時候就會結束進程

Node 進程能夠空閒,但它從不進入 sleep 狀態。它跟蹤全部正在等待執行的回調,若是沒有能夠執行的回調它將直接結束進。爲了保持 Node 進程持續運行,你可使用一個 setInterval 函數,由於這將在事件循環中建立一個永久處於掛起狀態的回調。

學習可使用的全局變量,如 process、module 和 Buffer

它們都定義在一個全局變量裏(一般與瀏覽器中的 window 變量相比較)。在 Node 的 REPL 中,鍵入 global。並點擊選項卡以查看全部可用的項目(或在空行上的簡單雙擊標籤)。其中一些項目是 JavaScript 結構(如 ArrayObject)。其中一些是 Node 庫函數(如 setTimeoutconsole 輸出到 stdout / stderr),其中一些是 Node 全局對象,你能夠將其用於處理某些任務(例如,process.env 可用於讀取主機的環境變量)。

你在表中看到大部份內容的都應該理解。

瞭解你可使用 Node 附帶的內置庫作什麼,以及它們如何專一於「網絡」

其中一些人會以爲熟悉,好比 Timers,由於他們也存在於瀏覽器和 Node 模擬的環境中。可是,還有更多要學習的,如 fspathreadlinehttpnetstreamcluster、……(上面的列表已經包含它們)。

例如,你可使用 fs 讀、寫文件,可使用 「http」 運行流式 Web 服務器,而且能夠運行 tcp 服務器和使用 「net」 編程套接字。今天的 Node 比一年前的功能要強大得多,並且它經過社區的代碼提交愈來愈好。在爲你的任務尋找可用的包以前,請確保你沒法首先使用 Node 內置的程序包完成該任務。

event 庫特別重要,由於大多數 Node 架構都是事件驅動的。

在這裏你能夠老是更多地瞭解 Node API, 因此請繼續擴展你的視野吧.

理解 Node 爲何要叫 Node

你構建簡單的單進程構建塊(節點),可使用良好的網絡協議組織它們,以使它們彼此通訊並擴展以構建大型分佈式程序。簡化成 Node 應用不是在此以後——它的名字就是從這裏產生的。

閱讀並嘗試理解爲 Node 編寫的一些代碼

選擇一個框架,如 Express,並嘗試理解它的一些代碼。告訴我你不懂的地方。當條件容許我會試着在 slack 頻道回答問題。

最後,用 Node 編寫一個 Web 應用,並且不使用任何框架。嘗試處理儘量多的狀況,使用 HTML 文件,解析查詢字符串,接受表單輸入,並建立一個以 JSON 響應的終端。

還能夠嘗試編寫聊天服務器,發佈 npm 包,併爲開源的基於 Node 的項目作出貢獻。

祝君碼運昌隆!

掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃

相關文章
相關標籤/搜索