Node.js 使用 CommonJS 模塊系統,而在瀏覽器中,則還正在實現 ES 模塊標準。
這意味著在 Node.js(包括webpack) 中使用 require()
,而在瀏覽器中則使用 import。
NodeJs和Chrome中的JS均基于V8引擎,NodeJs甚至可以開發桌面應用(如electron開發的VSCode和WhatsApp)。
環境變量
process
模塊提供了 env 屬性,該屬性承載了在啟動進程時設置的所有環境變量。
process.env.NODE_ENV // 默認為"development"
命令行
命令行模式執行代碼
在命令行中輸入node
進入node環境REPL模式
此時可直接輸入node代碼,也可以輸入.editor
進入多行模式
從命令行獲取參數
node app.js A B
//app.js
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})
//log
0: C:\Program Files\nodejs\node.exe
1: C:\Users\62406\Desktop\other\node\node.js
2: A
3: B
線程與并發
Node Js 底層是C/C++編寫的V8引擎
和libuv
(I/O操作),所謂的單線程只有js執行是單線程,把需要做的I/O交給libuv(多線程),自己馬上返回做別的事情,然后libuv在指定的時刻回調就行了。
線程限制
libuv的線程池默認大小是 4 ,也就是說,同時能有4個線程去做文件I/O工作,剩下的請求會被掛起等待直到線程池有空閑
線程池的大小可以通過 UV_THREADPOOL_SIZE
這個環境變量來改變 或者在nodejs代碼中通過 process.env.UV_THREADPOOL_SIZE
來重新設置。
特點及適用場景
- 優勢
- 單線程,不需要考慮鎖、同步等多線程BUG,適合高并發場景
- 天生契合websocket(socket.io庫)
- 非阻塞且多線程的IO處理適合IO密集型場景
- 劣勢
- 業務邏輯JS單進程,單線程,只支持單核CPU,無法發揮多核CPU優勢,不適用于計算密集型場景
類似的,Python雖然可以多進程(取決于CPU核數),但由于Python GIL(global interpreter lock 全局解釋鎖)的存在,每個進程中都是單線程,因此也不適用于計算密集型場景
- 業務邏輯JS單進程,單線程,只支持單核CPU,無法發揮多核CPU優勢,不適用于計算密集型場景
人為實現sleep(2000)
const time = new Date().getTime();
while(true) {
if(new Date().getTime() - time > 2000) {
break;
}
}
事件
通過events
模塊構建了類似瀏覽器中的事件系統
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
eventEmitter.on('start', number => {
console.log(`開始 ${number}`)
})
eventEmitter.emit('start', 23)
- once(): 添加單次監聽器。
- removeListener() / off(): 從事件中移除事件監聽器。
- removeAllListeners(): 移除事件的所有監聽器。