说说你对Node.js 的理解?优缺点?应用场景?
Node.js是一个开源与跨平台的Javascript运行时环境,在浏览器外运行v8 Javascript引擎,利用事件驱动,非阻塞和异步输入输出模型等技术提高性能
node.js就是一个服务器端的,非阻塞时I/O的、事件驱动的Javascript运行环境
非阻塞异步:
nodejs采用非阻塞I/O机制,在做I/O操作的时候不会造成任何的阻塞,当完成之后,以时间的形式通知执行操作
事件驱动:
事件驱动就是当进来一个新的请求时,请求将会被压入一个事件队列中,然后通过一个循环来检测队列中的事件状态变化,如果检测到有状态变化的事件,那么就会执行该事件对应的处理代码,一般都是回调函数
优缺点:
优点:
- 处理高并发场景性能更佳
- 适合I/O密集型应用,值的是应用在运行极限时,CPU占用率仍然比较低,大部分时间是在做 I/O硬盘内存读写操作
因为Nodejs
是单线程,带来的缺点有:
- 不适合CPU密集型应用
- 只支持单核CPU,不能充分利用CPU
- 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
应用场景:
基于nodejs的特点和弊端,分为引用场景和具体场景
应用场景:
善于I/O,不善于计算,因为nodejs是一个单线程,如果计算同步太多,会阻塞这个线程
大量的并发的I/O,应用程序内部并不需要进行非常复杂的处理
具体场景:
用户表单收集系统,后台管理系统、实时交互
单页面浏览器应用程序
操作数据库、为前端和移动端提供基于json的API
说说 Node. js 有哪些全局对象?
在浏览器javascript中,通常window是全局对象,而nodejs中全局对象是global
在nodejs里,是不可能在最外层定义一个用户代码都是在我们当前模块中,只能在当前模块中使用,但是可以使用exports对象将其传递给模块外部
全局对象分为两类:
真正的全局对象
class:Buffer:处理二进制以及非Unicode编码的数据
process:进程对象,提供有关当前进程的信息和控制
clearInterval、setInterval:设置定时器和清理定时器
global:全局命名空间对象
模块级别的全局变量
__dirname:获取当前文件所在的路径,不包括后面的文件名
__filename:获取当前文件所在的路径和文件名称,包括后面的文件名称
exports:
module.exports
用于指定一个模块所导出的内容,即可以通过require()
访问的内容module:对当前模块的引用,通过
module.exports
用于指定一个模块所导出的内容,即可以通过require()
访问的内容require:用于引入模块、
JSON
、或本地文件。 可以从node_modules
引入模块,可以使用相对路径引入本地模块或JSON
文件,路径会根据__dirname
定义的目录名或当前工作目录进行处理
说说对 Node 中的 process 的理解?有哪些常用方法?
process
对象是一个全局变量,提供了有关当前 Node.js
进程的信息并对其进行控制,作为一个全局变量
进程计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础,是线程的容器
当我们启动一个js文件,实际上就是开启了一个服务进程,每个进程都拥有自己的独立空间地址,数据栈,像另一个进程无法访问当前进程的变量,数据结构,只有数据通信后,进程之间才可以数据共享
常见属性:
process.cwd():返回当前 Node
进程执行的目录
Process.argv:
在终端通过 Node 执行命令的时候,通过
process.argv
可以获取传入的命令行参数,返回值是一个数组:
- 0: Node 路径(一般用不到,直接忽略)
- 1: 被执行的 JS 文件路径(一般用不到,直接忽略)
- 2~n: 真实传入命令的参数
process.env:返回一个对象,存储当前环境相关的所有信息,一般很少直接用到。
process.nextTick(): process.nextTick()
就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行
两者区别在于:
- process.nextTick()会在这一次event loop的call stack清空后(下一次event loop开始前)再调用callback
- setTimeout()是并不知道什么时候call stack清空的,所以何时调用callback函数是不确定的
说说对 Node 中的 fs模块的理解? 有哪些常用方法
fs该模块提供本地文件的读写能力ÿ