Mosh的Node.js教程(一)

前言javascript

本系列文章是根據Mosh大佬的視頻教程全方位Node開發 - Mosh整理而成,我的以爲視頻很是不錯,因此計劃邊學習邊整理成文章方便後期回顧。該視頻教程是英文的,可是有中文字幕,感謝marking1212提供的中文字幕翻譯。前端

本篇文章大綱

  • 什麼是Node
  • Node的設計結構
  • Node是如何工做的
  • 安裝Node
  • 你的第一個Node應用

什麼是Node?

Node.jsNode是一個開源跨平臺的運行環境,用來在瀏覽器外執行JavaScript代碼。java

咱們經常使用Node來建立後端程序,咱們更常說API,也就是應用程序接口,這些是用來支撐客戶端的服務。node

好比網絡應用,它們在瀏覽器中運行,或者手機應用,它們在手機中運行,這些客戶端簡單說就是管理用戶所見和所作。數據庫

Node是建立高擴展性數據密集型和實時的後端服務,去支持客戶端服務的理想工具。後端

Node有什麼特別之處?

  1. Node首先很容易上手,能夠很好的適應原型和敏捷的開發工做
  2. 它也支持開發超速和高擴展性服務,它已經應用於多個大公司的系統,好比PayPal、優步、Netflix、沃爾瑪等等。實際上在PayPal,他們使用了Node重構了一個原來基於Java和Spring的應用,而後他們發現比起用Spring,開發速度快了一倍並只用更少的人,而且減小了三分之一的代碼,並且減小了四成的文件,更重要的是他們實現了每秒服務效率的翻倍,同時使響應時間減小了35%,因此Node是用於構建高可擴展性應用的不二選擇
  3. Node應用是用JavaScript編寫的,因此若是你是熟悉JavaScript的前端開發者,你就能夠複用你的JavaScript知識,並轉爲一個全棧開發者,並以此走上人生巔峯,你無需學習一門新語言
  4. 同時,由於你能夠同時在先後端使用JavaScript,你的代碼將更簡潔明瞭,你可使用相同的命名規範、工具和最佳實踐
  5. 它有着強大的生態和衆多開源庫,因此若是你想在應用添加一些特性或者功能塊,你就可使用不少免費和開源的庫

Node的設計結構

Node是一個運行JavaScript的環境。瀏覽器

運行環境是什麼?

Node以前,JavaScript只能運行在瀏覽器裏,每一個瀏覽器都有咱們所說的JavaScript引擎,它將JavaScript代碼轉換爲機器才懂的機器碼。例如,微軟的Edge瀏覽器使用的引擎是查克拉,FireFox的引擎是SpiderMonkeyChrome的引擎是V8bash

就是由於引擎是有幾種,因此JavaScript的行爲可能在瀏覽器之間會有不一樣。網絡

瀏覽器提供了一個JavaScript代碼的運行環境,好比,如你所知在瀏覽器是有windowdocument對象的,這些對象容許咱們操做代碼的運行環境,直到2009年,瀏覽器是運行JavaScript的惟一途徑。架構

Node的由來

2009年,Node的做者Ryan Dahl他想若是能在瀏覽器外運行JavaScript將是極好的,因此他抽取了當時最快的引擎,也就是GoogleV8,並用C++編寫了一個程序封裝起來後取名爲Node,與瀏覽器相似,Node也是一個JavaScript的運行環境,它包含了一個能夠運行JavaScript代碼的引擎,可是它也包括一些用來提供環境的對象,這些對象與在瀏覽器中的對象不一樣,比方說Node裏沒有document對象,相反它有另外一個對象提供了不少有趣的能力,好比說咱們能夠操做文件系統,或者列出對給定端口的請求,這些咱們在瀏覽器作不到,因此Node是一個包含JavaScript引擎的程序,並提供給咱們一些瀏覽器沒有的新特性,咱們能夠處理文件系統或者網絡請求等等。

Node它不是語言,它不是框架,它是一個用來運行JavaScript代碼的運行環境。

Node如何工做

Node的高可擴展性是由於Node的無阻塞或者異步的特性。

什麼是異步?

舉個例子,你去餐廳,服務員過來給你下單並給到廚房,而後服務員就去服務其餘客人,並等待大廚作好菜,因此同一個服務員能夠服務不少張桌子,他在服務其餘客人以前不用等着大廚作菜,這就是咱們所說的無阻塞或者異步的設計思路。

