国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[譯]你并不知道Node

miqt / 2551人閱讀

摘要:問題什么是調(diào)用棧并且它是的一部分么調(diào)用棧當然是的一部分。為什么理解是重要的因為你在每個進程中只能獲取一個調(diào)用棧。它是一個從事件隊列中跳去事件的循環(huán)并且將它們的回調(diào)壓入到調(diào)用棧中。當調(diào)用棧為空的時候,事件循環(huán)可以決定下一步執(zhí)行哪一個。

你并不知道Node

原文:You don’t know Node

譯者:neal1991

welcome to star my articles-translator , providing you advanced articles translation. Any suggestion, please issue or contact me

LICENSE: MIT

在今年 Forward.js (一個 JavaScript)會議中,我做了主題為“你并不知道 Node”的演講。在這個演講中,我向觀眾提出一些關(guān)于 Node.js 運行時的具有挑戰(zhàn)性的問題,大多數(shù)技術(shù)相關(guān)觀眾無法回答其中的大部分問題。

我并沒有進行實際的統(tǒng)計,但是在那個房間感覺是這個樣子的。并且有一些勇敢的觀眾在演講之后向我承認了這一事實。

這也就是我做此次演講的原因。我不認為我們以正確的方式教學 Node!大多數(shù)的 Nodejs相關(guān)的教學概念集中于Node 包卻不是它的運行時。大多數(shù)的包都將 Node 運行時包裹在模塊中(比如 http 或者 stream)。當你遇到問題的時候,這些問題可能存在于運行時之中,如果你不知道Node 運行的話, 你就陷入麻煩了。

這個問題:多數(shù)的 Nodejs相關(guān)的教學概念集中于Node 包卻不是它的運行時

我為這篇文章選擇了一些問題并且做出回答。它們將以標題的形式在下面呈現(xiàn)。首先嘗試在你自己心中做出回答!

如果你發(fā)現(xiàn)錯誤或者具有誤導性的回答,請讓我知道。

問題 #1: 什么是調(diào)用棧并且它是V8的一部分么?

調(diào)用棧當然是 V8 的一部分。它是 V8 用來追蹤函數(shù)調(diào)用的一種數(shù)據(jù)結(jié)構(gòu)。每次我們調(diào)用一個函數(shù)的時候,V8都會將向函數(shù)調(diào)用棧中壓入一個對于函數(shù)的引用,它對于其它函數(shù)的內(nèi)嵌函數(shù)也會這樣做。這也包括遞歸調(diào)用函數(shù)的函數(shù)。

當函數(shù)中的內(nèi)嵌函數(shù)到達末端的時候,V8 就會每次彈出一個函數(shù)并且在它的位置使用返回值。

為什么理解 Node 是重要的?因為你在每個 Node 進程中只能獲取一個調(diào)用棧。如果你讓這個調(diào)用棧保持忙碌,那么你的整個 Node 進程也會是忙碌的。記住這一點。

問題 #2: 什么是事件循環(huán)? 它是V8的一部分嗎?

你認為事件循環(huán)是在這張圖的什么地方?

事件循環(huán)是由 libbuv 庫提供,它不是 V8 的一部分。

事件循環(huán)處理外部事件并且將它們轉(zhuǎn)換成回調(diào)調(diào)用。它是一個從事件隊列中跳去事件的循環(huán)并且將它們的回調(diào)壓入到調(diào)用棧中。它也是一個多相回調(diào)。

如果這是你第一次聽說事件循環(huán),這些概念將可能不會那么有用。這個事件循環(huán)是一張更大的圖的一部分。

你需要理解這張更大的圖從而理解事件循環(huán)。你需要理解 V8 的角色,知道 Node 的 API,并且知道事件如何進入隊列從而被 V8 所執(zhí)行。

Node 的 API 就是一些函數(shù),比如 setTimeout 或者 fs.readFile。這些并不是 JavaScript 中的一部分。它們是由 Node 提供的函數(shù)。

事件循環(huán)位于這張圖(真的是一個更復雜的版本)的中間位置,就好像是一個組織者。當 V8 調(diào)用棧為空的時候,事件循環(huán)可以決定下一步執(zhí)行哪一個。

