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

15个node.js经典面试题和答案,核心基础

Node.js 提供了简单的开发,因为它的非阻塞 I/O 和基于偶数的模型导致较短的响应时间和并发处理,这与开发人员必须使用线程管理的其他框架不同。...因此,例如,如果需要进行一些网络调用,它将被安排在事件循环中,而不是主线程(单线程)中。 如果有多个这样的 I/O 调用,每个调用都会相应地排队分别执行(除了主线程)。...carbon (1).png 6、Node.js 中有多少种 API 函数 ? 有两种类型的 API 函数: 异步、非阻塞函数:主要是 I/O 操作,可以从主循环中分叉出来。...同步的、阻塞的函数 :主要是影响主循环中运行的进程的操作。 7、你是如何管理 Node.js 项目中的包 ? 它可以由许多软件包安装程序及其相应的配置文件进行管理。...10、Node.js中的fork是什么 ? 通常,fork 用于生成子进程。 node 中,它用于创建一个新的 v8 引擎实例来运行多个 worker 来执行代码。

1.8K20

深入 Node.js 事件循环架构

让我们从头开始深入了解 Node.js 内核中发生了什么? 处理器可以一次处理一件事,也可以一次并行地处理多个任务(multitasking)。...如果你执行从 Node.js调用的 JavaScript 同步方法,它将始终主线程中运行。...这也就是:Node.js 并发地执行异步方法。 Node.js 使用一组预先分配的线程,称之为线程池,如果我们没有指定要打开的线程数,它默认就是使用 4 个线程。...03 — APIs 哪些 API 对应于哪种方式呢?(线程,Epoll) 所有 fs.* 方法使用 uv thread pool,除非是同步方法。阻塞调用由线程完成,完成后将信号发送回事件循环。...Pipe 管道连接两端:一端是线程,当它完成时,往管道中写入数据,另一端 Epoll 循环中等待,当它获取到数据时,Epoll 循环唤醒。因此 pipe 是由 Epoll 响应的。

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

JavaScript——事件循环机制

JavaScript是单线程的,单线程是指 js引擎中解析和执行js代码的线程只有一个(主线程),每次只能做一件事情,然而ajax请求中,主线程等待响应的过程中回去做其他事情,浏览器先在事件表注册ajax...的回调函数,响应回来后回调函数被添加到任务队列中等待执行,不会造成线程阻塞,所以说js处理ajax请求的方式是异步的。...Node.js采用V8作为js的解析引擎,而I/O处理方面使用了自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的API,事件循环机制也是它里面的实现...解析后的代码,调用Node API。 libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。...pending callbacks 阶段:处理一些上一轮循环中的少数未执行的 I/O 回调 idle, prepare 阶段:仅node内部使用 poll 阶段:获取新的I/O事件, 适当的条件下node

300

带你详细了解 Node.js 中的事件循环

事件循环的六个阶段 当 Node.js 启动时,它会初始化事件循环,处理提供的脚本,同步代码入栈直接执行,异步任务(网络请求、文件操作、定时器等)调用 API 传递回调函数后会把操作转移到后台由系统内核处理...idle, prepare idle, prepare 阶段是给系统内部使用,idle 这个名字很迷惑,尽管叫空闲,但是每次的事件循环中都会被调用,当它们处于活动状态时。这一块的资料介绍也不是很多。...包含 Microtask 的事件循环流程图 浏览器的事件循环中,把任务划分为 Task、Microtask,前端培训 Node.js 中是按照阶段划分的,上面我们介绍了 Node.js 事件循环的...Node.js v11.x 之前,当前阶段如果存在多个可执行的 Task,先执行完毕,再开始执行微任务。... Node.js 的文档中也建议开发者尽可能的使用 setImmediate(),也更容易理解。

2.1K30

前端基础-Node模块化及CommonJS规范

Electron 跨平台的桌面应用框架: https://electronjs.org/ 4.1 CommonJS规范的由来 JS 的表现的表现能力取决于宿主环境提供的API, web1.0 时代..., W3C 组织提供了浏览器的规范支持, web2.0 时代, 随着HTML5的发展, 更多的标准API 出现在了浏览器中, 但是, 在后端 JS 中标准的制定纹丝不动 ; 由 Mozilla 工程师...4.2 CommonJS 的模块规范 CommonJS对模块的定义十分简单,主要分为: 1、模块引用: 使用 require() 方法引入一个模块API ; 2、模块定义: 模块中使用 exports...= '/getnames'){ // 业务层模块的调用 // 将请求对象及响应对象传入业务层方法,在业务层做http响应处理...// 解决:每次循环中形成一个独立的作用域保留i的值, // 当异步函数调用时,获取到的是独立作用域中的

70130

记一次Node项目的优化

