首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

15 个常见 Node.js 面试问题及答案

单线程 Node.js 必须是非阻塞,以防止线程阻塞在需要很长时间才能完成任务上,事件循环负责实现这种非阻塞行为,它使用应用程序线程调度挂起任务。...Node.js 在任务完成时通过回调来处理异步函数返回响应。与创建任务事件类似,任务完成后也会发出一个事件。Node.js 需要处理事件添加到事件队列。...如何处理 Node.js 未捕获异常? 我们可以进程级别捕获应用程序未捕获异常。...但是 Node.js 核心模块之一 Cluster 支持 Node.js 应用程序开启多核,允许我们创建多个工作进程,这些进程可以在多个内核上并行运行,并共享一个端口侦听事件。...通过校验和验证包完整性提供更好安全性,保证在某个系统上运行包在任何其他系统工作方式完全相同,这就是为什么选择 yarn 而不是 npm 进行包管理。

1.7K20

Node.js】1430- 15 个常见 Node.js 面试问题及答案

单线程 Node.js 必须是非阻塞,以防止线程阻塞在需要很长时间才能完成任务上,事件循环负责实现这种非阻塞行为,它使用应用程序线程调度挂起任务。...Node.js 在任务完成时通过回调来处理异步函数返回响应。与创建任务事件类似,任务完成后也会发出一个事件。Node.js 需要处理事件添加到事件队列。...如何处理 Node.js 未捕获异常? 我们可以进程级别捕获应用程序未捕获异常。...但是 Node.js 核心模块之一 Cluster 支持 Node.js 应用程序开启多核,允许我们创建多个工作进程,这些进程可以在多个内核上并行运行,并共享一个端口侦听事件。...通过校验和验证包完整性提供更好安全性,保证在某个系统上运行包在任何其他系统工作方式完全相同,这就是为什么选择 yarn 而不是 npm 进行包管理。

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop

