Node要領

Node是什麼

Node是一個JavaScript運行平臺。特徵:異步和事件驅動機制,還有它的標準庫。node

Node的動力源來自V8 JavaScript引擎,是由服務於Google ChromeChromium項目組開發的。c++

V8負責JavaScript代碼的解釋和執行。用c++綁定層可將libuvv8結合起來。es6

node包含v8特性:shipping,staged,in progress三組。web

npm要求Node項目所在的目錄下有一個package.json文件。建立package.json文件的最簡單方法使用npmajax

node程序主要分:數據庫

  1. web應用程序
  2. 命令行工具
  3. 後臺程序
  4. 桌面程序
web應用程序:提供單頁應用的簡單程序,rest微服務和全棧的 web應用。
mkdir example-project
cd example-project
npm init -y

核心模塊:express

node的核心模塊就至關於其餘語言的標準庫,它們是編寫服務器端JavaScript所需的工具。npm

事件模塊是一個處理事件的小型庫,node的大多數api都是以它爲基礎來作的。編程

node有文件系統庫,fs,pathtcp客戶端和服務端庫nethttp庫,域名解析庫dns,測試的斷言庫assert,查詢平臺信息的操做系統庫osjson

異步I/O

發起一個Ajax請求:

$.post('/url',{title: 'web'}, function(data){
    console.log('收到響應了');
});

console.log('發送ajax結束');
收到響應是在發送ajax結束以後輸出的。

Ajax經過post請求發送ajax請求到服務器,服務器進行處理請求,而後返回響應數據到執行回調。

讀取文件:

var fs = require('fs');

fs.readFile('/path',function(err,file){
    console.log('讀取文件完成')
});

console.log('發起讀取文件');

readFile()經過fs.readFile()異步調用node處理請求,而後返回數據到執行回調。

兩個文件讀取任務的耗時取決於最慢的那個文件讀取的耗時:

fs.readFile('/path1', function(err,file){
    console.log('讀取文件1完成');
});

fs.readFile('/path2',function(err, file){
    console.log('讀取文件2完成');
});

使用核心模塊和流

const fs = require('fs');
const zlib = require('zlib');
const gzip = zlib.createGzip();
const outStream = fs.createWriteStream('output.js.gz');

fs.createReadStream('./node-stream.js')
.pipe(gzip)
.pipe(outStream)

對於同步而言,它們的耗時是兩個任務的耗時之和。

非阻塞I/O

非阻塞I/O是底層術語,表示你的程序能夠在作其餘事件時發起一個請求來獲取網絡資源,而後當網絡操做完成時,將會運行一個回調函數來處理這個操做的結果。

一個典型的Node Web應用程序,用Web應用庫Express來處理商店的訂單流程。

NodeExpress中含,http路由器,非阻塞網絡I/O,線程等,libuv。

瀏覽器經過發起一個請求,經過非阻塞I/O,傳到應用程序檢查庫存,註冊用戶,發送回執郵件,進行http響應返回到非阻塞網絡I/O,並返回一個JSON HTTP響應給瀏覽器。同時進行發送了一封回執郵件,更新數據庫。

事件與回調函數

Node內置的http服務器庫,即核心模塊http.Server,負責用流,事件,Node的http請求解析器的組合來處理請求。

事件輪詢:三個非阻塞網絡調用:

  1. 用於請求
  2. 用於數據庫
  3. 用於響應
事件輪詢是單向運行的先入先出隊列。

ajax異步提交的服務端處理過程:

var http = require('http');

var querystring = require('querystring');

http.createServer(function(req, res){
    var postData = '';
    req.setEncoding('urf8');
    req.on('data',function(num) {
        postData += num;
    });
    req.on('end',function(){
        res.end(postData);
    });
}).listen(8080);
console.log('服務器啓動完成');

ajax請求綁定了success事件。

$.ajax({
    'url': '/url',
    'method': 'POST',
    'data': {},
    'success': function(data){
        // success事件
    }
});
nodehttphello world

示例:

const http = require('http');
const port = 8080;

const server = http.createServer((req, res) => {
    res.end('hello');
});

server.listen(port,()=>{
    console.log('server');
});

單線程

  1. Node保持了JavaScript在瀏覽器中單線程的特色。
  2. 單線程的缺點是:沒法利用多核cpu;錯誤會引發整個應用退出,應用的健壯性值得考驗。
  3. 大量計算佔用cpu致使沒法繼續調用異步I/O。
  4. Web Workers可以建立工做線程來進行計算,以解決JavaScript大計算阻塞UI渲染的問題。
  5. 工做線程爲了避免阻塞主線程,經過消息傳遞的方式來傳遞運行結果,這也使工做線程不能訪問到主線程中的UI
  6. 子線程的出現,表示Node能夠從容應對單線程在健壯性和沒法利用多核CPU方面問題。

I/O密集型和CPU密集型

  1. Node面向網絡而且擅長並行I/O,可以有效地組織起更多的硬件資源,提供更好的服務。
  2. I/O密集的優點主要在於Node利用事件循環的處理能力,而不是啓動每個線程爲每個請求服務,資源佔用極少。
  3. Node先後端編程語言環境統一;帶來的高性能I/O用於實時應用。
  4. 並行I/O使得使用者能夠高效利用分佈式環境,有效利用穩定接口提高web渲染能力。

prototype對象

類的結構:

function User() {
    // 構造器
}

User.prototype.method = function() {
    // 方法
};

es6

class User {
    constructor(){

    }
    method(){

    }
}
[1,2,3].map(n=>n*2).filter(n=>n>3);

生成器能把異步I/O變成同步編程風格。Koa Web應用庫中用到了生成器。

模板字符串

web應用

this.body = `
<div>
<h1>web</h1>
<p>jeskson</p>
</div>
`;

調試器

  1. node自帶的調式器支持單步執行和REPL,讀取,計算,輸出,循環。
  2. node支持Chrome調試協議。

一個express web應用程序:

mkdir hello_express
cd hello_express
npm init -y
npm i express --save

JavaScript中,函數是一等對象,node由有內建的事件模型,能夠用它來寫異步實時程序比用其餘腳本語言好。

libuv是提供快速,跨平臺,非阻塞I/O的本地庫。

node自帶了一個調試器和一個依賴管理器npm

v8被用做JavaScript運行時。

相關文章
相關標籤/搜索