這就是Node應用的工做方式。

服務員就好像等待需求的進程,因此一個進程能夠服務多個需求,對比無阻塞或者異步工做方式,咱們還有阻塞或者同步的設計。

什麼是同步?

想象你去另外一個餐廳,一個服務員過來點單,他下好單並給到了廚房,而後他就坐在廚房裏,等大廚給你作好菜,這段時間他什麼都不作,只是等着,他在給你送到餐以前不會去給其餘客人下單,這就是咱們所說的阻塞或者同步的設計方式。

同步的弊端

這就是什麼有些框架如C#或者Rails就很慢,當咱們的服務收到一個請求,一個進程就被分配去處理這個請求,做爲處理這個請求的一部分,就好像咱們去查詢數據庫,如你所知,有時候咱們須要等待它給咱們結果,當數據庫執行着一個查詢,那個進程就在那裏等待,它不能用於服務另外一個客戶端,這樣就須要一個新的進程來服務這個客戶端,想象一下,若是咱們有很是多的客戶端,有時候咱們須要開啓全部進程來響應請求,這樣新的請求就要等待直到有進程空閒,若是它不想等,咱們就須要增長新的硬件了,當使用這種架構的時候,你沒辦法作到物盡其用,這就是阻塞或者同步結構的弊端。就像asp.net開發的程序默認就是這個模式。

Node的優點

做爲比較,Node默認就是以異步方式工做,你無需作任何額外工做,Node中一個進程能夠服務全部請求,當請求來,這個進程就去響應,若是這時須要查詢數據庫,這個進程不會去等到數據庫返回結果,當數據庫正在執行查詢的時候,這個進程就被指派去服務另外一個客戶端,當數據庫準備好結果了,它會給咱們說的事件隊列推一個消息,Node持續在後臺監聽這個隊列,當它發現隊列中有事件,它就去取出事件並處理,這種特性使得Node成爲構建桌面與網絡鏈接的理想工具,咱們不用投入不少硬件就能夠服務衆多用戶,這就是爲何Node具備高可擴展性的特色。

一樣,Node不適用於密集運算型的應用,好比視頻渲染或者圖片操做服務,這種類型的應用須要CPU完成大量運算,須要操做文件和網絡的極少,由於Node應用是單線程的,當要給一個用戶提供運算,其餘的用戶就要等待,這就是爲什麼Node不能應用於密集運算,它只適用建立數據密集型或者實時響應的應用,

安裝Node

查看電腦是否安裝了Node,打開CMD,輸入

node --version
複製代碼

若是沒有安裝,打開官網nodejs.org,你能夠看到有兩個選項,咱們選擇安裝LTS這個穩定的版本便可。

你的第一個Node應用

打開CMD,新建一個文件夾

mkdir first-app
複製代碼

而後進入這個文件夾

cd first-app
複製代碼

而後再輸入

code .
複製代碼

打開編輯器,我這邊用的是VS Code

咱們新建一個app.js文件,在這裏能夠寫原生的JavaScript代碼,就像你給瀏覽器寫的JS同樣。

咱們定義一個函數

function sayHello(name) {
  console.log('Hello ' + name)
}
複製代碼

而後調用這個函數

sayHello('Mosh')
複製代碼

爲了運行這個函數,咱們須要回到CMD,運行Node,並將文件名做爲參數,也就是app.js

node app.js
複製代碼

Node如我以前所說是一個C++程序,抽離了ChromeV8引擎,因此這個app.js文件傳給NodeNode會把它傳給V8來執行。

能夠看到在CMD輸出了Hello Mosh

接下來咱們打印一下window對象,看看會發生什麼,咱們在app.js輸入

console.log(window)
複製代碼

而後回到CMD,再次執行node app.js,能夠看到CMD報了一個錯誤:window is not defined

這是由於Node中沒有window或者document對象,這些是在瀏覽器做爲運行環境纔有的東西,在Node中有另外一個對象來操做文件、使用操做系統或者網絡等等,後面咱們會學習到的。

最後

感謝您的閱讀,但願對你有所幫助。因爲本人水平有限,若是文中有描述不當的地方,煩請指正,很是感謝。

關注

歡迎你們關注個人公衆號前端幫幫忙

下篇文章預告

Node的模塊系統

相關文章
相關標籤/搜索