互斥原因是JS也可以操作DOM,如果JS线程和GUI线程同时操作DOM,结果就混乱了,不知道到底渲染哪个结果。这带来后果就是如果JS长时间运行,GUI线程就不能执行,整个页面就感觉卡死了。...上述流程我们可以看出,如果主线程长时间被阻塞,定时器回调就没机会执行,即使执行了,那时间也不准了,我们开头那两个例子结合起来就可以看出这个效果: const syncFunc = (startTime...通过结果可以看出,虽然我们先调用asyncFunc,虽然asyncFunc写是2秒后执行,但是syncFunc执行时间太长,达到了5秒,asyncFunc虽然在2秒时候就已经进入了事件队列,但是主线程一直在执行同步代码...所以再次强调,写代码时一定不要长时间占用主线程。 引入微任务 前面的流程图我为了便于理解,简化了事件队列,其实事件队列里面的事件还可以分两类:宏任务和微任务。...,检查事件队列时先执行微任务 同步代码运行结果是“1,3” 然后检查微任务队列,输出“5,4” 最后执行宏任务队列,输出“2” Node.jsEvent Loop Node.js运行在服务端js,

90541

浏览器层面优化前端性能(1):Chrom组件与进程线程模型分析

,那么这个时候就需要浏览器裁决如何生效哪个线程执行结果,当然我们可以通过解决上面的问题。...引擎是单线程, 如果处于阻塞线程状态就会影响记计时准确)因此通过单独线程计时并触发定时(计时完毕后,添加到事件队列,等待JS引擎空闲后执行)注意,W3C在HTML标准规定,规定要求setTimeout...异步http请求线程在XMLHttpRequest在连接后是通过浏览器新开一个线程请求检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,这个回调再放入事件队列。...,macrotask可称为taskmacrotask(又称之为宏任务),macrotask事件都是放在一个事件队列,而这个队列由事件触发线程维护 可以理解是每次执行栈执行代码就是一个宏任务(包括每次从事件队列获取一个事件回调并放到执行栈执行...Node.js事件循环与线程Node.js也是单线程Event Loop,但是它运行机制不同于浏览器(和浏览器是完全不相同东西,关键还是线程架构不同)Node.js 采用 V8 作为 js 解析引擎

83310

浏览器层面优化前端性能(1):Chrom组件与进程线程模型分析

,那么这个时候就需要浏览器裁决如何生效哪个线程执行结果,当然我们可以通过解决上面的问题。...引擎是单线程, 如果处于阻塞线程状态就会影响记计时准确)因此通过单独线程计时并触发定时(计时完毕后,添加到事件队列,等待JS引擎空闲后执行)注意,W3C在HTML标准规定,规定要求setTimeout...异步http请求线程在XMLHttpRequest在连接后是通过浏览器新开一个线程请求检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,这个回调再放入事件队列。...,macrotask可称为taskmacrotask(又称之为宏任务),macrotask事件都是放在一个事件队列,而这个队列由事件触发线程维护 可以理解是每次执行栈执行代码就是一个宏任务(包括每次从事件队列获取一个事件回调并放到执行栈执行...Node.js事件循环与线程Node.js也是单线程Event Loop,但是它运行机制不同于浏览器(和浏览器是完全不相同东西,关键还是线程架构不同)Node.js 采用 V8 作为 js 解析引擎

73110

Nodejs探秘:深入理解单线程实现高并发原理

并且,通过底层C/C++源码学习,剖析Nodejs实现高并发之一------事件循环实现。...· Node.js 标准库,这部分是由 Javascript 编写,即我们使用过程中直接能调用 API。在源码 lib 目录下可以看到。...我们在 Javascript 调用方法,最终都会通过 process.binding 传递到 C/C++ 层面,最终由他们执行真正操作。Node.js 即这样与操作系统进行互动。...1、每个Node.js进程只有一个主线程在执行程序代码,形成一个执行栈(execution context stack)。 2、主线程之外,还维护了一个"事件队列"(Event queue)。...主线程不断检查事件队列是否有未执行事件,直到事件队列中所有事件都执行完了,此后每当有新事件加入到事件队列,都会通知主线程按顺序取出交EventLoop处理。

3K41

分享 10 道 Nodejs EventLoop 和事件相关面试题

—— 斯大林 通过对以下 10 个面试题分享,助您更好理解 Node.js 事件和 EventLoop 相关知识 作者简介:五月君,Nodejs Developer,慕课网认证作者,热爱技术、喜欢分享...总结起来一句话概括,事件轮询是 JS 实现异步具体解决方案,同步代码直接执行,异步函数或代码块先放在异步队列,待同步函数执行完毕,轮询执行异步队列函数。...一旦这个工作完成,将会触发相应回调响应结果返回给主线程 Event Loop 响应返回给客户端 下图展示了 Node.js EventLoop 体系结构 ?...在操作方式上 select 采用了线性遍历来查找,链接多了之后可以想象一下在一个诺大数组每次通过遍历来锁定一个链接,是多么消耗性能。...,在 Node.js 每次事件循环都会经过六个阶段,当进入 timers 阶段时,开始处理 setTimeout/setInterval 这两个函数,在这个阶段主线程会检查当前时间是否满足定时器条件

1.3K50

NodeJs事件驱动和非阻塞机制详解

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。...NodeJs事件驱动机制 Nginx服务原理类似,Node采用事件驱动运行方式。不过nginx式多进程单线程,而Node通过事件驱动方式处理请求时无需为每一个请求创建额外线程。...,每次循环运行就是一个Tick周期,每个Tick周期中会从事件队列查看是否有事件需要处理,如果有就取出事件并执行相关回调函数。...在执行代码时候,主线程从上往下依次执行,遇到有需要回调地方,就将此处加入到事件队列,然后主线程继续往下走,直到运行结束以后,才去执行事件队列回调 node去执行事件队列事件时,如果遇到回调...node是一个单线程多进程。node进程创建一个循环,每个循环就是一个周期,在循环中会从事件队列里查看是否有事件需要处理,如果有就去除事件并执行相关函数。

2.5K20

JavaScript执行机制

相关概念浏览器我们都知道,是典型进程模型,但是JavaScript运行时却是单线程架构,我们从浏览器出发看看具体JavaScript运行时在浏览器处于什么位置。...Process-per-site:同域名范畴网站放在一个进程,比如www.baidu.com和www.baidu.com/fanyi就属于同一个域名范畴内,无论其是否有互相打开关系。...通过单独线程计时并触发定时(计时完毕后,添加到事件触发线程事件队列,等待JS引擎空闲后执行),这个线程就是定时触发器线程,也叫定时器线程。...因此,长时间运行回调可以允许轮询阶段运行长于计时器阈值时间。NodeJS事件循环各个阶段概览:timers:此阶段执行由 setTimeout 和 setInterval 设置回调。...在每次事件循环运行之间,Node.js 会检查它是否正在等待任何异步 I/O 或 timers,如果没有,则将其干净地关闭。

32522

JavaScript 面试要点: Event Loop (事件循环)

调用栈执行环境可以不断添加,知道发生栈溢出,即超过所能利用最大内存。 以上都是同步代码,当异步代码执行时,会使用非阻塞特点实现机制——事件队列。...JavaScript 引擎遇到异步事件后并不会一直等待其返回结果,而是这个事件挂起,继续执行执行栈其他任务。...被放入事件队列后不会立即执行器回调,而是等待当前执行栈中所有任务都执行完毕,主线程属于闲置状态时,主线程回去查找事件队列是否有任务。...,执行对应任务,并把不同事件放在不同队列中等待主线程执行。...# 事件循环模型 libuv 引擎事件循环模型: 从模型可以大致看出,Node.js 事件循环顺序: 外部输入数据 -> 轮询阶段(poll) -> 检查阶段(check) -> 关闭事件回调阶段

65920

浏览器和Node.jsEventLoop事件循环机制知多少?

在EventLoop事件队列中有宏任务和微任务队列,分析宏任务和微任务运行机制,有助于我们理解代码在浏览器执行逻辑。 那么,我们得思考几个问题: 浏览器EventLoop发挥着什么作用?...我们知道JS在单线程上执行所有的操作,虽然是单线程,但是总是能够高效地解决问题,并且会给我们带来一种『多线程』错觉。这其实是通过一些高效合理数据结构达到这种效果。...事件队列(Event Queue) 事件队列:负责函数发送到队列中进行处理。事件执行队列符合数据结构队列,先进先出特性,当先进入事件先执行,执行完毕先弹出。...事实上,EventLoop通过内部两个队列实现Event Queue放进来异步任务。...,可以一个错误传递给用户,但这只允许在用户代码被执行完毕后执行。

1.5K20

一次搞懂Event loop

setImmediate I/O UI渲染 Tips 我们通过node运行一个js文件,如果没有可执行事件事件队列进程就会退出,那么怎么不让它退出呢?...setInterval方法,这货会一直循环建立新事件,这样能够保证node进程不退出 监听 beforeExit 事件,通过process.on('beforeExit', handle) 这个事件在...node进程退出前会触发,但是如果这里面的handle包含了一个可以生成异步事件操作,则node进程也不会退出。...手动触发process.exit(EXIT_CODE)不会触发该事件 setInterval会导致node进程不能正常退出,但是如果希望即使有setInterval也能正常退出怎么办(有一些循环并不希望挂起...process.on('exit', handle),handle里异步事件不能执行 exit事件在手动执行process.exit(EXIT_CODE)后,或者event loop没有可执行事件队列

1K80

Nodejs探秘:深入理解单线程实现高并发原理

在源码 lib 目录下可以看到。 Node bindings,这一层是 Javascript 与底层 C/C++ 能够沟通关键,前者通过 bindings 调用后者,相互交换数据。...深入浅出上一幅图: 具体来说,当我们调用 fs.open 时,Node.js 通过 process.binding 调用 C/C++ 层面的 Open 函数,然后通过它调用 Libuv 具体方法...我们在 Javascript 调用方法,最终都会通过 process.binding 传递到 C/C++ 层面,最终由他们执行真正操作。Node.js 即这样与操作系统进行互动。...主线程不断检查事件队列是否有未执行事件,直到事件队列中所有事件都执行完了,此后每当有新事件加入到事件队列,都会通知主线程按顺序取出交EventLoop处理。...、Nodejs与操作系统交互,我们在 Javascript 调用方法,最终都会通过 process.binding 传递到 C/C++ 层面,最终由他们执行真正操作。

1.8K30

Nodejs探秘:深入理解单线程实现高并发原理

Node.js 标准库,这部分是由 Javascript编写,即我们使用过程中直接能调用 API。在源码 lib 目录下可以看到。...我们在 Javascript调用方法,最终都会通过 process.binding 传递到 C/C++ 层面,最终由他们执行真正操作。Node.js 即这样与操作系统进行互动。...1、每个Node.js进程只有一个主线程在执行程序代码,形成一个执行栈(execution context stack)。 2、主线程之外,还维护了一个"事件队列"(Event queue)。...主线程不断检查事件队列是否有未执行事件,直到事件队列中所有事件都执行完了,此后每当有新事件加入到事件队列,都会通知主线程按顺序取出交EventLoop处理。...因为是源码解析,所以具体我就不多说,大家只可以看文档: 官方文档 总结: 1、Nodejs与操作系统交互,我们在 Javascript调用方法,最终都会通过 process.binding 传递到

1.1K20

在chromev8JavaScript事件循环分析

被放入事件队列不会立刻执行其回调,而是等待当前执行栈所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。...我们可以通过使用 Loupe(Loupe是一种可视化工具,可以帮助您了解JavaScript调用堆栈/事件循环/回调队列如何相互影响)工具来了解上面代码执行情况。...对于事件队列,其处理是异步代码执行,遇到异步事件不会等待它返回结果,而是这个事件挂起,继续执行执行栈其他任务。...当异步事件返回结果,将它放到事件队列,被放入事件队列不会立刻执行起回调,而是等待当前执行栈中所有任务都执行完毕,主线程空闲状态,主线程会去查找事件队列是否有任务,如果有,则取出排在第一位事件,并把这个事件对应回调放到执行栈...,而在浏览器不崩溃前提下,通过执行栈与事件队列在宏任务与微任务左右横跳,从而令浏览器事件不形成死锁,保证永不阻塞。

3.9K40

「前端进阶」从多线程角度来看 Event Loop

引子 几乎在每一本JS相关书籍,都会说JS是 单线程,JS是通过事件队列 (EventLoop)方式实现异步回调。...进程就好比工厂车间,它代表CPU所能处理单个任务。进程之间相互独立,任一时刻,CPU总是运行一个 进程,其他 进程处于非运行状态。CPU使用时间片轮转进度算法实现同时运行多个 进程。 线程 ?...进程是cpu资源分配最小单位(是能拥有资源和独立运行最小单位) 线程是cpu调度最小单位(线程是建立在进程基础上一次程序运行单位,一个进程可以有多个线程) 不同 进程之间也可以通信,不过代价较大...,这些功能模块实际上是通过进程实现。...当我们同步任务执行完, JS引擎线程会询问 事件触发线程,在 事件队列是否有待执行回调函数,如果有就会加入到执行栈交给 JS引擎线程执行 用一张图解释: ?

65110

揭秘 Node.js 底层架构

Node.js 量身打造,用 C 写跨平台异步 I/O 库,提供了非阻塞文件系统、DNS、网络、子进程、管道、信号、轮询和流式处理机制: 对于无法在操作系统层面异步去做工作,通过线程池完成,...此外,Node.js 事件循环、事件队列也都是由 libuv 提供: Libuv provides the entire event loop functionality to NodeJS including...另一方面,通过 Bindings 也可以复用可靠老牌开源类库,而不必手搓所有底层模块 以文件 I/O 为例,读取当前 JS 文件内容并输出到标准输出: // readThisFile.js const...六.运行原理 首先,编写 JavaScript 代码由 V8 引擎运行运行中注册事件监听会被保留下来,在对应事件发生时收到通知 网络、文件 I/O 等事件产生时,已注册回调函数排到事件队列...),到号顾客订单会被传给经理(libuv),经理订单分配给咖啡师(worker 线程),咖啡师用不同原料和工具(底层依赖 C/C++模块)制作订单要求各种咖啡,一般会有 4 个咖啡师值班,高峰时候可能会增加一些

2.2K10

Node.js 事件循环完整指南

线程可以看作是我们 CPU 必须执行操作单元。许多不同线程可以与程序单个进程相关联。下面这个图可以帮你在脑海中形成这个想法: ?...如果仔细研究一下线程是如何工作,我们看到 OS 调度程序可以识别 CPU 什么时等待其他资源执行一个作业,由此可以分配它同时执行其他操作。...Feeding Node.js 示例文件 特别是,我首用一个简短解释,说明在事件循环 tick 过程中发生事情,然后再以更深入方式探讨这些阶段。 ?...这些操作主要分为三种类型: 等待定时器操作(setTimeout(),setInterval(),setImmediate()) 等待处理操作系统任务 等待需要长时间运行操作 我稍后会详细介绍这些内容...步骤2:执行一个 tick 对于每个循环迭代,可以分为以下阶段: 阶段1: Node 查看其内部挂起计时器集合,并检查传递给 setTimeout() 和 setInterval() 回调函数是否准备好在计时器过期情况下被调用

1.5K30

js Event Loop 运行机制

引擎是单线程, 如果处于阻塞线程状态就会影响记计时准确) 因此通过单独线程计时并触发定时(计时完毕后,添加到事件队列,等待JS引擎空闲后执行) 注意:W3C在HTML标准规定,规定要求setTimeout...异步http请求线程 在XMLHttpRequest在连接后是通过浏览器新开一个线程请求 检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,这个回调再放入事件队列。...先执行栈任务,执行完毕后,检查队列是否为空,不为空,队列任务压入执行栈执行。直到栈和队列均为空。 js渲染引擎Event Loop如下图 ?...node运行环境进程和线程 Node.js 是一个基于 Chrome V8 引擎 JavaScript 运行环境。他目标就是解析js代码,让他能运行起来。...参考文献 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 Node.js线程和进程详解

1.7K40

深入理解JavaScriptEvent-Loop机制

参与JS代码执行过程线程有4个: JS引擎线程:解析和执行JS脚本主线程 事件触发线程:浏览器内核进程,主要用于控制事件(比如:键盘事件),当监听到事件触发,事件触发线程会将,事件处理函数push到事件队列...HTTP异步请求线程:通过监听XMLHttpRequest连接readyState状态变更,将该状态回调函数push到事件队列,等待执行。...宏任务(macro-task)是离散独立任务,比如创建DOM对象,执行全局JavaScript代码,宏任务执行完成之后可以执行其他事件,比如浏览器垃圾回收。...常见微任务:Promise, MutationObserver,process.nextTick(Node.js) 事件循环通过两个原则处理浏览器事件,一是单线程处理方式,二是事件在执行过程不会被其他事件中断...检查是否需要更新UI视图,如果是则执行(5),否则返回(1)开始新循环过程。 UI页面渲染,返回(1)开始新循环过程。

61120
领券