1.前言
Node 的重要性已經(jīng)不言而喻,很多互聯(lián)網(wǎng)公司都已經(jīng)有大量的高性能系統(tǒng)運行在 Node 之上。Node 憑借其單線程、異步等舉措實現(xiàn)了極高的性能基準。此外,目前最為流行的 Web 開發(fā)模式是前后端分離的形式,即前端開發(fā)者與后端開發(fā)者在自己喜歡的 IDE 上獨立進行開發(fā),然后通過 HTTP 或是 RPC 等方式實現(xiàn)數(shù)據(jù)與流程的交互。這種開發(fā)模式在 Node 的強大功能的引領下變得越來越高效,也越來越受到各個互聯(lián)網(wǎng)公司的青睞。
1.1 前端同學為什么要學習后端/后端同學為什么要學習前端
- 了解前后端交互流程。
- 前端同學能夠和后臺開發(fā)的程序員更佳緊密地結(jié)合、更順暢地溝通。
- 當網(wǎng)站的業(yè)務邏輯需要前置時,前端人員需要學習一些后臺開發(fā)的技術,以完成相應的任務;反過來也一樣。
- 拓寬知識視野和技術棧,能夠站在全局的角度審視整個項目。
1.2 前端同學為什么要學 Node.js
(1)Node.js 使用 JavaScript 語言開發(fā)服務器端應用,便于前端同學上手(一些公司甚至要求前端工程師掌握 Node.js 開發(fā))。
(2)實現(xiàn)了前后端的語法統(tǒng)一,有利于和前端代碼整合,甚至共用部分代碼。
比如說,針對接口返回的各種字段,前后端都必須要做校驗。此時,如果用 Node.js 來做后臺開發(fā)的話,前后端可以共用校驗的代碼。
(3)Node.js 性能高、生態(tài)系統(tǒng)活躍,提供了大量的開源庫。
(4)Jeff Atwood 在 2007 年提出了著名的 Atwood 定律:任何能夠用 JavaScript 實現(xiàn)的應用系統(tǒng),最終都必將用 JavaScript 實現(xiàn)。 Jeff Atwood 是誰不重要(他是 Stack Overflow 網(wǎng)站的聯(lián)合創(chuàng)始人),重要的是這條定律。
2.Node.js是什么?
2.1 官方定義
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。Node.js 使用了一個事件驅(qū)動、非阻塞式 I/O的模型,使其輕量又高效。Node.js 的包管理工具 npm 是全球最大的開源庫生態(tài)系統(tǒng)。Node.js 不是一門語言,也不是 JavaScript 的框架,也不是像Nginx一樣的Web服務器 ,Node.js 是 JavaScript 在服務器端的運行環(huán)境(平臺)。
2.2 Node.js 的組成
在 Node.js 里運行 JavaScript,跟在 Chrome 里運行 JavaScript 有什么不同?
二者采用的是同樣的 JS 引擎。在 Node.js 里寫 JS,和在前端寫 JS,幾乎沒有不同。在寫法上的區(qū)別在于:Node.js 沒有瀏覽器、頁面標簽相關的 API,但是新增了一些 Node.js 相關的 API。通俗來說,對于開發(fā)者而言,在前端寫 JS 是用于控制瀏覽器;而 Node.js 環(huán)境寫 JS 可以控制整個計算機。
我們知道,JavaScript 的組成分為三個部分:
ECMAScript
- DOM:標簽元素相關的API
- BOM:瀏覽器相關的API
- ECMAScript 是 JS 的語法;DOM 和 BOM 瀏覽器端為 JS 提供的 API。
而 Node.js 的組成分為:
- ECMAScript。ECMAScript 的所有語法在 Node 環(huán)境中都可以使用。
- Node 環(huán)境提供的一些附加 API(包括文件、網(wǎng)絡等相關的 API)。
如下圖所示:
2.3 小總結(jié)
- Node 是一個服務器端 JavaScript 解釋器
- Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境
- Node.js 使用了一個事件驅(qū)動、非阻塞式 I/O 的模型,使其輕量又高效
- Node.js 的包管理器 npm,是全球最大的開源庫生態(tài)系統(tǒng)
- Node.js 是一門動態(tài)語言,運行在服務端的 Javascript
3.Node.js 的應用
Node.js 擁有強大的開發(fā)者社區(qū),現(xiàn)在已經(jīng)發(fā)展出比較成熟的技術體系,以及龐大的生態(tài)。它被廣泛地應用在 Web 服務、開發(fā)工作流、客戶端應用等諸多領域。其中,在 Web 服務領域,業(yè)界對 Node.js 的接受程度最高。
3.1 BFF 中間層
BFF,即 Backend For Frontend(服務于前端的后端)。玉伯在《從前端技術進化到體驗科技》這篇文章中點出了 BFF 層的概念:BFF 模式下,整體分工很清晰,后端通過 Java/C++ 等語言負責服務實現(xiàn),理想情況下給前端提供的是基于領域模型的 RPC 接口,前端則在 BFF 層直接調(diào)用服務端 RPC 接口拿到數(shù)據(jù),按需加工消費數(shù)據(jù),并實現(xiàn)人機交互?;?BFF 模式的研發(fā),很適合擁有前端技術背景的全棧型工程師。這種模式的好處很明顯,后端可以專注于業(yè)務領域,更多從領域模型的視角去思考問題,頁面視角的數(shù)據(jù)則交給前端型全棧工程師去搞定。領域模型與頁面數(shù)據(jù)是兩種思維模式,通過 BFF 可以很好地解耦開,讓彼此更專業(yè)高效。
在 Web 服務里,搭建一個中間層,前端訪問中間層的接口,中間層再訪問后臺的 Java/C++ 服務。這類服務的特點是不需要太強的服務器運算能力,但對程序的靈活性有較高的要求。這兩個特點,正好和 Node.js 的優(yōu)勢相吻合。Node.js 非常適合用來做 BFF 層,優(yōu)勢如下:
- 對于前端來說:讓前端有能力自由組裝后臺數(shù)據(jù),這樣可以減少大量的業(yè)務溝通成本,加快業(yè)務的迭代速度;并且,前端同學能夠自主決定與后臺的通訊方式。
- 對于后臺和運維來說,好處是:安全性(不會把主服務器暴露在外面)、降低主服務器的復雜度等。
3.2 服務端渲染
客戶端渲染(CSR / Client side render):前端通過一大堆接口請求數(shù)據(jù),然后通過 JS 動態(tài)處理和生成頁面結(jié)構(gòu)和展示。優(yōu)點是前后端分離、減小服務器壓力、局部刷新。缺點是不利于 SEO(如果你的頁面然后通過 Ajax 異步獲取內(nèi)容,抓取工具并不會等待異步完成后再行抓取頁面內(nèi)容)、首屏渲染慢。
服務端渲染(SSR / Server Side Render):服務器返回的不是接口數(shù)據(jù),而是一整個頁面(或整個樓層)的 HTML 字符串,瀏覽器直接顯示即可。也就是說,在服務器端直接就渲染好了,然后一次性打包返回給前端。優(yōu)點是有利于 SEO、首屏渲染很快。
總結(jié): 搜索引擎優(yōu)化 + 首屏速度優(yōu)化 = 服務端渲染。
備注:這里的「服務端渲染」只是讓 Node.js 做中間層,不會替代后端的,后臺同學請放心。
參考鏈接:
Vue 服務端渲染的概念
服務器端渲染(SSR)和客戶端渲染(CSR)的區(qū)別,以及優(yōu)化首屏的一些思考
服務端渲染(SSR)
方應杭
歷史回顧:
(1)一開始,頁面很簡單,html 是后端渲染的(比如PHP、ASP、JSP等方式)。后端發(fā)現(xiàn)頁面中的 js 好麻煩(雖然簡單,但是坑多),于是讓公司招聘專門寫 js 的人,簡稱「前端切圖仔」。
(2)隨著 Node.js 和前端 MVC 的興起,以及前端越來越復雜,慢慢演變成了「前后端分離」。
(3)前端的 SPA 應用流行之后,發(fā)現(xiàn) SEO 問題很大,而且首屏渲染速度很慢,但是自己選的路再難走也要走下去,于是用 Node.js 在服務端渲染被看成是一條出路。
(4)以前在一起的時候,是后端做部分前端的工作;現(xiàn)在在一起的時候,是前端做部分后端的工作。
3.3 做小型服務、小型網(wǎng)站的后端(基于 Express、Koa 框架)
現(xiàn)在很多公司的后臺管理系統(tǒng),都是用 Node.js 來開發(fā)接口,畢竟,后臺管理系統(tǒng)對性能和并發(fā)的要求不是太高。有了 Node.js 之后,通過 JS 直接操作 DB,做增刪改查,生成接口,極大降低了前端同學的學習門檻。
當然,有時候做 Node.js 開發(fā),是因為:后臺人力不夠,所以把后臺開發(fā)的一部分工作量,轉(zhuǎn)移給前端同學。
3.4 做項目構(gòu)建工具
前端正在廣泛使用的構(gòu)建工具 gulp、Webpack,就是基于 Node.js 來實現(xiàn)的。
3.5 做 PC 客戶端軟件(基于 Electron 框架)
Electron 框架就是基于 Node.js 的,可以用來開發(fā)客戶端軟件。
Electron 原名為 Atom Shell,是由 GitHub 開發(fā)的一個開源框架。Electron 以 Node.js 作為運行時(runtime),以 chromium 作為渲染引擎,使開發(fā)者可以使用 JS 這種前端技術棧開來發(fā)跨平臺的桌面GUI應用程序。
有一點你可能會感到驚訝:程序員們都在用的代碼編輯器 VS Code 軟件, 就是基于 Electron 框架來開發(fā)的。其他使用 Electron 進行開發(fā)的知名應用還有:Skype、GitHub Desktop、Slack、WhatsApp等。
還有一個例子是:電子游戲直播網(wǎng)站 Twitch,號稱是國外游戲直播的鼻祖,它在 PC 端的客戶端軟件,就是用 Electron 框架的。你會發(fā)現(xiàn),Twitch 的網(wǎng)站視覺,和 PC 端的視覺,幾乎是一樣的。如果兩端都采用 JS 語言,就可以極大的復用現(xiàn)有的工程。
3.6 知名度較高的 Node.js 開源項目
- express:Node.js 中著名的 web 服務框架。
- Koa:下一代的 Node.js 的 Web 服務框架。所謂的“下一代”是相對于 Express 而言的。
- Egg:2016 年,阿里巴巴研發(fā)了知名的 Egg.js 開源項目,號稱企業(yè)級 Web 服務框架。Egg.js 是基于 Koa 開發(fā)的。
- mocha:是現(xiàn)在最流行的 JavaScript 測試框架,在瀏覽器和 Node 環(huán)境都可以使用。
- PM2:node 多進程管理。
- jade:非常優(yōu)秀的模板引擎,不僅限于 js 語言。
- CoffeeScript:用簡潔的方式展示 JavaScript 優(yōu)秀的部分。
- Atom:編輯器。
- VS Code:最酷炫的編輯器。
- socket.io:實時通信框架。
3.7 總結(jié)
或許,能用 Node.js 做的后臺應用,Java/C++ 也能做;但是 Node.js 可以讓我們多一種選擇。
短期來看,Node.js 很難像 Java/C++ 那樣,成為后臺的主力開發(fā)語言。這并非是因為 Node.js 的性能問題,主要是因為,Node.js 還比較年輕,經(jīng)驗積累太少,框架的支持度不夠。搞企業(yè)級服務,Node.js 敵不過 Java/C++,所以目前只能搞「輕量級」;但未來可期。
限制語言能力的不是語言本身,而是生態(tài)。
4.Node.js 的特點
- 異步、非阻塞 IO 模型
- 事件循環(huán)
- 單線程
- 總結(jié):輕量和高效
Node.js 的性能和效率非常高。
傳統(tǒng)的 Java 語言是一個請求開啟一個線程,當請求處理完畢后就關閉這個線程。而 Node.js 則完全沒有采用這種模型,它本質(zhì)上就是一個單線程。
你可能會疑問:一個線程如何服務于大量的請求、如何處理高并發(fā)的呢?這是因為,Node.js 采用的是異步的、非阻塞的模型。文章來源:http://www.zghlxwxcb.cn/news/detail-657053.html
這里所謂的“單線程”,指的是 Node 的主線程只有一個。為了確保主線程不被阻塞,主線程是用于接收客戶端請求。但不會處理具體的任務。而 Node 的背后還有一個線程池,線程池會處理長時間運行的任務(比如 IO 操作、網(wǎng)絡操作)。線程池里的任務是通過隊列和事件循環(huán)的機制來執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-657053.html
5.使用 Node.js 時的劣勢
- 程序運行不穩(wěn)定,可能會出現(xiàn)服務不可用的情況
- 程序運行效率較低,每秒的請求數(shù)維持在一個較低的水平
- 前端同學對服務器端的技術不太熟悉。
到了這里,關于【Nodejs】Node.js簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!