問題 #3: 當調(diào)用棧以及事件循環(huán)都為空的時候,Node會做什么?

很簡單,它會退出。

當你運行一個Node程序的時候,Node 將會自動開始事件循環(huán)并且當事件循環(huán)變?yōu)?idle 的時候并且沒有其它的事情需要做的時候,這個進程將會退出。

為了保持 Node進行運行,你需要在事件隊列的某個地方放一些東西。比如,當你啟動一個計時器或者一個 HTTP 服務(wù)的時候,你基本上就是告訴事件循環(huán)保持運行并且檢查這些事件。

問題 #4: 除了V8以及 Libuv,Node 還有哪些外部依賴?

下面的是 Node 進行需要的所有的多帶帶庫:

http-parser

c-ares

OpenSSL

zlib

它們對于 Node 來說都是外部依賴。它們具有它們自己的源代碼。它們具有它們自己的證書。Node 只是使用它們。

你希望記住因為你想知道你的程序在什么地方運行。如果你在處理數(shù)據(jù)壓縮,你可能遇到一些 zlib 庫使用的一些困難。你可能在解決一個 zlib 的 bug。不要把所有的事都怪罪于 Node。

問題 #5: 可以不使用V8來運行 Node?

這可能是一個棘手的問題。你需要一個 VM 來運行 Node 進程,但是 V8 并不是你唯一可以試用的 VM。你可以使用 Chakra

獲取 Github倉庫來跟追蹤 node-chakra 的進程:https://github.com/nodejs/nod...

問題?#6: module.exports 和 exports 的區(qū)別是什么?

你可以總是試用 module.exports 來導出你模塊的 API。你也可以exports 除了一種情況:

module.exports.g = ...  // Ok
exports.g = ...         // Ok

module.exports = ...    // Ok
exports = ...           // Not Ok

為什么?

exports 只是一個對于 module.exports 的引用或者別名。當你改變 exports 的時候,你是在改變那個引用而不是改變官方的 API(module.exports)。你將只會獲得一個模塊作用域內(nèi)的局部變量。

問題?#7: 頂級變量怎么不是全局變量?

如果你有一個 module1 定義了一個頂級變量 g

// module1.js
var g = 42;

并且你有一個 module2 引入了 module1 并且嘗試訪問變量 g,你將會發(fā)現(xiàn) g 是未定義的

為什么?在瀏覽器中你如果做同樣的操作,你能夠在所有的變量在定義之后被引入就可以訪問頂級變量。

每一個 Node 文件都會在背后獲取它自己的立即執(zhí)行函數(shù)表達式(IIFE)。所有在這個 Node 文件里面定義的變量都是在這個 IIFE 作用域內(nèi)。

相關(guān)問題:運行下面僅僅包含一行代碼的 Node 文件的輸出回事什么:

// script.js
console.log(arguments);

你將會看到一些參數(shù)!

為什么?

因為 Node 執(zhí)行的是一個函數(shù)。 Node 將你的代碼使用函數(shù)來包裝并且這個函數(shù)準確定義了上面你看到的5個參數(shù)。

問題 #8: 對象exportsrequiremodule都是在每個文件中全局可用,但每個文件都不同。 這是如何實現(xiàn)的?

當你需要使用 require 對象的時候,你就可以直接使用它就好像是一個全局變量。然而,如果當你在不同的兩個文件中檢測 require,你將會看到兩個不同的對象。這是如何實現(xiàn)的?

都是因為相同的神奇的 IIFE:

正如你所見,神奇的 IIFE 將你的代碼傳遞到5個參數(shù)之中:exportsrequiremodue__filename以及__dirname

當你在 Node 試用這5個參數(shù)的時候,它們看起來是全局的,但是事實上它們僅僅是函數(shù)的參數(shù)。

問題 #9: Node 中的循環(huán)模塊依賴是什么?

如果你有一個 module1 引入 module2 并且同樣 module2 也引入了 module1,那么將會發(fā)生什么?一個錯誤?

// module1
require("./module2");
// module2
require("./module1");

你將不會得到一個錯誤。Node 允許這種情況。

那么在 module1 引入 module2 的時候,但是因為 module2 需要 module1 并且 module1 尚未完成,module1 將會僅僅獲取 module2的一個部分版本。

