process
process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程。作为一个对象,它对于 Node.js 应用程序始终是可用的,故无需使用 require()
process.env 属性返回一个包含用户环境信息的对象
export 和 module.export 的区别
在 node 的 js 模块里可以直接调用 exports 和 module 两个“全局”变量,但是 exports 是 module.exports 的一个引用
exports = module.exports = {};
exports 是 module.exports 的一个引用
module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
require 引用模块后,返回的是 module.exports 而不是 exports!!!!!
exports.xxx 相当于在导出对象上挂属性,该属性对调用模块直接可见
exports = 相当于给 exports 对象重新赋值,调用模块不能访问 exports 对象及其属性
如果此模块是一个类,就应该直接赋值 module.exports,这样调用者就是一个类构造器,可以直接 new 实例
参考【https://www.jianshu.com/p/e452203d56c4】
REPL环境
REPL(Read-eval-print-loop):交互式解析器
进入node,即进入了REPL环境,在命令窗口输入node
在REPL环境下,可以定义和运行变量、函数、对象
POSIX标准
POSIX,全称为可移植性操作系统接口,是一种关于信息技术的IEEE标准。它包括了系统应用程序接口(简称API),以及实时扩展[C语言]
参考【https://www.cnblogs.com/1130136248wlxk/articles/5308863.html】
nodejs回调函数
Node.js 异步编程的直接体现就是回调 执行异步操作的函数将回调函数作为最后一个参数
回调函数接收错误对象作为第一个参数
我们不需要等待文件读取完,就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能
阻塞和非阻塞
1.阻塞:就像单线程cpu一样,一个任务由多个小任务组成,而且只能一个任务接一个任务流程的往下走,谁靠前谁先执行,执行完了进行下一个,如果遇到错误,下面的小任务就不能做了,一直卡住。
2.非阻塞:就像多线程cpu一样,一个任务由多个小任务组成,可以分开线程来做,每个线程做分配到的任务,完成了对应的任务就行,某个线程的任务没做完那就做报对应的错,其他的不受影响
stream (流)
流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface)。 stream 模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。
Node.js 提供了多种流对象。 例如, http请求 和process.stdout 就都是流的实例。
流可以是可读的、可写的,或是可读写的。所有的流都是 EventEmitter的实例。
stream 模块可以通过以下方式引入:
const stream = require('stream');
events (事件)
大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,其中某些类型的对象(触发器)会周期性地触发命名事件来调用函数对象(监听器)
所有能触发事件的对象都是 EventEmitter 类的实例。 这些对象开放了一个 eventEmitter.on() 函数,允许将一个或多个函数绑定到会被对象触发的命名事件上
当 EventEmitter 对象触发一个事件时,所有绑定在该事件上的函数都被同步地调用。 监听器的返回值会被丢弃
eventEmitter.on() 方法用于注册监听器
eventEmitter.once() 方法为指定事件注册一个单次监听器
eventEmitter.emit(event,callback) 方法用于触发事件
eventEmitter.removeListener(event,callback) 移除指定事件的某个监听器