Node
是一個JavaScript
運行平臺。特徵:異步和事件驅動機制,還有它的標準庫。node
Node
的動力源來自V8 JavaScript
引擎,是由服務於Google Chrome
的Chromium
項目組開發的。c++
V8
負責JavaScript
代碼的解釋和執行。用c++
綁定層可將libuv
和v8
結合起來。es6
node
包含v8
特性:shipping,staged,in progress
三組。web
npm
要求Node
項目所在的目錄下有一個package.json
文件。建立package.json
文件的最簡單方法使用npm
。ajax
node
程序主要分:數據庫
web應用程序:提供單頁應用的簡單程序,rest微服務和全棧的
web
應用。
mkdir example-project cd example-project npm init -y
核心模塊:express
node
的核心模塊就至關於其餘語言的標準庫,它們是編寫服務器端JavaScript
所需的工具。npm
事件模塊是一個處理事件的小型庫,node
的大多數api
都是以它爲基礎來作的。編程
node
有文件系統庫,fs,path
,tcp
客戶端和服務端庫net
,http
庫,域名解析庫dns
,測試的斷言庫assert
,查詢平臺信息的操做系統庫os
。json
發起一個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是底層術語,表示你的程序能夠在作其餘事件時發起一個請求來獲取網絡資源,而後當網絡操做完成時,將會運行一個回調函數來處理這個操做的結果。
一個典型的Node Web
應用程序,用Web
應用庫Express
來處理商店的訂單流程。
Node
和Express
中含,http
路由器,非阻塞網絡I/O,線程等,libuv。
瀏覽器經過發起一個請求,經過非阻塞I/O,傳到應用程序檢查庫存,註冊用戶,發送回執郵件,進行http
響應返回到非阻塞網絡I/O,並返回一個JSON HTTP
響應給瀏覽器。同時進行發送了一封回執郵件,更新數據庫。
Node
內置的http
服務器庫,即核心模塊http.Server
,負責用流,事件,Node的http
請求解析器的組合來處理請求。
事件輪詢:三個非阻塞網絡調用:
事件輪詢是單向運行的先入先出隊列。
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事件 } });
用node
的http
寫hello world
示例:
const http = require('http'); const port = 8080; const server = http.createServer((req, res) => { res.end('hello'); }); server.listen(port,()=>{ console.log('server'); });
Node
保持了JavaScript
在瀏覽器中單線程的特色。cpu
;錯誤會引發整個應用退出,應用的健壯性值得考驗。cpu
致使沒法繼續調用異步I/O。Web Workers
可以建立工做線程來進行計算,以解決JavaScript
大計算阻塞UI
渲染的問題。UI
。Node
能夠從容應對單線程在健壯性和沒法利用多核CPU
方面問題。Node
面向網絡而且擅長並行I/O,可以有效地組織起更多的硬件資源,提供更好的服務。Node
利用事件循環的處理能力,而不是啓動每個線程爲每個請求服務,資源佔用極少。Node
先後端編程語言環境統一;帶來的高性能I/O用於實時應用。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> `;
node
自帶的調式器支持單步執行和REPL
,讀取,計算,輸出,循環。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
運行時。