一、介紹
Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境,是一個(gè)讓 JavaScript 運(yùn)行在服務(wù)端的開發(fā)平臺(tái),它讓 JavaScript 成為與PHP、Python、Perl、Ruby 等服務(wù)端語(yǔ)言平起平坐的腳本語(yǔ)言。
JavaScript一種直譯式腳本語(yǔ)言,是一種動(dòng)態(tài)類型、弱類型、基于原型的語(yǔ)言。它是一種高級(jí)的、解釋型的編程語(yǔ)言;它是一門基于原型、函數(shù)先行的語(yǔ)言,是一門多范式的語(yǔ)言,它支持面向?qū)ο缶幊蹋钍骄幊?,以及函?shù)式編程。傳統(tǒng)的js是運(yùn)行在瀏覽器上的,因?yàn)闉g覽器內(nèi)核分為兩個(gè)部分:
1.渲染引擎—渲染HTML和CSS
2.JavaScript 引擎—負(fù)責(zé)運(yùn)行 JavaScript
如果要執(zhí)行JavaScript代碼,需要一個(gè)js引擎,你可以安裝一個(gè)瀏覽器(內(nèi)置js引擎),或nodejs環(huán)境(內(nèi)置js引擎),如果你在js代碼中調(diào)用了瀏覽器提供的API,則必須安裝一個(gè)瀏覽器,若調(diào)用了nodejs API,則必須安裝nodejs環(huán)境,然后以各自規(guī)定的方式加載、執(zhí)行JavaScript代碼。
二、Node.js的歷史
2008年左右,隨著 AJAX 的逐漸普及,Web 開發(fā)逐漸走向復(fù)雜化,系統(tǒng)化;
2009年2月,Ryan Dahl 想要?jiǎng)?chuàng)建一個(gè)輕量級(jí),適應(yīng)現(xiàn)代 Web 開發(fā)的平臺(tái);
2009年5月,Ryan Dahl 在 GitHub 中開源了最初版本,同年11月,JSConf 就安排了 Node 講座;
2010年底,Joyent 公司資助,Ryan Dahl 也加入了該公司,專門負(fù)責(zé) Node 的開發(fā);
2011年7月,在微軟的支持下登陸 Windows 平臺(tái)。PS:node 的生產(chǎn)環(huán)境基本是在 Linux 下。
據(jù) Node.js 創(chuàng)始人 Ryan Dahl 回憶,他最初希望采用 Ruby,但是 Ruby 的虛擬機(jī)效率不行。
注意:是 Node 選擇了 JavaScript,不是 JavaScript 發(fā)展出來(lái)了一個(gè) Node。
NodeJS的作者說(shuō),他創(chuàng)造NodeJS的目的是為了實(shí)現(xiàn)高性能Web服務(wù)器,他首先看重的是事件機(jī)制和異步IO模型的優(yōu)越性,而不是JS。但是他需要選擇一種編程語(yǔ)言實(shí)現(xiàn)他的想法,這種編程語(yǔ)言不能自帶IO功能,并且需要能良好支持事件機(jī)制。JS沒(méi)有自帶IO功能,天生就用于處理瀏覽器中的DOM事件,并且擁有一大群程序員,因此就成為了天然的選擇。
如他所愿,NodeJS在服務(wù)端活躍起來(lái),出現(xiàn)了大批基于NodeJS的Web服務(wù)。而另一方面,NodeJS讓前端眾如獲神器,終于可以讓自己的能力覆蓋范圍跳出瀏覽器窗口,更大批的前端工具如雨后春筍。
因此,對(duì)于前端而言,雖然不是人人都要拿NodeJS寫一個(gè)服務(wù)器程序,但簡(jiǎn)單可至使用命令交互模式調(diào)試JS代碼片段,復(fù)雜可至編寫工具提升工作效率。
三、Node.js與js的區(qū)別
1、node.js是平臺(tái),Js是編程語(yǔ)言;
2、js是客戶端編程語(yǔ)言,需要瀏覽器的JavaScript解釋器進(jìn)行解釋執(zhí)行;
3、node.js是一個(gè)基于Chrome JavaScript運(yùn)行時(shí)建立的平臺(tái),它是對(duì)Google V8引擎進(jìn)行了封裝的運(yùn)行環(huán)境;
4、node.js就是把瀏覽器的解釋器封裝起來(lái)作為服務(wù)器運(yùn)行平臺(tái),用類似JavaScript的結(jié)構(gòu)語(yǔ)法進(jìn)行編程,在node.js上運(yùn)行。
5、node.js與js組成不同
JavaScript:
1.ECMAScript(語(yǔ)言基礎(chǔ),如:語(yǔ)法、數(shù)據(jù)類型結(jié)構(gòu)以及一些內(nèi)置對(duì)象)
2.DOM(一些操作頁(yè)面元素的方法)
3.BOM(一些操作瀏覽器的方法)
Node.js:
1.ECMAScript(語(yǔ)言基礎(chǔ),如:語(yǔ)法、數(shù)據(jù)類型結(jié)構(gòu)以及一些內(nèi)置對(duì)象)
2.OS(操作系統(tǒng))
3.file(文件系統(tǒng))
4.net(網(wǎng)絡(luò)系統(tǒng))
5.database(數(shù)據(jù)庫(kù))
6、頂層對(duì)象不同
在JS中的頂層對(duì)象是window對(duì)象,但是在node中沒(méi)有什么window對(duì)象,node中的頂層對(duì)象是global對(duì)象。這就是二者的差異性。
在window對(duì)象中,定義一個(gè)全局變量是可以通過(guò)Window來(lái)訪問(wèn)的,但是在node中是不能通過(guò)global對(duì)象來(lái)訪問(wèn)的
優(yōu)缺點(diǎn):
1.原生js運(yùn)行文件依賴于瀏覽器;
2.nodejs運(yùn)行文件的時(shí)候服務(wù)為終端;
3.原生js有兼容性問(wèn)題,nodejs不存在兼容性問(wèn)題;
4.nodejs可以進(jìn)行本地的讀寫,服務(wù)器搭建,連接數(shù)據(jù)庫(kù)等,而原生js無(wú)法做到。
(1)使用node開發(fā)還可以使用node自有配套的npm包管理工具:
npm是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問(wèn)題,常見的使用場(chǎng)景有以下幾種:允許用戶從npm服務(wù)器下載別人編寫的第三方包到本地使用。允許用戶從npm服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。允許用戶將自己編寫的包或命令行程序上傳到npm服務(wù)器供別人使用。Node.js 的使用包管理器 npm來(lái)管理所有模塊的安裝、配置、刪除等操作,使用起來(lái)非常方便。
(2)node本身就是一個(gè)服務(wù)端的框架,對(duì)于一些簡(jiǎn)單的項(xiàng)目,我們可以不需要后端配合,直接用node進(jìn)行數(shù)據(jù)庫(kù)的增刪改查(但是我們一般不使用這個(gè)功能);
(3)nodejs是一個(gè)服務(wù)js平臺(tái),有自身帶的npm(基于 Node.js的前端項(xiàng)目包管理工具),有第三方的grunt(基于 Node.js的前端項(xiàng)目構(gòu)建工具,即腳手架)、有第三方的express(路由功能)等強(qiáng)大的代碼與項(xiàng)目管理應(yīng)用。還有自身帶的webpack(基于 Node.js的前端項(xiàng)目部署打包工具),v8(谷歌客戶端瀏覽器Javascript引擎)等強(qiáng)大的功能。npm(包管理工具)是基于 Node.js的前端項(xiàng)目包管理工具,是項(xiàng)目中對(duì)各種程序包的依賴管理,傳統(tǒng)的開發(fā)項(xiàng)目主要是后端,現(xiàn)在技術(shù)在更新,前端有了框架的開發(fā)模式管理,也需要用包管理工具的思想去管理,目的是簡(jiǎn)化第三方程序包在項(xiàng)目中引用復(fù)雜化。前端的js包是全世界JavaScript 天才開發(fā)共享的各種代碼模塊,把這些代碼模塊都按照一個(gè)獨(dú)立的軟件功能統(tǒng)一在一個(gè)庫(kù)中,一個(gè)代碼模塊是一個(gè)程序包(package,即代碼模塊)。
四、總結(jié)
就前端來(lái)說(shuō)nodejs具有劃時(shí)代的意義,nodejs不是一個(gè)js框架,千萬(wàn)不要認(rèn)為是類似jquery的框架,nodejs是js運(yùn)行時(shí),運(yùn)行環(huán)境,類比java中jvm,java的開端是什么,無(wú)疑是jvm,自從有了jvm,java才能做到“一次編寫處處運(yùn)行”,不管你是windows還是linux,只要安裝了對(duì)應(yīng)版本的jvm都可以運(yùn)行.class文件。同樣,nodejs的作用和JVM是一樣的,也是js的運(yùn)行環(huán)境,不管是你是什么操作系統(tǒng),只要安裝對(duì)應(yīng)版本的nodejs,那你就可以用js來(lái)開發(fā)后臺(tái)程序。這具有劃時(shí)代的意義,意味著一直以來(lái)只能在瀏覽器上玩來(lái)玩去的JS,可以做后端開發(fā)了,自從有了nodejs后就催生出一大批用js做后臺(tái)開發(fā)的前端人員,這部分人員就是偏前端的“全棧程序員”。nodejs是和jvm同等地位的js運(yùn)行環(huán)境,打開了前端人員走向后端的道路。