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(): 移除事件的所有监听器。