前言javascript
本系列文章是根據Mosh
大佬的視頻教程全方位Node開發 - Mosh整理而成,我的以爲視頻很是不錯,因此計劃邊學習邊整理成文章方便後期回顧。該視頻教程是英文的,可是有中文字幕,感謝marking1212提供的中文字幕翻譯。前端
Node.js
或Node
是一個開源跨平臺的運行環境,用來在瀏覽器外執行JavaScript
代碼。java
咱們經常使用Node
來建立後端程序,咱們更常說API,也就是應用程序接口,這些是用來支撐客戶端的服務。node
好比網絡應用,它們在瀏覽器中運行,或者手機應用,它們在手機中運行,這些客戶端簡單說就是管理用戶所見和所作。數據庫
Node
是建立高擴展性數據密集型和實時的後端服務,去支持客戶端服務的理想工具。後端
Node
首先很容易上手,能夠很好的適應原型和敏捷的開發工做Node
重構了一個原來基於Java和Spring的應用,而後他們發現比起用Spring,開發速度快了一倍並只用更少的人,而且減小了三分之一的代碼,並且減小了四成的文件,更重要的是他們實現了每秒服務效率的翻倍,同時使響應時間減小了35%,因此Node
是用於構建高可擴展性應用的不二選擇Node
應用是用JavaScript
編寫的,因此若是你是熟悉JavaScript
的前端開發者,你就能夠複用你的JavaScript
知識,並轉爲一個全棧開發者,並以此走上人生巔峯,你無需學習一門新語言JavaScript
,你的代碼將更簡潔明瞭,你可使用相同的命名規範、工具和最佳實踐Node
是一個運行JavaScript
的環境。瀏覽器
在Node
以前,JavaScript
只能運行在瀏覽器裏,每一個瀏覽器都有咱們所說的JavaScript
引擎,它將JavaScript
代碼轉換爲機器才懂的機器碼。例如,微軟的Edge
瀏覽器使用的引擎是查克
拉,FireFox
的引擎是SpiderMonkey
,Chrome
的引擎是V8
。bash
就是由於引擎是有幾種,因此JavaScript
的行爲可能在瀏覽器之間會有不一樣。網絡
瀏覽器提供了一個JavaScript
代碼的運行環境,好比,如你所知在瀏覽器是有window
或document
對象的,這些對象容許咱們操做代碼的運行環境,直到2009年,瀏覽器是運行JavaScript
的惟一途徑。架構
2009年,Node
的做者Ryan Dahl
他想若是能在瀏覽器外運行JavaScript
將是極好的,因此他抽取了當時最快的引擎,也就是Google
的V8
,並用C++
編寫了一個程序封裝起來後取名爲Node
,與瀏覽器相似,Node
也是一個JavaScript
的運行環境,它包含了一個能夠運行JavaScript
代碼的引擎,可是它也包括一些用來提供環境的對象,這些對象與在瀏覽器中的對象不一樣,比方說Node
裏沒有document
對象,相反它有另外一個對象提供了不少有趣的能力,好比說咱們能夠操做文件系統,或者列出對給定端口的請求,這些咱們在瀏覽器作不到,因此Node
是一個包含JavaScript
引擎的程序,並提供給咱們一些瀏覽器沒有的新特性,咱們能夠處理文件系統或者網絡請求等等。
Node
它不是語言,它不是框架,它是一個用來運行JavaScript代碼的運行環境。
Node
的高可擴展性是由於Node
的無阻塞或者異步的特性。
舉個例子,你去餐廳,服務員過來給你下單並給到廚房,而後服務員就去服務其餘客人,並等待大廚作好菜,因此同一個服務員能夠服務不少張桌子,他在服務其餘客人以前不用等着大廚作菜,這就是咱們所說的無阻塞或者異步的設計思路。
這就是Node
應用的工做方式。
服務員就好像等待需求的進程,因此一個進程能夠服務多個需求,對比無阻塞或者異步工做方式,咱們還有阻塞或者同步的設計。
想象你去另外一個餐廳,一個服務員過來點單,他下好單並給到了廚房,而後他就坐在廚房裏,等大廚給你作好菜,這段時間他什麼都不作,只是等着,他在給你送到餐以前不會去給其餘客人下單,這就是咱們所說的阻塞或者同步的設計方式。
這就是什麼有些框架如C#
或者Rails
就很慢,當咱們的服務收到一個請求,一個進程就被分配去處理這個請求,做爲處理這個請求的一部分,就好像咱們去查詢數據庫,如你所知,有時候咱們須要等待它給咱們結果,當數據庫執行着一個查詢,那個進程就在那裏等待,它不能用於服務另外一個客戶端,這樣就須要一個新的進程來服務這個客戶端,想象一下,若是咱們有很是多的客戶端,有時候咱們須要開啓全部進程來響應請求,這樣新的請求就要等待直到有進程空閒,若是它不想等,咱們就須要增長新的硬件了,當使用這種架構的時候,你沒辦法作到物盡其用,這就是阻塞或者同步結構的弊端。就像asp.net
開發的程序默認就是這個模式。
做爲比較,Node
默認就是以異步方式工做,你無需作任何額外工做,Node
中一個進程能夠服務全部請求,當請求來,這個進程就去響應,若是這時須要查詢數據庫,這個進程不會去等到數據庫返回結果,當數據庫正在執行查詢的時候,這個進程就被指派去服務另外一個客戶端,當數據庫準備好結果了,它會給咱們說的事件隊列推一個消息,Node
持續在後臺監聽這個隊列,當它發現隊列中有事件,它就去取出事件並處理,這種特性使得Node
成爲構建桌面與網絡鏈接的理想工具,咱們不用投入不少硬件就能夠服務衆多用戶,這就是爲何Node
具備高可擴展性的特色。
一樣,Node
不適用於密集運算型的應用,好比視頻渲染或者圖片操做服務,這種類型的應用須要CPU完成大量運算,須要操做文件和網絡的極少,由於Node
應用是單線程的,當要給一個用戶提供運算,其餘的用戶就要等待,這就是爲什麼Node
不能應用於密集運算,它只適用建立數據密集型或者實時響應的應用,
查看電腦是否安裝了Node
,打開CMD
,輸入
node --version
複製代碼
若是沒有安裝,打開官網nodejs.org
,你能夠看到有兩個選項,咱們選擇安裝LTS
這個穩定的版本便可。
打開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++
程序,抽離了Chrome
的V8
引擎,因此這個app.js
文件傳給Node
,Node
會把它傳給V8
來執行。
能夠看到在CMD
輸出了Hello Mosh
。
接下來咱們打印一下window
對象,看看會發生什麼,咱們在app.js
輸入
console.log(window)
複製代碼
而後回到CMD
,再次執行node app.js
,能夠看到CMD
報了一個錯誤:window is not defined
。
這是由於Node
中沒有window
或者document
對象,這些是在瀏覽器做爲運行環境纔有的東西,在Node
中有另外一個對象來操做文件、使用操做系統或者網絡等等,後面咱們會學習到的。
感謝您的閱讀,但願對你有所幫助。因爲本人水平有限,若是文中有描述不當的地方,煩請指正,很是感謝。
歡迎你們關注個人公衆號前端幫幫忙
。
Node的模塊系統