日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文主要為您介紹 Node.js 的背景及它能做什么,擅長(zhǎng)什么,不會(huì)涉及到復(fù)雜的代碼層面的知識(shí)講解,如果你覺(jué)得自己很熟悉了,也可以忽略它。

作者簡(jiǎn)介:五月君,Nodejs Developer,熱愛(ài)技術(shù)、喜歡分享的 90 后青年,「Nodejs技術(shù)棧」,Github 開(kāi)源項(xiàng)目 https://www.nodejs.red

文末附上筆者最近整理的 Node.js 技術(shù)棧學(xué)習(xí)指南路線圖 供大家學(xué)習(xí)參考!

背景介紹

Node.js® is a JAVAScript runtime built on Chrome’s V8 JavaScript engine. 這是來(lái)自 Node.js 官網(wǎng) https://nodejs.org/en/ 的一段介紹,翻譯成中文意為 Node.js 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境。這里重點(diǎn)幾個(gè)關(guān)鍵詞 V8、JavaScript 后續(xù)會(huì)講解,從這里可以看出 Node.js 并不是一門(mén)新的編程語(yǔ)言,做為初學(xué)者這點(diǎn)先要弄清楚,它是 JavaScript 的運(yùn)行環(huán)境,更進(jìn)一步的說(shuō)是在服務(wù)端的運(yùn)行環(huán)境,因此這里的編程語(yǔ)言指的是 JavaScript。

時(shí)間回歸到 2009 年,在當(dāng)時(shí) JavaScript 還是一個(gè)跑在瀏覽器環(huán)境里的一門(mén)腳本語(yǔ)言,當(dāng)時(shí)的筆者還是一名高中生,接觸的編程語(yǔ)言是 VB 并不知 JavaScript 為何物,但隨后接觸 JavaScript 之后了解到這之前用它可以寫(xiě)一些瀏覽器腳本,做一些動(dòng)態(tài)特效,主要用于前端頁(yè)面交互。在 2009 這一時(shí)間線之后 Javascript 不只運(yùn)行于瀏覽器,還可以運(yùn)行于服務(wù)端,簡(jiǎn)直打通了前端與后端的任督二脈,當(dāng)然這要?dú)w功于 Node.js 之父 Ryan Dahl。一度認(rèn)為這是很偉大的,在眾多編程語(yǔ)言里,為什么會(huì)選擇 JavaScript 呢?且看下面介紹。

為什么是 JavaScript?

Node.js 使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式 I/O 的模型,使其輕量又高效。這是來(lái)自于 Node.js 的另一個(gè)介紹,關(guān)鍵詞 事件驅(qū)動(dòng)、非阻塞式 I/O 因此,在基于這些條件之下 Node.js 作者 Ryan Dahl 在評(píng)估了 C、Lua、Haskell、Ruby、JavaScript 等語(yǔ)言之后,最終選擇了 JavaScript,為什么呢?

JavaScript 是一個(gè)單線程的語(yǔ)言,單線程的優(yōu)點(diǎn)是不會(huì)像 Java 這些多線程語(yǔ)言在編程時(shí)出現(xiàn)線程同步、線程鎖問(wèn)題同時(shí)也避免了上下文切換帶來(lái)的性能開(kāi)銷(xiāo)問(wèn)題,那么其實(shí)在瀏覽器環(huán)境也只能是單線程,可以想象一下多線程對(duì)同一個(gè) DOM 進(jìn)行操作是什么場(chǎng)景?不是亂套了嗎?那么單線程可能你會(huì)想到的一個(gè)問(wèn)題是,前面一個(gè)執(zhí)行不完,后面不就卡住了嗎?當(dāng)然不能這樣子的,JavaScript 是一種采用了事件驅(qū)動(dòng)、異步回調(diào)的模式,另外 JavaScript 在服務(wù)端不存在什么歷史包袱,在虛擬機(jī)上由于又有了 Chrome V8 的支持,使得 JavaScript 成為了 Node.js 的首選語(yǔ)言。

