Node.js是一個(gè)基于ChromeV8引擎的Javascript運(yùn)行環(huán)境鳖眼。Node.js使用了一個(gè)事件驅(qū)動搞挣、非阻塞式IO的模型,使其輕量又高效。Node.js的包管理器npm以政,是全球最大的開源庫生態(tài)系統(tǒng)。簡單來說Node是js的一個(gè)虛擬機(jī)(平臺),能夠解析js代碼,使其運(yùn)行在各個(gè)平臺,這有點(diǎn)類似java的jvm伴找。同時(shí)Node平臺內(nèi)部提供了大量的工具庫,使js能與操作系統(tǒng)進(jìn)行交互,例如讀寫文件盈蛮。
2009年3月,Ryan Dahl在博客宣布創(chuàng)建
2009年5月技矮,Ryan Dahl在GitHub中開源了最初版本抖誉,同年11月的JSConf就安排了Node講座
2010年底,Ryan Dahl加入Joyent全職負(fù)責(zé)Node的發(fā)展
2011年7月衰倦,在微軟的支持下登陸Windows平臺
2012年1月底袒炉,Ryan Dahl將掌門人身份交給NPM的作者lssac Z.Schlueter
2013年7月,發(fā)布穩(wěn)定版v0.10.13
隨后樊零,Node的發(fā)布計(jì)劃主要集中在性能上面我磁,由V0.14后正式發(fā)布了V1.0版本
異步I/O
單線程
事件與回調(diào)函數(shù)
跨平臺
從上面這張圖來看,NodeJS的結(jié)構(gòu)分為3層:
Node standard Libarary(Node.js標(biāo)準(zhǔn)庫),源碼在lib目錄下,是一個(gè)用javascript編寫的庫,里面包含了http,fs,events,buffer等Nodejs提供的核心模塊,
javascript能夠通過Api直接去調(diào)用這些模塊,例如:let fs = require('fs')。
第二層的Node bindings是js與底層溝通的一座橋梁,使其能與底層相互溝通,bindings是一個(gè)又c++實(shí)現(xiàn),源碼在src/node.cc驻襟。
最后一層是node的最底層結(jié)構(gòu)
V8: Google開源的高性能JavaScript引擎,以C++實(shí)現(xiàn)夺艰。這也是集成在Chrome中的JS引擎V8將你寫的JavaScript
代碼編譯為機(jī)器碼然后執(zhí)行。
Libuv: 是一個(gè)用c語言實(shí)現(xiàn)的庫,它為Nodejs提供的跨平臺的操作,在其內(nèi)部提供了事件循環(huán)(Event Loop),線程池,異步I/O等功能沉衣。
C-ares:提供了異步處理DNS相關(guān)的能力郁副。
http_parser、OpenSSL豌习、zlib 等:提供包括http解析存谎、SSL安全協(xié)議、數(shù)據(jù)壓縮等其他的能力斑鸦。
這張圖是把Node作為一個(gè)服務(wù)器來處理所有用戶的接受和響應(yīng)
這張圖是把Node作為一個(gè)中間服務(wù)器來用,主要是進(jìn)行分發(fā)等工作,具體步驟是Node來接受客戶端傳來的信息,然后把事件交托給傳統(tǒng)java等服務(wù)器來處理,處理完后返回給node服務(wù)器,然后響應(yīng)給客戶端