Node.js
歸納
是一個可以讓JS代碼在服務器端運行的開發平臺。php
一開始只是用於寫高性能Web服務器的。前端
可是越寫越大造成了生態,因而更名爲Node.js。node
- 他只是一個平臺,而不是一種獨立的語言。
- 輕量級架構,Java、php等須要運行在服務器上,而Node.js不須要架設在任何服務器軟件之上。
特色
- 單線程
- 對服務器的要求低,這就限制了她只能作小型微型應用。
- 和事件驅動聯合起來,使得在宏觀上看起來是多線程。
- 一個8G內存的服務器能夠同時處理超過4萬用戶的鏈接。
- 例如:張三和李四,張三先啓動服務器,張三正在作某件事情,李四的請求來了,先把張三的語法終止,把李四的請求放到一個事件循環當中,放過以後,繼續作張三的事情。
- 非阻塞I/O
- 當在訪問數據庫取得數據的時候,須要一段時間,在傳統的單線程處理機制中,在返回了訪問數據庫代碼以後,整個線程都將暫停下來,等待數據庫返回結果。也就是說,I/O阻塞了代碼的執行,極大地下降了程序的執行效率。
- 事件驅動
Node.js當中全部的I/O都是異步的,都是回調函數套用回調函數。web
適合作什麼?
特色
- 善於I/O,不善於計算。
- Node.js適合與web socket配合,開發長鏈接的實時交互應用程序。
- 天生異步。
適用場景
- 網站開發
- IM即時通信
- API
- Http Proxy
- 前端構建工具(npm)
- 跨平臺打包工具
- 寫操做系統(NodeOS)
- 命令行工具
- 反向代理
- 。。。
Node.js不是全能的
- 不適合開發一些銀行、證券、電信等一些剛併發場景的開發。
- 適合一些A輪、B輪的開發。
縮短髮送請求到響應的時長
- 發送請求快一點(客戶端網速決定)
- 響應快一點(服務器帶寬、CDN加速…)
- 服務器請求任務快一點(多線程)
- 服務器從磁盤讀取/寫入數據到數據庫快一點
- 磁盤的讀取速度有上限
- 分佈式
- 矩陣式
- 刀片式
- …式
V8引擎
一款專門對JS語言進行解釋和執行的流程虛擬機數據庫
只要V8引擎可以嵌入到不一樣的宿主環境中,那麼就能夠用JS語言來寫各類不一樣領域的應用。npm
起初的做用:
用於Chrome瀏覽器解析JS腳本。json
引擎的優點:
- 強大的編譯和快速執行效率
- 性能很是好
- 歷史包袱輕,沒有同步I/O
- 強大的事件驅動機制
Node模塊化開發
CommonJS規範
- 從文件角度來看,每一個JS文件就是一個模塊
- 從結構上來看,多個JS文件之間能夠相互require
- 在Node.js中,一個模塊中定義的變量、函數等,都只能在這個文件內部有效,當須要今後文件外部引用這些變量、函數時,必須使用exports進行暴露。使用者經過require引用。
模塊標識
當咱們使用require()引入外部模塊時,使用的就是模塊標識瀏覽器
- 內建模塊
- 文件模塊
- 核心模塊
- 由node引擎提供的模塊
- 由node_modules提供的模塊
exports和require怎麼來的?
函數參數服務器
每個js文件都是一個node模塊,同時也是一個匿名自調函數。多線程
當node在執行模塊中的代碼時,他會首先在代碼的最頂部,添加以下代碼:
function (exports, require, module, __filename, __dirname){}
而後在最低端,添加}
。
So:
模塊中的代碼都是包裝在一個函數中執行的,而且在函數執行的同時傳遞了5個實參。
5個實參
- exports
- 該對象用來將函數內部的局部變量或局部函數暴露到外部。
- requires
- module
- 表明的是當前模塊自己,exports就是module的屬性;
- 咱們既能夠用exports導出,也能夠用module.exports導出
- __filename
- __dirname
exports和module.exports的區別
值類型和引用類型
二者區別
exports只能使用.語法來向外暴露內部變量。exports.xxx = xxx;
module.exports既能夠經過.
語法,也能夠直接賦值一個對象。
包和包管理器
package
概念:
Common.JS的報規範容許咱們將一組相關的模塊組合到一塊兒,造成一組完整的工具,這組工具就叫作包。
組成
實際上就是一個壓縮文件,解壓以後還原爲目錄
- package.json包描述文件
- bin 可執行二進制
- lib js代碼
- doc 文檔
- test 單元測試
package.json
描述包的相關信息,以供外部讀取分析。
它是一個JSON格式的文件。
PS:該文件禁止添加註釋。
NPM包管理工具
Node Package Manager
若是頁面中引入node_modules中某個模塊,有先從當前目錄引入,若是沒有,則往上級查找,直到根目錄。
CNPM
淘寶鏡像官網
在官網能夠找到使用方式:
https://npm.taobao.org