為什么選擇 JavaScript 作者 Ryan Dahl 應(yīng)該是最有發(fā)言權(quán)的,這里查了一些資料及參考了 深入淺出 Node.js 一書(shū),供大家有個(gè)初步的認(rèn)知。

Node.js 架構(gòu)

Node.js 由 Libuv、Chrome V8、一些核心 API 構(gòu)成,如下圖所示:

Node.js 是什么?我為什么選擇它?

 

以上展示了 Node.js 的構(gòu)成,下面做下簡(jiǎn)單說(shuō)明:

  • Node Standard Library:Node.js 標(biāo)準(zhǔn)庫(kù),對(duì)外提供的 JavaScript 接口,例如模塊 http、buffer、fs、stream 等Node bindings:這里就是 JavaScript 與 C++ 連接的橋梁,對(duì)下層模塊進(jìn)行封裝,向上層提供基礎(chǔ)的 API 接口。V8:google 開(kāi)源的高性能 JavaScript 引擎,使用 C++ 開(kāi)發(fā),并且應(yīng)用于谷歌瀏覽器。如果您感興趣想學(xué)習(xí)更多的 V8 引擎知識(shí),請(qǐng)?jiān)L問(wèn) What is V8?Libuv:是一個(gè)跨平臺(tái)的支持事件驅(qū)動(dòng)的 I/O 庫(kù)。它是使用 C 和 C++ 語(yǔ)言為 Node.js 所開(kāi)發(fā)的,同時(shí)也是 I/O 操作的核心部分,例如讀取文件和 OS 交互。來(lái)自一份 Libuv 的中文教程C-ares:C-ares 是一個(gè)異步 DNS 解析庫(kù)Low-Level Components:提供了 http 解析、OpenSSL、數(shù)據(jù)壓縮(zlib)等功能。

以上只是做一個(gè)初步的認(rèn)知,如果你想深入了解 Node.js 那么多每個(gè)點(diǎn)都是值得你深入研究的。

來(lái)自 stack overflow 的一個(gè)參考:which-is-correct-node-js-architecture

Node.js 特點(diǎn)

在了解了 Node.js 的一些背景及架構(gòu)模型之后,已經(jīng)解決了它來(lái)自哪里?是什么?這個(gè)問(wèn)題,現(xiàn)在我們來(lái)看看能解決什么問(wèn)題?它適合做什么?

在這之前不知道您有沒(méi)有聽(tīng)說(shuō)過(guò),Node.js 很擅長(zhǎng) I/O 密集型任務(wù),應(yīng)對(duì)一些 I/O 密集型的高并發(fā)場(chǎng)景還是很有優(yōu)勢(shì)的,事實(shí)也如此,這也是它的定位:提供一種簡(jiǎn)單安全的方法在 JavaScript 中構(gòu)建高性能和可擴(kuò)展的網(wǎng)絡(luò)應(yīng)用程序。

  • 單線程

Node.js 使用單線程來(lái)運(yùn)行,而不是向 Apache HTTP 之類(lèi)的其它服務(wù)器,每個(gè)請(qǐng)求將生產(chǎn)一個(gè)線程,這種方法避免了 CPU 上下文切換和內(nèi)存中的大量執(zhí)行堆棧,這也是 Nginx 和其它服務(wù)器為解決 “上一個(gè) 10 年,著名的 C10K 并發(fā)連接問(wèn)題” 而采用的方法。

  • 非阻塞 I/O

Node.js 避免了由于需要等待輸入或者輸出(數(shù)據(jù)庫(kù)、文件系統(tǒng)、Web服務(wù)器…)響應(yīng)而造成的 CPU 時(shí)間損失,這得益于 Libuv 強(qiáng)大的異步 I/O。

  • 事件驅(qū)動(dòng)編程