相关环境 由于是一个几年前的项目,所以使用的是Express+co这样的。 因为早年Node.js版本为4.x,遂异步处理使用的是yield+generator这种方式进行的。...Node.js版本由于前段时间的升级,现在为8.11.1,这让我们可以合理的使用一些新的语法来简化代码。...是应该在循环外层直接获取所有的item,直接在内存中判断元素是否存在 还是环中依次调用Redis进行获取某个item是否存在呢?...这里有一点小建议可供参考 如果是SortedSet,建议环中使用zscore进行判断(这个时间复杂度为O(1)) 如果是Set,如果已知的Set基数基本都会大于循环的次数,建议环中使用sismember...此时第一个集合的异步调用会占用很多的时间,而如果我们第二个集合的数据获取中不依据第一份数据进行过滤的话,就会造成一些无效的请求(重复的数据获取)。

59510

Node.js的事件循环

介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...因为它阐明了 Node.js 如何做到异步且具有非阻塞的 I/O,所以它基本上阐明了 Node.js 的“杀手级应用”,正是这一点使它成功了。...通常,大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用无限的循环或繁重的处理来阻止整个浏览器的网页。 该环境管理多个并发的事件循环,例如处理 API 调用。...此时,调用堆栈如下所示: 这是程序中所有函数的执行顺序: 为什么会这样呢? 消息队列 当调用 setTimeout() 时,浏览器或 Node.js 会启动定时器。...消息队列中,用户触发的事件(如单击或键盘事件、或获取响应)也会在此排队,然后代码才有机会对其作出反应。类似 onLoad 这样的 DOM 事件也如此。

2.7K20

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

写在前面 无论是浏览器端还是服务端Node.js,都在使用EventLoop事件循环机制,都是基于Javascript语言的单线程和非阻塞IO的特点。...每当调用事件队列(Event Queue)中的异步函数时,都会将其发送到浏览器API。根据调用栈收到的命令,API开始自己的单线程操作。...比如,事件执行队列操作setTimeout事件时,会现将其发送到浏览器对应的API,该API会一直等到约定的时间将其送回调用栈进行处理。...Node.js的EventLoop Node.js官网的定义是:当 Node.js 启动后,它会初始化事件循环,处理已提供的输入脚本(或丢入 REPL,本文不涉及到),它可能会调用一些异步的 API、调度定时器...因此,微任务并不像之前描述的每一次EventLoop后执行处理,而是JS函数调用栈清空后处理。

1.5K20

面试官问:Node 与底层之间如何执行异步 IO 调用

.node 比如 Node 源码lib目录下的 fs.js 就是 native 模块,而fs.js调用的 src 目录下的 node_fs.cc 就是内建模块。... linux 下通过 epoll 实现这个过程,也就是由 libuv 自行实现。 IOCP 的另一个应用场景之前Node.js进程与线程那篇文章也有写过。...本文使用到线程池的地方: Node 中,无论是 *nix 还是 Window 平台。内部完成 I/O 任务的都有用到线程池。 libuv 目前使用了一个全局的线程池,所有的循环都可以往其中加入任务。.../O调用流程 对比图中两段经典api代码(server.listen和fs.open,选择两种api的原因:网络 I/O 代表和文件 I/O 代表)和之前 libuv 图片,我们来一起理解异步I/O调用流程...★Node.js 中经典的代码调用方式:都是从 JavaScript 调用 Node 核心模块,核心模块调用 C++ 内建模块,内建模块通过 libuv 进行系统调用

1.1K20

异步,同步,阻塞,非阻塞程序的实现

