現在流行一種說法叫web全棧工程師,講的是一個web工程師要懂前后端,以及前端的各種牛逼技術,我覺得這個全棧工程師並不是說讓你一個人去干一個團隊的活,而是說你要有足夠的技術思維以及技術掌控力,說白了就是你要懂的多,對於整天搞前端,和JavaScript打交道的我們來說,我們不妨來來看一個用JavaScript實現的后端平台,node.js.
- nodejs是以chrome v8為運行環境的一個平台,它不是一門語言,而是一個平台,
- nodejs致力於是構建速度快,穩定的網絡程序更簡單
- 它具有事件驅動和非阻塞I/O的特色,使之輕量級並且高效率
- 它非常適合在分布式設備運行數據密集型實時應用程序
使用chrome v8引擎?
nodejs為什么要使用chrome引擎呢,據說是當時的創始人在開發nodejs的時候,想要創造出來一個高性能,異步IO,事件驅動的語言,因為JavaScript中是單線程執行的,所以沒有同步IO,他便選定了JavaScript來作為基礎實現的語言,同時由於谷歌的v8引擎是開源的,而且是運行JavaScript很快的引擎,便很機智的選擇了chrome v8引擎來作為基礎環境了,
nodejs的作用?
講到這里,我們大概的明白了nodejs是一個平台,是一個環境,它是由chrome v8引擎來做底層支持,使用JavaScript來做語言支持,大概意思就是我們之前使用JavaScript運行在瀏覽器端去處理dom,bom操作等等,現在JavaScript運行在服務器去處理數據的增刪改查,接受請求,發送數據,查找修改文件,WHAT?這么吊?對的,現在使用JavaScript你就可以去做那些以前你覺得很牛逼的事情.
當我們輸入一個url去訪問網站,服務器端接受到了這個請求之后,開始去查找請求的文件,然后去執行數據庫查詢,查詢后將響應體返回給瀏覽器,這是一個大致的過程,那么在以前的服務器中,例如Apache,每一個請求事件它都會去創建一個新的進程去處理這個請求,
之后,我們有了ajax,不再去進行整個頁面的刷新了,而是進行局部的刷新,我們只需要去向服務器請求我們需要的那一部分數據就行了,這是一個巨大的進步.
那我們可以再去設想一個場景,當我們在看朋友圈時,我么每一個用戶的朋友圈都在實時的更新當中,按照我們以前的做法是給每一個用戶都和數據庫端有一個長鏈接(long polling),
所謂的長鏈接,就是我們每個用戶都和服務器有一個鏈接,由於服務器不會主動向瀏覽器發送數據,當鏈接建立之后,不會立馬斷開,服務器端會一直在等待,當瀏覽器需要它將更新的數據返回時它才會發送數據,例如你有一個朋友在微信上給你發了一條消息,這是服務器端就會向你的微信端發送一個消息,當瀏覽器端接受到了消息之后,會將當前鏈接斷開,但是會再理解建立一個鏈接.
我們以前的這種做法的弊端就是服務器開銷太大,一直都有鏈接占用着資源,那么怎么解決呢?用nodejs就可以解決,nodejs有着非阻塞IO和事件驅動的特點,這些術語其實並不是那么的復雜,我們可以將非阻塞IO想象成一個事件循環,這個事件循環在不停的轉啊轉,有請求進來時,就將他裝進這個事件循環,每一個事件都有一個回調,當我們產生一個請求時,不用等待,而是直接將該進程放進事件循環中,當數據庫有信息返回時再觸發回調函數.每個請求就像ajax執行時那樣,不需要等待,
當我們的服務器請求結果返回了,事件循環就把結果傳回用戶的瀏覽器,接着繼續跑,在這種方式下,我們的服務器就不會閑着了,(在多線程下有可能一些線程都沒有什么用)並且從理論上講,同一時刻的數據庫查詢數量,以及用戶的請求數量就沒有限制了,服務器只在用戶那邊有請求的時候才響應,這就是事件驅動.更多的可以理解為單核手機模擬四核手機的情況.
總結
nodejs不是一門新的語言,他就是JavaScript的一個運行環境,JavaScript以前是在瀏覽器端跑,現在有了nodejs就可以在后端跑,就像汽車原本只能在公路上跑,現在你給他裝了nodejs,它現在可以在水里跑了一樣.那么這么抽象的說,我自己搞的也暈頭轉向的,對於剛趟入nodejs渾水的我.歡迎大家來一起交流!