初學node.js

 什麼是Node.js?css

它是一個專一於實現高性能Web服務器優化的專家,幾經探索,幾經挫折後,遇到V8而誕生的項目。Node.js是一個讓JavaScript運行在服務器端的開發平臺,它讓JavaScript的觸角伸到了服務器端,能夠與PHP、JSP、Python、Ruby分庭抗禮。但Node彷佛有點不一樣:Node.js不是一種獨立的語言,與PHP、JSP、Python、Perl、Ruby的「既是語言,也是平臺」不一樣,Node.js的使用JavaScript進行編程,運行在JavaScript引擎上(V8)。與PHP、JSP等相比(PHP、JSP、.net都須要運行在服務器程序上,Apache、Naginx、Tomcat、IIS。),Node.js跳過了Apache、Naginx、IIS等HTTP服務器,它本身不用建設在任何服務器軟件之上。Node.js的許多設計理念與經典架構(LAMP = Linux + Apache + MySQL + PHP)有着很大的不一樣,能夠提供強大的伸縮能力。Node.js沒有web容器。Node.js自身哲學,是花最小的硬件成本,追求更高的併發,更高的處理性能。html

 

學習Node.js須要瞭解:node

單線程:在Java、PHP或者.net等服務器端語言中,會爲每個客戶端鏈接建立一個新的線程,而每一個線程須要耗費大約2MB內存,理論上一個8GB內存的服務器能夠同時鏈接的最大用戶數爲4000個左右。要讓Web應用程序支持更多的用戶,就須要增長服務器的數量,而Web應用程序的硬件成本固然就上升了。Node.js不爲每一個客戶鏈接建立一個新的線程,而僅僅使用一個線程。當有用戶鏈接了,就觸發一個內部事件,經過非阻塞I/O、事件驅動機制,讓Node.js程序宏觀上也是並行的。使用Node.js,一個8GB內存的服務器,能夠同時處理超過4萬用戶的鏈接。另外,單線程的帶來的好處,還有操做系統徹底再也不有線程建立、銷燬的時間開銷。程序員

非阻塞I/O:由於CPU的效率是遠遠高於I/O設備的執行效率的,若是讓CPU去等待I/O的執行,將會極大地浪費時間,下降性能,好比在訪問數據庫或者讀文件的時候,在傳統的單線程處理機制中,在執行了訪問數據庫或文件代碼以後,整個線程都將暫停下來(阻塞I/O),等待數據庫或者文件系統返回結果才能執行後面的代碼。I/O阻塞了代碼的執行極大地下降了程序的執行效率。因爲Node.js中採用了非阻塞型I/O機制,所以在執行了訪問數據庫或文件的代碼以後,將當即轉而執行其餘代碼,把返回結果的處理代碼放在回調函數中,從而提升了程序的執行效率。當某個I/O執行完畢時,將以事件的形式通知執行I/O操做的線程,線程執行這個事件的回調函數。爲了處理異步I/O,線程必須有事件循環,不斷的檢查有沒有未處理的事件,依次予以處理。阻塞模式下,一個線程只能處理一項任務,要想提升吞吐量必須經過多線程。而非阻塞模式下,一個線程永遠在執行計算操做,這個線程的CPU核心利用率永遠是100%。因此,這是一種特別有哲理的解決方案:與其人多,可是好多人閒着;還不如一我的玩命,往死裏幹活兒。web

事件驅動:在Node中,客戶端請求創建鏈接,提交數據等行爲,會觸發相應的事件。在Node中,在一個時刻,只能執行一個事件回調函數,可是在執行一個事件回調函數的中途,能夠轉而處理其餘事件,而後返回繼續執行原事件的回調函數,這種處理機制,稱爲「事件環」機制。Node.js底層是C++(V8也是C++寫的),底層代碼中,近半數都用於事件隊列、回調函數隊列的構建。數據庫

優缺點:由於單線程,在處理大規模併發的任務中仍是會顯得力不從心的,好比在CPU密集型事務中就會遇到瓶頸,另外就是node.js是沒有web容器的,代碼直接沒有根目錄的說法,在必定程度上爲程序員增長了代碼量,但也提升了靈活性,爲高級路由帶來了極大的方便,在node.js中回調函數會有很深的層次,爲代碼的閱讀多多少少形成了必定的障礙。善於處理異步事件(callback),處理同步事務中須要額外的負擔。編程

適用範圍:當應用程序須要處理大量併發的I/O,而在向客戶端發出響應以前,應用程序內部並不須要進行很是複雜的處理的時候,Node.js很是適合。Node.js也很是適合與web socket配合,開發長鏈接的實時交互應用程序。好比:用戶表單收集、考試系統、聊天室、圖文直播、提供JSON的API(爲前臺Angular使用)。服務器

 

應用舉例:多線程

 1 //require表示引包,引包就是引用本身的一個特殊功能
 2 var http = require("http");
 3 var fs = require("fs");
 4 
 5 //建立服務器,參數是一個回調函數,表示若是有請求進來,要作什麼
 6 var server = http.createServer(function(req,res){
 7     if(req.url == "/fang"){
 8         fs.readFile("./test/xixi.html",function(err,data){
 9             //req表示請求,request;  res表示響應,response
10             //設置HTTP頭部,狀態碼是200,文件類型是html,字符集是utf8
11             res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
12             res.end(data);
13         });
14     }else if(req.url == "/yuan"){
15         fs.readFile("./test/haha.html",function(err,data){
16             //req表示請求,request;  res表示響應,response
17             //設置HTTP頭部,狀態碼是200,文件類型是html,字符集是utf8
18             res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
19             res.end(data);
20         });
21     }else if(req.url == "/1.jpg"){
22         fs.readFile("./test/0.jpg",function(err,data){
23             //req表示請求,request;  res表示響應,response
24             //設置HTTP頭部,狀態碼是200,文件類型是html,字符集是utf8
25             res.writeHead(200,{"Content-type":"image/jpg"});
26             res.end(data);
27         });
28     }else if(req.url == "/bbbbbb.css"){
29         fs.readFile("./test/aaaaaa.css",function(err,data){
30             //req表示請求,request;  res表示響應,response
31             //設置HTTP頭部,狀態碼是200,文件類型是html,字符集是utf8
32             res.writeHead(200,{"Content-type":"text/css"});
33             res.end(data);
34         });
35     }else{
36         res.writeHead(404,{"Content-type":"text/html;charset=UTF-8"});
37         res.end("沒有這個頁面呦");
38     }
39 });
40 
41 //運行服務器,監聽3000端口(端口號能夠任改)
42 server.listen(3000);
View Code

上面的代碼就是說明這樣的一種狀況,當用戶輸入了URL以後進行處理的時候,node.js能夠對URL進行解析而且按照本身設定好的路徑來根據相應的字段找到多是有着好幾個文件夾下的一個文件,這個文件的文件名可能與url中的字段徹底不一樣,也就是說能夠把字段看作一個地址(指針),指向相應的文件所在的物理位置!架構

if(req.url == "/fang"){
        fs.readFile("./test/xixi.html",function(err,data){
            //req表示請求,request;  res表示響應,response
            //設置HTTP頭部,狀態碼是200,文件類型是html,字符集是utf8
            res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
            res.end(data);
        });
}
View Code

 好比上面的代碼,明明URL是IP+/fang,但是在返回數據的時候將當前目錄下的test文件夾下的xixi.html文件做爲返回對象。爲網站的路由設計提供了極大的便利。

相關文章
相關標籤/搜索