JS解析器只是JS代碼運行的一種環境,瀏覽器是JS運行的一種環境,瀏覽器爲JS提供了操做DOM對象和window對象等接口。Node.js也是JS的一種運行環境,node.js爲JS提供操做文件、建立http服務、建立TCP、UDP服務等接口,因此Node.js能夠完成其餘後臺語言能完成的工做。html
總結:Node.js是一個讓JavaScript運行在服務端的開發平臺。3.Node.js爲何會出現?java
之前是沒有人會想到用JavaScript做爲本身的web server 這是由於什麼呢?由於JavaScript是比較慢和亂 node
- V8引擎解決了JavaScript慢的問題
- commonjs解決了亂的問題
- Node的特性是事件驅動
- 爲了彌補JavaScript在服務器端的空白web
因此,Node.js的產生因素:數據庫
4.交互式運行環境:PEPLnpm
Node.js提供了一個交互式運行環境,經過這個環境,能夠當即執行JS代碼,使用方法相似於Chrome瀏覽器中Firebug插件中的Console。編程
在Linux環境進入終端後,輸入"node"進入Node.js的交互式運行環境,Ctrl+d能夠退出此環境。json
查看系統中安裝的Node.js版本:node -v瀏覽器
運行JS文件,eg:node file.js服務器
5.Node.js模塊和包
⑴模塊:
Node.js官方提供了不少模塊,這些模塊分別實現了一種功能,如操做文件模塊fs,構建http服務模塊的http等,每一個模塊都是一個JS文件,固然也能夠本身編寫模塊。
⑵包:
包能夠將多個具備依賴關係的模塊組織在一塊兒,封裝多個模塊,以方便管理。Node.js採用了CommonJS規範,根據CommonJS規範規定,一個JS文件就是 一個模塊,而包是一個文件夾,包內必須包含一個JSON文件,命名package.json。通常狀況下,包內bin文件夾存放二進制文件,包內的lib文件夾存放JS文件,包內的doc文件夾存放文檔,包內的test文件夾存放單元測試。package.json文件中須要有包含的字段及包的使用。
⑶npm包管理工具:
npm是node.js的包管理工具,npm定義了包依賴關係標準,咱們使用npm主要用來下載第三方包和管理本地下載的第三方包。
6.異步式I/O與事件驅動
傳統的實現方法的代碼執行到第一行的時候,線程就會阻塞,等待數據庫返回結果,而後再繼續處理。因爲數據庫的操做可能涉及磁盤讀寫和網絡通訊,其延時可能向當長。對於高併發的訪問,一方面線程長時間 阻塞等待返回結果,另外一方面爲了應付新需求不斷增長線程,所以浪費大量系統資源,同時線程也會佔用大量的CPU來處理上下文切換,並且還容易遭受低速連接的攻擊。
Node.js處理方法中第二個參數爲一個回調函數,進程執行到db.query時,不會等待數據庫返回結果,而是直接執行後面的語句,直到進入事件循環。當數據庫返回查詢結果時,會將事件發送到事件隊列,等到線程進入事件循環後,纔會調用函數執行後面的邏輯。
⑴不須要放在 Nginx / Apache 後,Node.js自己就內置了一個HTTP模塊
NodeJS內建了一個HTTP服務器支持,能夠垂手可得的實現一個網站和服務器的組合,不像PHP、Perl那樣,在使用PHP的時候,必須先搭建一個Apache之類的HTTP服務器,而後經過HTTP服務的模塊加載 CGI調用,才能將PHP腳本的執行結果呈現給用戶。
加載http模塊以後,便可建立一個http服務器:
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello World</p>');
}).listen(8080);
⑵Node.js 能夠更精細的控制 Request 和 Response 的時間和內容
⑶能支持數萬個併發鏈接
⑷採用事件驅動、異步編程,爲網絡服務而設計
10.Node.js的缺點:
⑴可靠性低,不支持故障恢復
當程序有錯誤發生時,整個進程就會結束,須要從新在終端中啓動服務器。這一點在開發中無可厚非,但在產品環境下就是嚴重的問題了,由於一旦用戶訪問時觸發了程序中某個隱含的bug,整個服務器就崩潰了,將沒法繼續爲全部用戶提供服務。在部署Node.js 應用的時候必定要考慮到故障恢復,提升系統的可靠性。 (後面講多線程多進程支持的時候看看怎麼解決的)
⑵單進程,單線程,默認支持單核CPU(支持多進程的方法)
⑶太新了,API還在成熟過程當中
由於異步的緣由, 一些完整的邏輯不可避免的會被分割成不少小塊, 放在不一樣的回調函數裏去執行, 一旦項目巨大的話, 這種開發方式面臨的風險不是一點點。不符合開發者的常規線性思路,每每須要把一個完整的邏輯拆分爲一個個事件,增長了開發和調試難度。
// 傳統代碼 var user = db.user.get('name');
var article = db.article.get(user.id);
var comment = db.comments.get(article.id);
// 異步回調 db.user.get('name', function(err, user){
if(err) trow err; db.article.get(user.id, function(err, article){
if(err) throw err;
db.comments.get(article.id, function(){
if(err) throw err;
// doSomethingWithResults();
})
});
});