Node.js 筆記01

1、Node.js 前言

1.node.js 之父

Ryan Dahl(瑞安達爾) ,技術好,顏值高!javascript

  • 數學系博士, 中途退學, 爲了生活, 學習了Ruby On Rails接Web項目, 通過兩年成了Web服務器專家。第一個階段: 接項目作網站。第二個階段: 幫助客戶解決性能問題。
  • 2009年推出Node.js, 2012年退出Node.js, 轉戰Go語言。

2.Node出現的背景

爲了解決Web服務器的高併發性能問題,Dyan Dahl 嘗試用 ruby,c,lua去解決,但因語言自身緣由失敗,即語言歷史包袱過重,船大難掉頭,各類語言的生態根深蒂固,沒法輕易改變。關於如何避免IO阻塞:異步I/O,事件驅動php

三、V8引擎

一款專門對 JavaScript 進行解釋和執行的流程虛擬機前端

好比把V8引擎嵌入到瀏覽器中,那麼咱們寫的JavaScript代碼就會被瀏覽器所執行;那麼若是把V8引擎嵌入到NodeJS環境下,那麼咱們寫的JavaScript代碼就會被服務器所執行。java

V8引擎嵌入到不一樣的宿主環境中時,就能夠把JavaScript語言應用到不一樣的多領域中。node

V8優點:python

  • 編譯強大、快速執行
  • 性能好,比python,Ruby等腳本語言好
  • 歷史包袱輕,沒有同步I/O
  • 事件驅動機制

瑞安 達爾,修改了V8引擎內核,並用戶服務器開發,因而產生了 Node.jswebpack

2、Node.js 簡介

Node.js 是一個讓 JavaScript 運行在服務端的開發平臺,使得 javascript從瀏覽器 延伸到了服務器,一開始叫 web.js,目的就是用來寫高性能的Web服務器的。後來愈來愈壯大,改成叫 Node.js,從2009年到如今,不斷改進和更新......web

與其餘後臺語言的區別:shell

  • Node.js 不是一種獨立的語言,Node.js 用JavaScript進行編程,運行環境是包裝後的js 引擎(V8)
  • Node.js不架設在任何服務器軟件上,java,php 等須要部署到tomcat,apache等
  • 用最小的硬件成本,達到跟高的併發,更優秀的處理性能

Node.js的特色:數據庫

一、單線程:

  • 優點:減小了內存開銷(操做系統不會有線程建立、銷燬的開銷)
  • 劣勢:若是一個事情被I/O阻塞,整個線程就被阻塞了

二、非I/O阻塞

當在訪問數據庫取得數據的時候,須要一段時間。在傳統的單線程處理機制中,在執行了訪問數據庫代碼以後,整個線程都將暫停下來,等待數據庫返回結果,才能執行後面的代碼。也就是說,I/O阻塞了代碼的執行,極大地下降了程序的執行效率。

Node.js中採用了非阻塞型I/O機制,所以在執行了訪問數據庫的代碼以後,將當即轉而執行其後面的代碼,把數據庫返回結果的處理代碼放在回調函數中,從而提升了程序的執行效率。

當某個I/O執行完畢時,將以事件的形式通知執行I/O操做的線程,線程執行這個事件的回調函數。爲了處理異步I/O,線程必須有事件循環,不斷的檢查有沒有未處理的事件,依次予以處理。

阻塞模式下,一個線程只能處理一項任務,要想提升吞吐量必須經過多線程。而非阻塞模式下,一個線程永遠在執行計算操做,這個線程的CPU核心利用率永遠是100%。

三、事件驅動

好比執行着小紅的業務,執行過程當中,小剛的I/O回調完成了,此時怎麼辦??因此要有事件驅動循環

不論是新用戶的請求,仍是老用戶的I/O完成,都將以事件方式加入事件環,等待調度,Node.js當中全部的I/O都是異步的, 都是回調函數套回調函數

運做流程:

  • 在Node中,客戶端請求創建鏈接,提交數據等行爲,會觸發相應的事件。
  • 在Node中,在一個時刻,只能執行一個事件回調函數, 可是在執行一個事件回調函數的中途,能夠轉而處理其餘事件
    (好比,又有新用戶鏈接了),而後返回繼續執行原事件的回調函數,這種處理機制,稱爲「事件環」機制。
  • 當某一個事件發生的時候,就去執行回調函數。執行完畢以後,再去找到事件循環當中找一個新的事件進行來

Node.js當中全部的I/O都是異步的, 都是回調函數套回調函數

3、Node.js的應用方向

1.特色

  • 善於I/O,不善於計算

由於Node.js最擅長的就是任務調度,若是你的業務有不少的CPU計算,實際上也至關於這個計算阻塞了這個單線程,就不適合Node開發。

當應用程序須要處理大量併發的I/O,而在向客戶端發出響應以前,應用程序內部並不須要進行很是複雜的處理的時候,Node.js很是適合。Node.js也很是適合與web socket配合,開發長鏈接的實時交互應用程序。

  • 異步

2.適用場景

網站開發(如express/koa等)
im即時聊天(socket.io)
api(移動端,pc,h5)
HTTP Proxy(淘寶、Qunar、騰訊、百度都有)
前端構建工具(grunt/gulp/bower/webpack/fis3…)
跨平臺打包工具
PC端的electron、nw.js,好比釘釘PC客戶端、微信小程序IDE、微信客戶端,移動的cordova,Phonegap,一站式開發框架ionic framework
寫操做系統(NodeOS)
命令行工具(好比cordova、shell.js)
反向代理(好比anyproxy,node-http-proxy)
編輯器Atom、VSCode等

3.Node.js 不是全能的

Node.js本是就是極客追求性能極致的產物,缺乏了不少服務器的健壯考量, 因此Node不可能應用在銀行、證券、電信等須要極高可靠性的業務中。

創業型公司(正處於A輪、B輪)很是愛使用Node作核心業務

■ 功夫熊的APP,後臺是Node.js在伺服
■ 實現網,整站爲Node.js搭建

成熟大企業,基本上都是用Node實現某一方面的功能:
■ 知乎用了一個Node進程,跑起了「站內信」功能
■ 百度的不少表單,是用Node保存到數據庫的

4.企業中的使用場景

相關文章
相關標籤/搜索