NodeJs

查看文档

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 全局解释锁)的存在,每个进程中都是单线程,因此也不适用于计算密集型场景
人为实现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(): 移除事件的所有监听器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容