[譯] 在你沉迷於包的海洋之前,還是瞭解一下執行時 Node.js 的本身

弋只妖的圈圈發表於2019-02-26

在你沉迷於包的海洋之前,還是瞭解一下執行時 Node.js 的本身

[譯] 在你沉迷於包的海洋之前,還是瞭解一下執行時 Node.js 的本身

這篇文章將挑戰你 Node.js 的知識極限。

我在 Ryan Dahl 第一次 介紹 Node.js 之後不久就開始學習它,甚至一年前我也不能回答我在這篇文章中提出的許多問題。 如果你能真正地回答所有的問題,那麼你的 Node.js 的知識儲備是迥乎常人的。 我們應該成為朋友。

我發起這個挑戰的原因可能會讓你大吃一驚,我們中的許多人一直採用著錯誤的方式來學習 Node。大多數關於 Node 的教程,書籍和課程都關注於 Node 生態,而不是 Node 本身。 他們專注於教你使用的所有的 Node 包,例如 Express 和 Socket.IO,而不是教會你使用 Node 本身的功能。

這樣做也有很好的理由。Node 是原生的和靈活的。它不提供完整的解決方案,而是提供一個豐富的,你自己能夠實現的解決方案。像 Express.js 和Socket.IO 這樣的庫則是更完整的解決方案,因此教這些庫是更有意義的,這樣可以讓學習者使用這些完整的解決方案。

傳統的觀念似乎覺得只有那些編寫類庫如 Express.js 和 Socket.IO 的人需要了解 Node.js 執行時的一切。但我認為這樣的觀點是錯誤的。深入理解 Node.js 本身是使用這些完整的解決方案之前最好的做法。你至少應該有足夠的知識和信心來通過一個包的程式碼來判斷你是否應該學習使用它。

這就是為什麼我決定開一個完完全全專攻於 Node 本身的 Pluralsight 課程。在備課時,我會列出一些具體問題來確定你對 Node 本身的瞭解是否已經足夠深入,還是需要改進。

如果你能回答這些問題並且正在找工作,請聯絡我!反過來說,如果大多數這些問題使你感到茫然,你則需要優先學習 Node 本身了。你所學的知識將使你成為一個更加理想的開發人員。

Node.js 知識挑戰:

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

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

  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 可能很具有挑戰性。以下的一些指南希望能在這個旅程中幫到你:

學習 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 併發模型及其如何基於事件迴圈而運作

棧,堆和佇列。如果你閱讀了有關這個主題的書卻仍然不完全理解,可以看看 這個傢伙,我保證你就懂了。

[譯] 在你沉迷於包的海洋之前,還是瞭解一下執行時 Node.js 的本身

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.js 的本身

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

瞭解你可以使用 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前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃

相關文章