首頁 >web前端 >js教程 >Node.js的新手教學(一)

Node.js的新手教學(一)

php中世界最好的语言
php中世界最好的语言原創
2018-03-12 17:17:001815瀏覽

這次帶給大家Node.js的新手教學,使用Node.js的新手教學注意事項有哪些,下面就是實戰案例,一起來看一下。

主線:Node.js是什麼--> Node.js的組成--> Node.js的特色--> Helloworld範例--> 模組--> 核心模組-- >本地模組--> 套件--> 套件管理器--> 非阻塞、單線程、事件驅動--> 回呼函數--> Node的應用

Node是什麼東西呢?首先看他的名字,Node.js,初看起來的話有的人以為這個玩意有可能是像jQuery一樣,也是一個庫、框架,但其實不是的,Node.js是一個讓JavaScript運行在服務端的平台,或者說Node.js是一個可以讓JavaScript運行在非瀏覽器環境下的工具,Node.js採用的是號稱是世界上最快的chrome v8引擎,是由二部分組成的,由Core JavaScript和Node Standard Library組成的,Core JavaScript其實說白的指的就是ECMAScript,也就是說只包含了我們在瀏覽器端的js腳本中的ECMAScript,排除了我們文檔對像模型,也就是DOM,還有瀏覽器對像模型,也就是BOM,有的人以為Node是不是有相容性問題? Node是沒有相容性問題的,因為我們學過客戶端瀏覽器的js腳本也應該明白其實我們常說的js的兼容性問題指的其實就是我們的DOM和BOM方面的兼容性問題,那什麼是Node Standard Library,這個就類似我們C標準函式庫,或是C++的標準擴充函式庫的玩意,Node.js的特色就是非阻塞非同步事件驅動,Node.js讓我們的JavaScript嘩身於我們的腳本世界的第一等公民,我們先來看第一個例子,helloworld,這個helloworld看起來比其他的語言好像更複雜?不過我們可以看看這6行程式碼實現的功能,它實作了一個簡單的伺服器,Node.js的支柱之一就是模組,所以我們首先要學習的就是模組,那麼什麼是模組呢?模組其實就是一個js的文件,在我們的客戶端瀏覽器中,我們想要實作一個css文件嵌入引入另一個css文件,我們可以使用@import指令,但是在我們js中,如果要想引入另一個js,就不是那麼容易了,當然了也不可以實現,我們可以透過createElement,創建一個script標籤,然後appendChild到我們的html當中就可以實現了,但是不管怎麼樣,實現起來其實不是那麼容易的,我們的Node一解決掉了這個問題,我們的Node裡面,直接一個js文件就是一個模組,我們創建好二個js文件,那我們怎麼才能在一個js文件中引入另外一個js文件呢?我們可以透過一個叫require的函數來引入就可以了,我們可以把每一個模組當成一個更大的對象,他們最終都會暴露出來一些屬性和方法的,我們是透過一個叫exports,或者module.exports來暴露出來屬性和方法的,模組分為二種類型,一種是核心模組,常見的核心模組有http模組、os模組也就是作業系統相關的模組、fs模組也就是file system模組處理與檔案操作相關的東西、util模組工具類的東西,另外一種就是本地模組,所謂的本地模組就是我們可以自己來創建一個自己的模組,與模組相比更大的一個單元就是包,什麼是包呢?我們可以想一下,我們可以把一個模組想成我們的一個文件,我們可以把包想像成一個文件夾,也就是說我們可以用一個文件夾把一堆的類似的功能的文件放在一起打包,說到包,我們一般的除了自己創建的包以外,更重要的其實是一些第三方的包,在npm.org這個網站上,有大量的差不多有幾萬個別人實現好的第三方的包供我們要吧用,具體是怎麼使用呢?我們的Node為了方便我們使用第三方的包,就開發了一個工具就包管理工具,也就是我們的npm,我們可以簡單的來看一下這個東西是怎麼用的,我們安裝有二種方式,一種是全域安裝,一種是本地安裝,這個和其他語言可能不是一模一樣的,比如像python,ruby,全域安裝的包一般適用於命令列操作的,比如像我們lessc,另外一種本地的包一般的用於我們目前要做的一些專案裡面,當然了,如果只是有這些東西的話,那Node.js是沒啥大的特點的,因為這些東西其實在其他語言裡像python,ruby裡面早就有了,Node.js最大的特色其實是異步非阻塞和事件程式模組,這個應該是完全顛覆性設計,和其他的語言有很大的差別,例如下面是二個例子,希望大家能看懂這個例子,假設我們實現的是同步的IO,我們要查詢的是SQL語句,通常我們會寫出下面這樣的程式碼,比如說python,比如php,都是這樣的形式,就是說先用db.query然後一個SQL查詢,就會有阻塞等待資料庫把結果回傳以後儲存到一個res的變數當中,但是下面這個才是Node的真正的寫法,這個是用了異步IO的方式,可以看出,其實這一條語句,其實這是一條語句,他是產生了這樣一個SQL查詢,並且在第二個參數中放了一個函數,這個函數被稱為回呼函數,也就是說這條語句執行完以後,並不會直接執行res.auto,他會繼續向後執行,等到什麼時候會執行裡面的內容呢?等到我這個資料庫把訊息回傳了,然後再透過事件循環,進入回呼函數,再把查詢的結果印出來,這是異步IO的模式,然後再解釋一下什麼是同步,什麼是異步,程式在執行IO操作的時候可能要花費很長的時間,可能會長達數十萬或數億多的指令周期,但是你執行一次javascript語句可能只需要花費幾百或上千個指令周期,當然也許經過優化之後可能只需要幾十個,所以說遇到IO之後是非常浪費時間的,作業系統和CPU是透過中斷的方式來實現非同步的調度方法,也就是說當進程發起IO請求時,作業系統會掛起當前進程,然後將CPU的控制權讓給其他部分的進程,當IO完成以後,操作系統才會使原來的進程恢復繼續執行,同時你就可以訪問剛才IO操作的結果,這個請求的方式我們稱之為同步IO,或是阻塞式IO,但是在Node中IO的模式我們使用的是異步的IO,或者叫非阻塞IO,這個指的是當進程發起IO請求之後,就立刻返回並繼續執行其他的指令,然後透過其他的手段來通知IO已經操作完成了,接下來再來處理IO操作完成以後的邏輯代碼,然後當非阻塞IO發起的時候呢,進程不會進入阻塞狀態,而是繼續執行事件的其他部分,然後進入事件循環處理其他事件,這裡面提到了一個事件和事件循環的概念,在Node中所有的計算邏輯操作都會被抽象成一個事件,然後整個程式就是一個事件循環,事件循環會不斷的處理一個叫事件隊列的東西,是說我最開始的時候有一個事件,然後執行的過程中可能會發起一些請求,比如說IO請求,IO請求完成以後,會在事件隊列中加入事件隊列,等待進程以後進入事件循環之後進行處理,這是基於事件循環的處理模式,這種基於事件驅動的模式其實也是一種很經典非常常用的模式,比如qt,gtk,比如說滑鼠點擊是一個事件,比如說timer也是一個事件,事件的話就少不了有回呼函數,所謂的回呼函數指的是當我們的事件發生以後,然後Node為什麼要使用這種晦澀難懂的程式模式呢?其實這是Node另外一個非常特殊的策略,它使用了單線程模式,我們先來說一下阻塞模式的並發模型,比如說我們要開發一個web伺服器,當然是要有並發要求的,可以讓多個用戶同時訪問,不是說我處理完一個用戶的請求再處理第二個用戶的請求就完了,這樣的話當用戶一多起來,處理的速度就會非常的慢,當一個用戶非常慢並且不斷開連接的時候,其他的用戶就會一直在等待,這樣是不合理的,在阻塞模式下要想實現並發必須使用多線程,就是一個進程只能處理一項任務,我們要想提高CPU的吞吐量,必須要使用的是多線程,要使用可能比CPU核數量多得多的線程,這個要多多少呢,這個是不可預測的,比如說我們的一個邏輯,他要先計算一部分,然後再發起一個IO請求,比如說讀一個文件或寫一個文件,或者說發起一個網路請求,接下來進入我們第二個計算的部分,要想實現並發,我們可以使用多線程的模式,它的執行可能會是一個這樣的,假設我們是單一CPU,那麼就是首先第一個線程搶佔了CPU進行計算,然後他到了IO請求階段,進入阻塞了,這時候CPU的控制權就會被出讓出來了,然後這時候第二個線程就會搶佔了CPU,然後進入IO,又堵塞了,然後再釋放出cpu的控制權,線程3、線程4、線程5這樣,然後中間可能會有一段空閒時間,然後等線程1的IO結束了,然後他發現CPU沒有被佔用,它就會去使用CPU進入計算,這樣的基於計算和IO的並發搶佔式模式,但是在非阻塞模型下,它的模型會是這樣的,一個單線程的,計算1會發起一個非同步的IO請求,這時候會直接再進入另一個運算1,可能會是另一個用戶發起的運算1,然後發起第二個請求,然後等5個用戶可能都發起完了,這時候正好第一個用戶的計算結束了,然後我們這個事件循環就是單線程就會執行第一個用戶發起的IO請求,我們在非阻塞模式下進程對CPU的利用從理論上來說是百分之百,這是理想情況下,單一線程就可以達到最大吞吐量,不需要多個線程,然後什麼時候需要多線程呢?是我們有多核的時候,比如說我們有2個核我們就開2個線程,然後非阻塞比阻塞好在哪裡呢?多執行緒聽起來很快,但其實沒那麼快,因為要進行切換,時間片切分會非常小的,每20ms切換一次站,對CPU快取的利用率是非常不高效的,非阻塞也不是非常好的,會容易引起回調地獄,先讀取第一個文件,然後再讀取第二個文件,這是一個mongoDB的操作。 Node基本上我就介紹到這裡,說了半天Node,Node到底有啥應用呢?首先,Node有許多第三方模組,比如說我們要做一個web做一個網站,可以使用express這個框架,然後生成html可以使用一個叫jade的模板引擎,生成css有less和stylus,用於壓縮javascript有uglify,使用websocket有socket.io,SQL資料庫有ORM,oAuth,守護進程,命令列解析,語法分析,包括,還有Node.js其實雖然和DOM沒有關係,但其實也可以處理,文件上傳,語法高亮,解析markdown,編碼轉換影像處理,輕量級線程和協程,coffeescript,瀏覽器端的一些靜態分析,謝謝大家,今天我對Node.js的介紹就到這裡。

我相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

Node.js程式碼的執行原理

angularjs中$apply()的使用詳解

以上是Node.js的新手教學(一)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn