簡介
node.js是一個讓js運行在服務(wù)器端的開發(fā)平臺认轨,它不是一種獨立的語言,它是一個js的執(zhí)行環(huán)境别惦。
特點
單線程狈茉、非阻塞I/O、事件驅(qū)動步咪,其實這三個特點說的都是事件循環(huán)论皆。
- 事件循環(huán):js是單線程的,所有任務(wù)都在主線程上執(zhí)行猾漫,形成一個執(zhí)行棧点晴,主線程之外還有一個任務(wù)隊列,系統(tǒng)會把異步任務(wù)還有計時器放到任務(wù)隊列中悯周,然后繼續(xù)執(zhí)行主線程的任務(wù)粒督,直到主線程中任務(wù)都執(zhí)行完了,再將任務(wù)隊列的任務(wù)出隊禽翼,加入到執(zhí)行棧中執(zhí)行屠橄,這種運行機制就是事件循環(huán)。
適用場景
node.js適合大量的并發(fā)I/O闰挡,而不善于大量計算锐墙,也適合websocket等長連接的實時交互程序。
核心API
global
在瀏覽器js中长酗,window是全局對象溪北,而node中的全局對象是global,所有全局變量都是global的屬性。
__filename 指向當(dāng)前運行的腳本文件名
__dirname 當(dāng)前執(zhí)行腳本的所在目錄
process
process是一個全局變量之拨,是global對象的屬性茉继,他用于描述當(dāng)前node進程狀態(tài)的對象。
Process.nextTick(callback):是為事件循環(huán)設(shè)置一項任務(wù)蚀乔,node.js會在下次事件循環(huán)中調(diào)用烁竭。
process.stdout:用來控制標(biāo)準(zhǔn)輸出,就是在命令行窗口向用戶顯示內(nèi)容吉挣,process.stdout.write
等同于console.log派撕。
process.argv:返回命令行腳本的各個參數(shù)組成的數(shù)組。
process.env:指向當(dāng)前shell的環(huán)境變量听想,比如process.env.NODE_ENV腥刹,用來判斷當(dāng)前node環(huán)境變量,一般判斷production還是dev汉买。
child process
child_process模塊用于新建子進程,
exec():方法用于執(zhí)行bash命令佩脊,參數(shù)為要執(zhí)行的shell命令字符串蛙粘。
let exec = require('child_process').exec;
exec('npm run dev',()=>{
// do something
})
events.EventEmitter
EventEmitter的核心就是事件發(fā)射與事件監(jiān)聽器功能的封裝。
let events = require('events');
let emitter = new events.EventEmitter();
//為指定事件注冊一個監(jiān)聽器威彰,事件名和回調(diào)函數(shù)
emitter.on('abcEvent',(a,b)=>{});
emitter.on('abcEvent',(a,b)=>{});
//觸發(fā)所有abcEvent事件出牧,后面是傳遞的參數(shù)
emitter.emit('abcEvent','1','2');
//為指定事件注冊一個單次監(jiān)聽器,即只會觸發(fā)一次
emitter.once('abcEvent','1','2');
util
Util.inspect:類似json.stringify
util.inherits(constructor, superConstructor):是一個實現(xiàn)對象間的原型繼承的函數(shù).
fs
fs模塊是文件操作的封裝歇盼。
var fs = require('fs');
//讀取abc.txt舔痕,該函數(shù)為異步,回調(diào)中的data就是讀取的文件內(nèi)容豹缀,未聲明encoding則為buffer
fs.readFile('abc.txt',(err,data)=>{
console.log(data)
})
//為讀取文件的同步版本
fs.readFileSync()
http
let http = require('http');
http.createServer((req,res)=>{
//do somethings
}).listen(8080,'127.0.0.1');
上面代碼用于創(chuàng)建一個服務(wù)器伯复,監(jiān)聽本機的8080端口。
request():方法用于發(fā)出http請求
http.request(options,callback)
options對象可以設(shè)置如下屬性邢笙。
hostname:http請求所發(fā)往的域名或者ip地址啸如,默認(rèn)是localhost
port:遠(yuǎn)程服務(wù)器的端口,默認(rèn)是80
method:指定http請求的方法氮惯,格式為字符串叮雳,默認(rèn)為get
path:指定http請求的路徑,默認(rèn)路徑(/)妇汗。
PM2
pm2:可以讓用戶跟簡單的部署多進程的node應(yīng)用帘不,且守護進程
// app.js
let http = require('http');
http.createServer((req,res)=>{
res.writeHead(200);
res.end("hello world");
}).listen(8080);
上面代碼是建立一個web服務(wù)器,然后用pm2啟動這段代碼
pm2 start app.js -i 4
啟動服務(wù)器杨箭,并且新建4個worker進程寞焙,如果i的數(shù)值是0,那么當(dāng)前機器有幾個cpu內(nèi)核,pm2就會啟動幾個worker進程棺弊。
如果worker進程由于某種原因掛掉了晶密,會立刻重啟該進程。