事件與回調(diào)在 JavaScript 中已是屢見(jiàn)不鮮,同時(shí)這種編程對(duì)于習(xí)慣同步思路的同學(xué)來(lái)說(shuō)可能一時(shí)很難理解,但是這種編程模式,確是一種高性能的服務(wù)模型。Node.js 與 Nginx 均是基于事件驅(qū)動(dòng)的方式實(shí)現(xiàn),不同之處在于 Nginx 采用純 C 進(jìn)行編寫(xiě),僅適用于 Web 服務(wù)器,在業(yè)務(wù)處理方面 Node.js 則是一個(gè)可擴(kuò)展、高性能的平臺(tái)。

  • 跨平臺(tái)

起初 Node.js 只能運(yùn)行于 linux 平臺(tái),在 v0.6.0 版本后得益于 Libuv 的支持可以在 windows 平臺(tái)運(yùn)行。

Node.js 適用于什么

講了這么多那么談下 Node.js 適合什么場(chǎng)景?

  • I/O 密集型場(chǎng)景

Node.js 的優(yōu)勢(shì)主要在于事件循環(huán),非阻塞異步 I/O,只開(kāi)一個(gè)線程,不會(huì)每個(gè)請(qǐng)求過(guò)來(lái)我都去創(chuàng)建一個(gè)線程,從而產(chǎn)生資源開(kāi)銷(xiāo)。

  • ResutFul API

通常我們可以使用 Node.js 來(lái)做為中間層,負(fù)責(zé)組裝數(shù)據(jù)提供 API 接口給到前端調(diào)用,這些數(shù)據(jù)源可能來(lái)自第三方接口或者數(shù)據(jù)庫(kù),例如,以前可能我們通過(guò)后端 Java、php 等其它語(yǔ)言來(lái)做,現(xiàn)在我們前端工程師通過(guò) Node.js 即可完成,后端則可以更專(zhuān)注于業(yè)務(wù)開(kāi)發(fā)。

既然提到了 ResultFul API,順便推薦一個(gè)去哪兒開(kāi)源的 API 管理工具 YAPI:https://github.com/YMFE/yapi 使用的 Node.js 進(jìn)行開(kāi)發(fā)的(聲明下這里不是打廣告,只是這個(gè)用起來(lái)真的很贊!忍不住向給大家推薦!)。

  • RPC 服務(wù)

RPC(Remote Procedure Call)中文名「遠(yuǎn)程過(guò)程調(diào)用」,也許你對(duì)它很陌生,但是在當(dāng)今微服務(wù)模式下,我們可能是針對(duì)功能或者具體的業(yè)務(wù)形態(tài)進(jìn)行服務(wù)化,那么服務(wù)之間的通信一種常見(jiàn)的模式我們都知道通過(guò) HTTP 來(lái)實(shí)現(xiàn),了解網(wǎng)絡(luò)模型的同學(xué)可能知道,如果我們現(xiàn)在通過(guò) TCP 的方式是不是會(huì)更高效呢?

當(dāng)然是的,HTTP 屬于應(yīng)用層協(xié)議,在這之下就是傳輸層,顯然以 TCP 形式是很有優(yōu)勢(shì)的,RPC 服務(wù)也就是采用的 TCP,現(xiàn)在出名的 RPC 服務(wù)例如,Google 的 gRPC、阿里的 Dubbo。

  • 基礎(chǔ)工具

可以做為基礎(chǔ)工具,前端領(lǐng)域中的編譯器、構(gòu)建工具、搭建腳手架等。比較出名的例如 Webpack、Gulp 都是很成功的。

  • 論壇社區(qū)

Nodeclub 是使用 Node.js 和 MongoDB 開(kāi)發(fā)的社區(qū)系統(tǒng),界面優(yōu)雅,功能豐富,小巧迅速,可以用它搭建自己的社區(qū)。Cnode 社區(qū)就是一個(gè)成功的例子,Cnode 地址:https://cnodejs.org/

https://github.com/cnodejs/nodeclub

  • Backend For Frontend

