nodejs 是什么
nodejs is a JavaScript runtime built on Chrome's V8
nodejs 并不是一門語言,而是一個運行環(huán)境
特點:
- 事件驅(qū)動
- 非阻塞 I/O
非阻塞I/O
- 阻塞:I/O時進程休眠等待I/O完成后進行下一步。
- 非阻塞:I/O時函數(shù)立即返回,進程不等待I/O完成。
事件驅(qū)動
- I/O等異步操作結(jié)束后的通知
- 觀察者模式
為什么前端偏愛nodejs
- 前端職責范圍變大,統(tǒng)一開發(fā)體驗
- 在處理高并發(fā),I/O密集場景性能優(yōu)勢明顯
CPU密集 VS I/O密集
- CPU密集: 壓縮、解壓、加密、解密
- I/O密集: 文件操作、網(wǎng)絡操作、數(shù)據(jù)庫
web 常見場景
- 靜態(tài)資源讀取
- 數(shù)據(jù)庫操作
- 渲染頁面
高并發(fā)應對之道
- 增加機器數(shù)
- 增加每臺機器的CPU數(shù)——多核
進程
- 進程:是計算機中的程序關于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位
- 多進程:啟動多個進程,多個進程可以一塊執(zhí)行多個任務
nodejs 環(huán)境
-
nodejs 官網(wǎng):
https://nodejs.org/en/ - CommonJS: 模塊化規(guī)范
- global: 全局對象,nodejs 沒有 DOM、BOM,全局是global
- process: 進程
一個栗子

image
nodejs 自動幫我們做了,外面包了一個函數(shù),實現(xiàn)模塊化。
CommonJS
- 每個文件是一個模塊,有自己的作用域,比如上面栗子,外面包裹了一個函數(shù),就變成了局部作用域了。
- 在模塊內(nèi)部
module變量代表模塊本身。 -
module.exports屬性代表模塊對外的接口
require 規(guī)則
-
/表示絕對路徑,./表示相對于當前文件的相對路徑 - 支持
js、json、node拓展名,不寫的話就會依次嘗試。 - 不寫路徑則認為是
build-in內(nèi)部自帶的模塊或者各級node_modules內(nèi)的第三方模塊。
require 特性
- module 被加載的時候執(zhí)行,加載后緩存,也就第一次加載并執(zhí)行,第二次有緩存就不加載了。
- 一旦出現(xiàn)某個模塊被循環(huán)加載,就只輸出已執(zhí)行的部分,還未執(zhí)行的部分不會輸出。(太繞了,要避免循環(huán)引用)
nodejs 內(nèi)置模塊
-
fs文件系統(tǒng)模塊,用來做文件的讀寫,
第三方模塊 node_modules
-
chalk模塊,可以讓輸出帶顏色。image
image
module.exports 與 exports 的區(qū)別
const exports = modules.exports
//exports 是 module.exports 的快捷方式
exports.test = 100;
//可以給 exports 添加屬性。
exports = {
test: 150
} //這是錯誤的用法,因為改變了 exports 的指向,模塊輸出找不到。
module.exports = {
test: 200
} //這是可以的,因為輸出的模塊是 module.exports
global 全局對象
- CommonJS
- Buffer:處理二進制數(shù)據(jù)流
- process:進程
- console
- timer
把變量賦給 global 對象作為屬性,則所有的文件都能拿到該變量。
timer
-
setImmediate:下一個事件隊列的隊首。 -
setTimeout:定時執(zhí)行,最快是在兩個事件隊列之間。 -
process.nextTick:當前事件隊列的隊尾。
來看一下三個的執(zhí)行順序

image

image
可以看到,執(zhí)行順序是 nextTick 比 setImmediate要早,而setTimeout由設定的時間來決定,如果時間為0,則是在兩個事件隊列之間。