什么是异步,同步,阻塞,非阻塞 写这篇文章前,我对这四个概念是非常模糊的。 同步,异步 异步同步的差异,在于当线程调用函数的时候,线程获取消息的方式....如果是同步,线程会等待接受函数的返回值(或者轮函数结果,直到查出它的返回状态和返回值)。如果是异步,线程不需要做任何处理,函数执行完毕后会推送通知或者调用回调函数。...线程同步调用下,也能非阻塞(同步轮非阻塞函数的状态),异步下,也能阻塞(调用一个阻塞函数,然后函数中调用回调,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞的sleep。...web项目中,这是很可怕的。所以我们需要引入非阻塞。非阻塞就是为了让一个响应的操作,不影响另一个响应。否则,当A用户访问某个耗时巨大的网页时,B用户只能对着白板发呆。...上面的代码中,一个while循环中timer的状态。由于timer存在于wait中。所以需要把timer“提取”出来。

7.5K10

Node中的事件循环和异步API

1.1 异步I/O Node中,JS单线程中执行的没错,但是内部完成I/O工作的另有线程池,使用一个主进程和多个I/O线程来模拟异步I/O。...idle, prepare: 仅内部使用。 poll: 获取新的I/O事件;node会在适当条件下阻塞在这里。 check: 执行setImmediate()设定的回调。...1.3 请求对象 对于Node中的异步I/O调用而言,回调函数不由开发者来调用,从JS发起调用到I/O操作完成,存在一个中间产物,叫请求对象。...JS发起调用后,JS调用Node的核心模块,核心模块调用C++内建模块,內建模块通过libuv判断平台并进行系统调用。...进行系统调用时,从JS层传入的方法和参数都被封装在一个请求对象中,请求对象被放在线程池中等待执行。JS立即返回继续后续操作。

1.6K30

字节大佬带你深入分析Node.js的底层原理

首先主进程 fork 多个子进程处理。 然后每个子进程里调用 listen。 调用 listen 函数的时候,子进程会给主进程发送一个消息。...文件 10.1 文件操作 Node.js 中文件操作分为同步和异步模式,同步模式就是主进程中直接调用文件系统的 API,这种方式可能会引起进程的阻塞,异步方式是借助了 Libuv 线程池,把阻塞操作放到子线程中去处理...我们先看一下轮询模式的实现,轮询模式比较简单,他是使用定时器实现的,Node.js 会定时执行回调,回调中比较当前文件的元数据和上一次获取的是否不一样,如果是则说明文件改变了。...当文件发生改变的时候,我们可以调用 read 接口获取哪些文件发生了改变,inotify 通常结合 epoll 来使用。...listen 函数其实是对网络 API 的封装: 首先获取一个 socket。 然后绑定地址到该 socket 中。 接着调用 listen 函数把该 socket 改成监听状态。

2.1K30

Node.js初探(一)——fs、path、http

1、准备工作 (1)浏览器中的JSJS核心语法(ECMAScript)+WebAPI (2)为什么JS可以浏览器中执行?...浏览器也是一个运行环境,执行JS:V8引擎+内置API 内置API:由运行环境提供的特殊的接口,只能在所属的运行环境中被调用;包括DOM+BOM+Canvas+XMLHttpRequest+JS内置对象...的后端运行环境 Node.js中无法调用DOM和BOM等浏览器内置API,因为Node.js是一个单独的运行环境 (2)学习路径:JS基础语法+Node.js内置模块(fs,path,http)+第三方...API模块(express, mysql) 3、Node.js环境中执行JS代码 node JS代码存放路径 4、终端中的快捷键 ⬆️ 上次所执行的命令 tab键.../,会自动忽略,而使用+进行拼接时,不能识别并忽略./ (2)path.basename(path[,ext]) 从path文件路径中,获取到文件名称,如果有ext扩展名,则获取到去掉扩展名的文件名称

1.2K30

Node.js的底层原理

这个是Cluster模块的使用例子 1 主进程调用fork创建子进程 2 子进程启动一个服务器 通常来说,多个进程监听同一个端口会报错,我们看看Node.js里是怎么处理这个问题的。...1 首先主进程fork多个子进程处理。 2 然后每个子进程里调用listen。 3 调用listen函数的时候,子进程会给主进程发送一个消息。...文件 文件操作 Node.js中文件操作分为同步和异步模式,同步模式就是主进程中直接调用文件系统的api,这种方式可能会引起进程的阻塞,异步方式是借助了Libuv线程池,把阻塞操作放到子线程中去处理,...我们先看一下轮询模式的实现,轮询模式比较简单,他是使用定时器实现的,Node.js会定时执行回调,回调中比较当前文件的元数据和上一次获取的是否不一样,如果是则说明文件改变了。 ?...3 当文件发生改变的时候,我们可以调用read接口获取哪些文件发生了改变,inotify通常结合epoll来使用。 接下来我们看看Node.js中是如何基于inotify机制 实现文件监听的。 ?

1.9K20

Node.js中发出HTTP请求的7种方法

} 继续之前,请确保已在计算机上安装了最新的LTS版本的Node.js和npm。...例如,我们可以同时调用伪造的REST API来一次获取两个待办事项信息: const axios = require('axios'); axios.all([ axios.get('https...5.SuperAgent SuperAgent是另一个类似于Axios的流行HTTP库,用于Node.js和浏览器中发出AJAX请求。 就像Axios一样,它会将响应数据解析为JSON,这非常酷。...以下代码段将调用我们假的REST API获取待办事项信息: const got = require('got'); got('https://jsonplaceholder.typicode.com...以下是调用我们的假REST API使用Node-fetch模块获取待办事项信息的代码段: const fetch = require('node-fetch'); fetch('https://jsonplaceholder.typicode.com

24.5K20

使用Multicall 加速 DeFi查询调用

如果我们想同时获取大量数据,用来仪表板上显示或进行分析,我们必须调用合约的不同函数或者用不同参数调用相同函数, 这些都可能会导致查询时间很长。...Multicall[5]是一个 npm 软件包,可将多个 HTTP 调用分为一个组。...用这个方式,之前想从n个不同的请求中获取的数据,现在可以发送 HTTP 请求之前对它们进行分组,然后进发送一个请求,从而缩短了请求响应时间,并降低了 eth_call 调用的次数。...为此,我们通过调用函数 getAccountLiquidity 来查询 Compound 协议。我们将使用 1,000 个不同的地址来获取所有地址的信息。...调用合约 常规循环调用使用传统方法进行测试,我们将遍历 1,000 个的地址数组(map循环中),逐个获取每个查询的结果,执行方法如下: const getLiquidity = () => {

1.7K20
领券