Backend For Frontend,簡(jiǎn)稱(chēng) BFF,服務(wù)于前端的后端,并非是一種新技術(shù)只是一種邏輯上的分層,在這一層我們可以做一些資源的整合,例如:原先前端需要從三個(gè)不同的地方來(lái)獲取資源,那么,有了這一層之后,我們是不是可以做個(gè)聚合,統(tǒng)一處理之后返回給前端,同時(shí)也不授后端系統(tǒng)的變遷,導(dǎo)致也要去更改。

  • Serverless

這將是未來(lái)經(jīng)常會(huì)聽(tīng)到的一個(gè)詞,ServerLess 是一種 “無(wú)服務(wù)器架構(gòu)”,它不需要開(kāi)發(fā)者去關(guān)心運(yùn)維、流量處理這些工作,開(kāi)發(fā)者則可以更關(guān)注于業(yè)務(wù)本身。

函數(shù)即服務(wù),那么寫(xiě)一個(gè)函數(shù)就可以實(shí)現(xiàn)一個(gè) API 接口給到前端,顯然對(duì)開(kāi)發(fā)工作是減輕了很多,在 JavaScript 中函數(shù)則是一等一的公民,在 ServerLess 這一場(chǎng)景下 Node.js 本身也很輕量級(jí),還是擁有著很大的優(yōu)勢(shì)。

  • Microservices

微服務(wù)也是近兩年一個(gè)很火熱的詞,這里提幾個(gè)微服務(wù)主要的特點(diǎn):小型服務(wù)、以獨(dú)立進(jìn)程運(yùn)行、可以使用不同語(yǔ)言。那么這里則可以根據(jù)業(yè)務(wù)形態(tài)來(lái)選擇不同的語(yǔ)言實(shí)現(xiàn),Node.js 本身也是很輕量級(jí)的,實(shí)現(xiàn)起來(lái)也很快,在一些 I/O 密集場(chǎng)景還是很適用的。

什么場(chǎng)景選擇什么工具,沒(méi)有最好的只有更合適的!

為什么選擇 Node.js

談一些個(gè)人感受及經(jīng)歷,其實(shí)接觸計(jì)算機(jī)行業(yè)說(shuō)不晚也不早,在高中階段開(kāi)始接觸的編程,在接觸 Node.js 之前也學(xué)過(guò)很多編程語(yǔ)言,大致曲線是這樣的 VB(這個(gè)是在高中時(shí)期)、C、C#(.Net)、Java、PHP 這些都是在學(xué)校的時(shí)候沒(méi)事玩弄的,還有接觸到前端,真的很雜,但沒(méi)有一樣精通的,這也是最可怕的,在大三暑假去了北京一家公司在那里實(shí)習(xí)了兩個(gè)月 PHP,但是之間有遇見(jiàn)做 Node.js 的同學(xué),當(dāng)時(shí)很好奇,哇奧,這是什么東東,竟然可以讓 JavaScript 做后端,就是沒(méi)見(jiàn)過(guò)市面那種。后來(lái)簡(jiǎn)單的做了了解,回到學(xué)校之后開(kāi)始學(xué)習(xí) Node.js 網(wǎng)上找各種資料看,陰差陽(yáng)錯(cuò)吧,就這樣選擇了 Node.js 直到現(xiàn)在,其實(shí)語(yǔ)言只是一種工具,例如在后端中,拋開(kāi)語(yǔ)言這一層,還有很多東西是需要我們?nèi)ゲ粩鄬W(xué)習(xí)的。

最后一點(diǎn)建議:不要給自己設(shè)定邊界,例如:我一定要學(xué)習(xí) Node.js 或者我一定要學(xué)習(xí) Java 又或者 Python,其實(shí)在有條件的情況下可以多接觸一些其它東西,一方面擴(kuò)展了自己的邊界,另一方面自己也可以從中獲取收益。

Node.js 技術(shù)棧學(xué)習(xí)指南路線圖

Node.js 是什么?我為什么選擇它?

 

這是最近畫(huà)的一張 Node.js 技術(shù)棧學(xué)習(xí)指南路線圖,從中可以看出拋開(kāi)語(yǔ)言這一層面,剩下的都是我們要學(xué)習(xí)的。

分享到:
標(biāo)簽:Node js
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定