首先,咱們看一下官網對於Node.js的介紹:css
Node.js is a JavaScript runtime built on Chrome's V8前端
Node.js是一個構建在ChromeV8引擎上的Javascript的運行時,nodejs並非一門語言,JavaScript纔是一門語言,而nodejs是讓JavaScript在服務器端跑起來的一個runtime,nodejs並不能使用JavaScript的全集(BOM和DOM)java
Node.js uses an event-driven,non-blocking I/O modelnode
I/O: 就是 input/output 的縮寫,也就是 輸入/輸出 的意思webpack
對於計算機來講讀寫磁盤一次I/O操做,想要理解非阻塞I/O,咱們先來了解一下什麼是阻塞I/Oweb
阻塞: I/O時進程休眠等待I/O完成後進行下一步,數據庫
簡單來講,咱們計算機的程序是逐條順序執行的,第一句執行完以後纔會執行第二句直到程序結束,那麼當某條指令是要求計算機進行I/O操做的時候,程序會調用操做系統更底層的命令來進行I/O操做,期間程序就會等待底層命令返回結果,拿到結果以後才能執行下一條指令。咱們就把等待底層命令的這種行爲成爲阻塞gulp
非阻塞: I/O時函數當即返回,進程不等待I/O完成瀏覽器
當咱們理解了阻塞和I/O以後,那麼顧名思義,非阻塞I/O就是當程序執行到I/O指令時(調用操做系統底層的I/O),主程序不須要等待I/O返回的結果,直接執行下一條指令,這種行爲稱爲非阻塞。sass
I/O結束後通知主程序,也就是咱們接下來要說的事件驅動
事件驅動很常見,好比咱們常常在頁面上放一個按鈕,而後給他綁定click事件,這個事件處理程序就是事件驅動的,JavaScript的進程並不知道何時調用,當用戶點擊按鈕的時候觸發了click事件,這時候主程序獲得通知,去調用相應的事件處理程序
I/O等異步操做結束後的通知
觀察者模式
前端職責範圍變大,統一開發體驗
在處理高併發、I/O密集場景性能優點明顯
什麼是I/O密集場景呢?咱們來對比一下CPU密集場景
什麼是高併發呢?在單位時間內訪問量特別大就是高併發。
咱們舉一個生活中常見的例子,好比說老王開了一個飯店,僱了個廚師小A,來了客人以後小A就去接待,選好菜以後小A去後廚作,作完以後交給客戶享用,可是客人一多,就會有客人等待,這樣客人就很不爽,
老王一分析,這個簡單,再僱兩個廚師小B和小C,這樣三個廚師,客人能夠排三條隊,這樣問題就初步解決了。
接着飯店名氣愈來愈大,客人愈來愈多,這時老王就想了,再多僱幾個廚師?可是好像不太划算,老王想到一個好辦法,他炒掉了以前的廚師,僱了幾個作飯快的廚師,每一個廚師作飯快了4倍,可是隻須要支付1.5倍的工資就能夠了。
對應到咱們web開發場景,大廚就是物理服務器,開始應對高併發你們想到的最直接的方法就是增長機器數,機器多了,流量仍是同樣的大,咱們就能夠經過負載均衡讓他到不一樣的機器上去處理,這樣同時響應的web請求的數量就變多了,可是加到必定地步,咱們會發現這並不划算,因而咱們開始使用更好的機器(多核)
總結一下如何應對高併發就是
上面這些是簡單粗暴的方法,使用java、node並無什麼區別,不能體現出nodejs的優點,而nodejs性能好,主要是在單個的cpu,也就是單臺機器的時候,在處理web請求的方式和java是迥異的。爲了方便理解後面的內容,咱們先來了解幾個概念
進程: 是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位
這個定義很難理解,可是不要慌,咱們仍是舉個栗子
咱們能夠用電腦來聽音樂、上網,那麼對應的音樂播放器和瀏覽器就是一個程序,當咱們雙擊桌面圖標讓它運行的時候,實際上就是把這個程序加載到了內存中執行,這個執行中(進行中)的程序叫作進程。
那麼咱們知道,單核cpu也是能夠一邊聽音樂一邊上網的,這是爲何呢?按照上面所說,程序在內存中是一句句執行的,這是兩個程序啊,它倆是不可能同時進行的呀。
實際上,它倆也不是同時進行的,計算機用了一個很巧妙的作法,跟咱們拍動畫片很是像,在一秒播24幀,雖然是一幀一幀的,但在人的肉眼看就是動畫了,cpu也是這麼作的,兩個程序,在很是短的時間切換,0.1納秒執行音樂播放器,0.1納秒執行瀏覽器,對於人來講就識別不出來,認爲聽得音樂都是連續的,這個就叫作多進程
多進程: 啓動多個進程,多個進程能夠一塊執行多個任務(不是同時執行)
線程: 進程內一個相對獨立、可調度的執行單元,與同屬一個進程的線程共享進程的資源
多線程:啓動一個進程,在一個進程內啓動多個線程,這樣多個線程也能夠一塊執行多個任務
隨着JSX、ES6還有前端各類各樣的模塊化,sass、less、postcss等的出現,前端代碼變得異常複雜,咱們前端直接書寫的代碼在瀏覽器上是無法直接工做的,須要進行一些本地的轉化工做咱們管這個轉化工做叫作編譯構建。相關的工具webpack、gulp、babel等工具也應運而生,這些都是nodejs寫的。
因此咱們講NodeJs高性能是有很是多前提的,最大的前提就是web場景,高併發和I/O密集。