nodejs概述和理解

2022-09-06 07:36:11 字數 2840 閱讀 9938

node.js是j**ascript的一種執行環境,是對google v8引擎進行的封裝。是乙個伺服器端的j**ascript的直譯器。

包含關係,nodejs中含有npm,比如說你安裝好nodejs,你開啟cmd輸入npm -v會發現出啊線npm的版本號,說明npm已經安裝好。

引用大神的總結:

阻塞就是幹不完不准回來,   

非阻塞就是你先乾,我現看看有其他事沒有,完了告訴我一聲

同步與非同步是對應的,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的。

阻塞與非阻塞是對同乙個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞。

阻塞是使用同步機制的結果,非阻塞則是使用非同步機制的結果。

在阻塞i/o情況下,乙個執行緒只能處理乙個流的i/o事件。也就是說,如果想處理多個流的i/o事件,就必須使用多程序(fork),或者多執行緒——效率太低

1、基於v8虛擬機器,可構建高效能伺服器

v8引擎本身使用了一些最新的編譯技術。這使得用j**ascript這類指令碼語言編寫出來的**與用c這類高階語言寫出來的**效能相差無幾,卻節省了開發成本。對效能的苛求是node的乙個關鍵因素。 j**ascript是乙個事件驅動語言,node利用了這個優點,編寫出可擴充套件性高的伺服器。node採用了乙個稱為「事件迴圈(event loop)」的架構,使得編寫可擴充套件性高的伺服器變得既容易又安全。提高伺服器效能的技巧有多種多樣。node選擇了一種既能提高效能,又能減低開發複雜度的架構。這是乙個非常重要的特性。併發程式設計通常很複雜且布滿地雷。node繞過了這些,但仍提供很好的效能。

2、單執行緒

node.js可以在不新增額外執行緒的情況下,依然可以對任務進行並行處理 —— node.js是單執行緒的。它通過事件輪詢(event loop)來實現並行操作,對此,我們應該要充分利用這一點 —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。

3、可利用j**ascript進行後台開發

雖然讓j**ascript執行於伺服器端不是node的獨特之處,但卻是其一強大功能。不得不承認,瀏覽器環境限制了我們選擇程式語言的自由。任何伺服器與日益複雜的瀏覽器客戶端應用程式間共享**的願望只能通過j**ascript來實現。雖然還存在其他一些支援j**ascript在伺服器端 執行的平台,但因為上述特性,node發展迅猛,成為事實上的平台。

4、非阻塞io

node採用一系列「非阻塞」庫來支援事件迴圈的方式。本質上就是為檔案系統、資料庫之類的資源提供介面。向檔案系統傳送乙個請求時,無需等待硬碟(定址並檢索檔案),硬碟準備好的時候非阻塞介面會通知node。該模型以可擴充套件的方式簡化了對慢資源的訪問, 直觀,易懂。尤其是對於熟悉onmouseover、onclick等dom事件的使用者,更有一種似曾相識的感覺。

5、restful api

我想不僅僅是node.js,當我們要引入任何一種新技術前都必須要搞清楚幾個問題:

server端阻塞是當前系統遇到的最大問題。在整個資料查詢的過程中,當前程式程序往往只是在等待結果的返回,這就造成了程序的阻塞。對於高併發、計算任務較大以及i/o密集行的網路應用中,一方面程序很長時間處於等待狀態,另一方面為了應付新的請求不斷的增加新的程序。這樣的浪費會導致系統支援qps遠遠小於後端資料服務能夠支撐的qps,成為了系統的瓶頸。node一向是這樣來標榜自己的:「在node中除了**,所有一切都是並行執行的」。這句話的意思是說,node.js可以在不新增額外執行緒的情況下,依然可以對任務進行並行處理 。node.js是單執行緒的,它通過事件輪詢(event loop)來實現並行操作,對此,我們應該要充分利用這一點 ,盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。我們搭建前端伺服器主要用於處理前端大量的公司計算並將計算結果及時呈現給使用者,所以能夠避免很多i/o阻塞操作,這樣就能充分利用nodejs的優點同時也能夠滿足我們的需求。另外,我們前端基於的dojo框架是基於js的,而nodejs在處理j**ascript的優勢在前面已有介紹,這裡不再贅述。

解決阻塞可以引入事件處理機制解決這個問題,在查詢請求發起之前註冊資料載入事件的響應函式,請求發出之後立即將程序交出,而當資料返回後再觸發這個事件並在預定好的事件響應函式中繼續處理資料。而j**ascript,相對於其他語言,至少有兩個關鍵特性決定它特別適合完成這個任務。

(一) j**ascript是一種函式式程式語言,函式程式語言最重要的數學基礎是λ演算(lambda calculus) ,即函式物件可以作為其他函式物件的輸入(引數)和輸出(返回值)。這個特性使得為事件指定**函式變得很容易。特別是j**ascript還支援匿名函式,通過匿名函式的輔助,我們很容易實現**。(二)j**ascript的另外乙個重要語言特性:閉包(closures)。該特性可以使非同步**的執行上下文保持,即"狀態保持"。

****規則如下:

1.全域性變數不會被**。

2.區域性變數會被**,也就是函式一旦執行完以後,函式內部的東西都會被銷毀。

3.只要被另外乙個作用域所引用就不會被**

阻塞式程式設計浪費了大量程序資源只是在等待,導致大量記憶體和cpu的浪費。在這方面node.js好很多,但也正是因為一些閉包等j**ascript內建機制也會導致資源的浪費。

同步與非同步是對應的,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的。

阻塞與非阻塞是對同乙個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞。

阻塞是使用同步機制的結果,非阻塞則是使用非同步機制的結果。

在阻塞i/o情況下,乙個執行緒只能處理乙個流的i/o事件。也就是說,如果想處理多個流的i/o事件,就必須使用多程序(fork),或者多執行緒——效率太低

概述nodejs模組系統核心原理

test.js require x 複製 x是node核心模組 如http,zlib等 則返回,否則繼續 根據module物件的paths屬性一直遞迴找node modules資料夾下是否存在該模組,直到根目錄,否則丟擲error module not found x是路徑 如 path to fi...

nodejs中流 stream 的理解

nodejs的fs模組並沒有提供乙個copy的方法,但我們可以很容易的實現乙個,比如 var source fs.readfilesync path to source fs.writefilesync path to dest source 如上面高大上的所示,我們把檔案比作裝水的桶,而水就是檔案...

nodejs的事件驅動理解

引入 events 模組 var events require events 建立 eventemitter 物件 var eventemitter new events.eventemitter 建立監聽例項 繫結事件及事件的處理程式 eventemitter.on eventname event...