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