【第一節 Node.js簡介】

1.Node.js是什麼?
  
  Node.js是基於Chrome JavaScript運行時創建的一個平臺,實際上它是對Google Chrome V8引擎進行了封裝,它主要用於建立快速的、可擴展的網絡應用。Node.js採用事件驅動和非阻塞I/O模型,使其變得輕微和高效,很是適合構建運行在分佈式設備的數據密集型實時應用。
  
  它運行於瀏覽器的Javascript,瀏覽器就是Javascript代碼的解析器,而Node.js則是服務器端JS的代碼解析器,存於服務器端的JS代碼由Node.js來解析和應用。

  

  JS解析器只是JS代碼運行的一種環境,瀏覽器是JS運行的一種環境,瀏覽器爲JS提供了操做DOM對象和window對象等接口。Node.js也是JS的一種運行環境,node.js爲JS提供操做文件、建立http服務、建立TCP、UDP服務等接口,因此Node.js能夠完成其餘後臺語言能完成的工做。html

  總結:Node.js是一個讓JavaScript運行在服務端的開發平臺。
 
2.Node.js能作什麼?   
  • 之前JavaScript並不涉及什麼邏輯代碼,可是node的出現使得JavaScript能作一些負責的邏輯代碼
  • JavaScript爲客戶端而生,node爲網絡而生
  • 異步方式,適合開發大的應用
       具備複雜邏輯的網站
       基於社交網絡的大Web的應用
       Web Socket服務器
       TCP/UDP套接字應用程序
       命令行工具
       交互式終端程序
       ...

3.Node.js爲何會出現?java

  之前是沒有人會想到用JavaScript做爲本身的web server 這是由於什麼呢?由於JavaScript是比較慢和亂 node


  - V8引擎解決了JavaScript慢的問題 
  - commonjs解決了亂的問題 
  - Node的特性是事件驅動 
  - 爲了彌補JavaScript在服務器端的空白web

  因此,Node.js的產生因素:數據庫

        V8(一個字就是快)
        javaScript在服務器端空白
        事件驅動
        CommonJs的規範化

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與事件驅動

    Node.js最大的特性就是採用異步式I/O與事件驅動的架構設計。對於高併發的解決方案,傳統的架構是多線程模型,也就是爲每一個業務邏輯提供一個系統線程,經過系統線程切換來彌補同步式I/O調用時的時間開銷。Node.js使用的單線程模型,在執行的過程當中會維護一個事件隊列,程序在執行時在進入時間循環等待下一個事件到來。
普通:res=db.query("select * from user")
            res.output();
        
Node.js: res=db.query("select * from user",function(res){
          res.output();
     })
    

 

  傳統的實現方法的代碼執行到第一行的時候,線程就會阻塞,等待數據庫返回結果,而後再繼續處理。因爲數據庫的操做可能涉及磁盤讀寫和網絡通訊,其延時可能向當長。對於高併發的訪問,一方面線程長時間 阻塞等待返回結果,另外一方面爲了應付新需求不斷增長線程,所以浪費大量系統資源,同時線程也會佔用大量的CPU來處理上下文切換,並且還容易遭受低速連接的攻擊。 
  Node.js處理方法中第二個參數爲一個回調函數,進程執行到db.query時,不會等待數據庫返回結果,而是直接執行後面的語句,直到進入事件循環。當數據庫返回查詢結果時,會將事件發送到事件隊列,等到線程進入事件循環後,纔會調用函數執行後面的邏輯。

  程序會自動往下執行。
 
7.瀏覽器引擎革命
 
    Google Chrome的引擎是V8。Node.js 的是引擎引用的就是V8。因此它快,爲何ExtJs在Chrome如此的快,就由於如此。
 
8.部署node.js的環境
 
    Node.js官方:http:/nodejs.org  下載安裝包。安裝後。打開cmd的dos窗口
    運行node
            console.log("success")
 
9.Node.js的優勢:

  ⑴不須要放在 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();

                })

             });

           });

相關文章
相關標籤/搜索