你將被警告。

問題 #10: 什么時候試用文件系統(tǒng)中的同步方法 (比如 readFileSync)是可以的?

Node 中的每一個 fs 方法都有一個同步的版本。為什么你要使用一個同步方法而不是一個異步方法呢?

有時候使用同步方法是不錯的。比如,在初始化步驟中服務(wù)器依然在加載的情況下使用同步方法。大多數(shù)情況是初始化步驟之后的所有事取決與在初始化步驟中獲取的數(shù)據(jù)。在不引入回調(diào)的層級,使用同步方法是可以接受的,只要你使用同步方法是一次性的事情。

然而,如果你在一個處理程序中試用同步方法,比如 HTTP 服務(wù)器請求回調(diào),那將會很明顯 100% 報錯。不要那樣做。

我希望你能夠回答一些或者全部這些具有挑戰(zhàn)性的問題。我將會給一些除了 Node.js 基本概念以外的文章。
https://medium.freecodecamp.o...
https://medium.freecodecamp.o...
https://medium.freecodecamp.o...
https://medium.freecodecamp.o...
https://medium.freecodecamp.o...
https://medium.freecodecamp.o...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88781.html

相關(guān)文章

  • [] JavaScript:立即執(zhí)行函數(shù)表達式(IIFE)

    摘要:而且,如果你想跳過這里,你可以直接跳到立即調(diào)用函數(shù)表達式進行閱讀,但是我建議你讀完整篇文章。當圓括號包裹函數(shù)時,它會默認將函數(shù)作為表達式去解析,而不是函數(shù)聲明。什么是呢它使一個被立即調(diào)用的函數(shù)表達式。一旦命名,函數(shù)將不再匿名。 原文:http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iif...

    546669204 評論0 收藏0
  • [] 幫你高效使用 VS Code 的秘訣

    摘要:當你處于文件管理器中,你可以像在的中那樣用相同的快捷鍵進行常規(guī)操作,比如用方向鍵導航用鍵給文件或文件夾重命名用打開當前文件等。 原文地址:Tips to use VSCode more efficiently 原文作者:sudolabs 譯文出自:掘金翻譯計劃 本文永久鏈接:github.com/xitu/gold-m… 譯者:Baddyo 校對者:xionglong58, hzdaqo ...

    cgspine 評論0 收藏0
  • []使用karma進行angular測試

    摘要:前面我們寫過了的一篇文章開始對進行單元測試而提供了非常有用的工具去幫助我們進行的測試。接下來,會增加一些內(nèi)容寫測試用例接下來我們可以開始進行測試了,我們在命令行工具里輸入下面的命令我們將下面的代碼粘貼到中去。 showImg(https://segmentfault.com/img/bVx65M); 緊隨前文如何對Angular Controller進行單元測試,但是我們也提到了前文工...

    Tony 評論0 收藏0
  • 2017-09-30 前端日報

    摘要:前端日報精選劉海打理指北中的錯誤處理模式與反模式譯圖解和譯你并不知道中文裝飾器讓你的代碼更簡潔眾成翻譯第期每個程序員第一份工作前應該知道的件事中的不變性眾成翻譯寫的一次小結(jié)掘金內(nèi)部機制探秘和文末附彩蛋和源碼前端雜談開發(fā)實戰(zhàn) 2017-09-30 前端日報 精選 iPhone X 劉海打理指北React16中的錯誤處理ES6 Promise:模式與反模式「譯」圖解 ArrayBuffer...

    darryrzhong 評論0 收藏0
  • [] 從 CoffeeScript 遷移到 ES6

    摘要:語法校驗會給出警告當你仍在使用或不通過任何關(guān)鍵字聲明變量時。但是如果腳本中還有其他的普通導出,就會得到非常奇怪的結(jié)果這個坑爹的情況目前還沒有任何好的解決方案。 我在多年前愛上了coffeScript。對于javaScript,我一直保持著深沉的愛,也十分高興得看到node.js的快速發(fā)展,但是作為一個有python背景的程序員,我更喜歡coffeeScript的簡練語法。 在任何一個活...

    劉東 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<