Node.js
#Node
特点
单线程
实际:
JS线程
+ uv线程池
+ V8任务线程池
+ V8 Inspector线程
优点:
- 不需要关注多线程的状态同步问题,不需要锁,不需要考虑
死锁
的问题 - 比较高效的利用系统资源
缺点:
- 阻塞会产生更多负面影响
- 解决办法:
-
多进程
- 例:
fs的readFile()模块,为了不阻塞当前的JavaScript主线程,让
libuv
的uv线程池
去进行操作. 主线程就可以做其它操作
- 例:
fs的readFile()模块,为了不阻塞当前的JavaScript主线程,让
-
多线程
-
例: if,else块
function fibnacci (num) {
if (num > 20) {
return num
}
else {
return num - 1
}
}
异步I/O (input/output)
当Node.js执行I/O操作时,会在响应结束后恢复操作,而不是阻塞线程并占用额外内存等待
例1: setTimeout
setTimeout(()=>{
console.log('B')
})
console.log('A')
例2: fs模块
例3: 加密解密等需要比较耗时的线程,也会到
libuv
的uv线程池
进行操作,避免对主线程进行长时间的阻塞
跨平台 libuv
(大部分功能,API)
Node.js跨平台 + JS无需编译环境 (+ Web跨平台 + 诊断工具跨平台)
- (开发成本低) 大部分场景不需要担心跨平台问题
例: net,Socket
const net = require('net')
const socket = new net.Socket('/temp/socket.sock')
Node 使用 ES Module
- 使用
Node
的module.exports
导出,使用ES Module
的import
导入
原生js出错
- 使用
Node
的require
导入,使用ES Module
的export
导出
Node中的this指向问题
在交互模式(cmd中打开node)中,this指向global
在文件模式中,this指向module.exports / exports
文件模式中 this可以代替 exports 对象
let a = 10
exports.a = a
console.log(this === module.exports) // -> true
console.log(this === exports) // -> true
console.log(exports.a) // -> 10
console.log(this.a) // -> 10
module.exports 和 exports的关系
exports对象是module.exports对象的子对象, module包含exports
在文件模式中, module.exports === exports -> true
在交互模式中. exports 不存在, exports 只存在于文件模式中