什么是NodeJS

1、前言

接触 node.js 有好几年了,也开发了好几个项目了;但每次提起 node.js,始终不敢说自己入门了,归其原因,大概就是如下所示 image.png

为了进一步加强理解,系统的梳理相关知识以作备忘,本节将从以下几个方面介绍 node.js

  • 为什么前端需要掌握?
  • 什么是 node.js?

1.1、为什么前端需要掌握

Node.js 单线程高并发的特性非常适合用来创建后端服务;虽然但是,好像不会使用 Node.js 根本不影响我写前端页面嘛~。

no no no,作为一个新时代的三有前端,要本着知其然并知其所以然的精神彻底掌握 Node.js,因为它不仅仅是用来写后端,更重要的用途是提升我们项目工程化和效率。

  • 操作文件系统;在日常开发,经常会涉及到文件夹操作;比如某个需求,给你几百个资料,需要你做成资料下载页,妈妈呀,手都要复制麻了,赶紧写一个 DOS 批处理命令,尴尬了,还是上学那会学过一点,早忘了七七八八了;不慌,Node.js 来帮忙,fs 模块轻松解决。
  • 开发自己的命令行工具;典型的就是 vue2 store 中在仓库增加一项,需要同时在 state、mutation、action 增加对应的模型操作,非常繁琐,如果你掌握了 Node.js,就可以开发一个自己的命令,一键添加。
  • 编写打包脚本工具,如 webpack 的 loader,嘿嘿,这个熟悉吧
  • 发布自己的 npm 包,搭建各项目通用基座,告别 Ctrl + C、V
  • 实现自己的脚手架,再也不用整一个模板项目然后每次复制了

你自己也会写 npm 包、脚手架、打包脚本了,是不是很受诱惑,嘿嘿…

2、node.js 的概念和特性

Node官网对其进行了简单的不能再简单的描述

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。

翻阅官网教程,大致对其概念和特性有了一些认识:

  • Node.js 是一个服务端运行环境,它使用 Google 的 V8 虚拟机来解释和执行 JavaScript 代码。
  • Node.js 同时又是一个库,具有许多有用的模块,可以简化操作。
  • 当 Node.js 执行 I/O 操作时,如从网络读取、访问数据库或文件系统,Node.js 不会阻塞线程,而是通过事件回调机制来完成回调处理。
  • Node.js 应用在单个进程中运行,无需为每个请求创建新线程,这使得 Node.js 在构建高并发应用时非常得心应手(如实时聊天、秒杀、抢购等)。

2.1 Node.js VS 浏览器

同样是解析 JavaScript,为啥 Node.js 与浏览器的功能差别这么大?

在 Node.js 之前,JavaScript 主要运行在浏览器宿主环境中,主要是操作 DOM、BOM,浏览器提供了 document、window 等对象;

Node.js 则允许在服务端运行 JavaScript,不具有浏览器才有的 window、document 等对象,主要是操作磁盘文件、搭建 http 服务等等等等…

这么牛逼?提供各种模块,还能在各大平台运行的飞起,这是我了解的 JavaScript?其本质不是 JavaScript 有多牛逼,而是它封装了许多强大的依赖,以下是 Node 源码的依赖列表 image.png

最典型的依赖就是 v8 和 uv

  • v8 引擎: 将 js 代码转变成可以在各个平台和机器上运行的机器码
  • libuv:C 语言编写的库,调用平台上的各种系统特性,如文件系统;同时负责 Node API 的执行,它将不同的任务分配给不同的工作线程(work threads),通过多线程同步阻塞执行,模拟异步处理机制,成功后将回调函数放入 Event Queue
  • npm: Node.js 包管理和分发工具,提供各种非官方的 Node 模块

image.png 上图是 libuv 大致的结构,很明显,Node.js 的网络 I/O、文件 I/O、DNS 操作、还有一些用户代码都是在 libuv 工作的

2.2 异步 I/O

libuv 的存在,使得 Node.js 可以是单线程的。每当有 I/O 请求发生时,node 就会扔给 libuv,由 libuv 为该请求分配给不同的工作线程(libuv 默认维护 4 个线程供 Node 调用,可以通过 UV_THREADPOOL_SIZE 环境变量在 Node 启动时设置,为了性能,不能超过 128 个),同步阻塞性的执行,执行完成后将回调函数放入事件队列中。

而 node 则不会管这个 I/O 的操作过程,继续执行主线程上的事件,只需要在该请求返回回调时在处理即可,从而实现非阻塞性的异步 I/O 处理。

2.3 单线程&高并发

与 JavaScript 一样,Node 是单线程,它将阻塞性的操作丢给 libuv 提供的线程池。

单线程的优点:

  • 避免了多线程编程中可能出现的竞态条件、锁和死锁等问题,简化了编码过程
  • 由于每个线程都将暂用一定的内存,在服务器内存受限的情况下,具有更好的高并发

单线程的缺点:

  • 不适合大量计算,会占用 CPU 导致应用阻塞(在主线程上避免大量计算)
  • 错误会引起整个应用的退出(可以利用 pm2 或 nginx 来监测服务状态,自动重启)
  • 容易受到阻塞性操作的影响;Node 主线程上如果有同步阻塞性 I/O 操作,可能会导致阻塞,这也就要求我们尽可能的使用 Node.js 的异步编程,异步编程是 Node.js 的核心

2.3.1 线程和进程

概念:线程是进程内的最小执行单元。一个进程可以有一个或多个线程。所有线程共享该进程的地址空间和资源。

进程与进程之间相互独立,通讯困难;而线程与线程则共享进程的资源,通讯简单;

Node.js 本身运行在一个进程中,当我们说 Node.js 是单线程时,是指它在这个进程中只使用一个线程来执行 JavaScript 代码

Node.js 只有一个主线程,是单线程;但并不是说 Node 只支持单线程;如果想要创建新的线程,可以使用 Node.js 内置的 Worker threads 模块

如果想要创建新的进程,可以使用 Node.js 内置的 Cluster 、Child process 模块。

2.3.2 为什么单线程并发高?

传统的服务端语音中(如 Java),每一个客户端连接都会为其创建一个新的线程,而每个线程都需要一定的内存(1~2M),受服务器内存限制,成为了高并发连接的瓶颈。

Node.js 则只有一个线程,大大的节省了服务器内容,它通过为每一个用户连接在 Node.js 内部,触发一个事件,Node.js 高并发的特性使得它在构建在线聊天、秒杀、抢购等应用时具有非常大的优势.

当然,这是建立在内存受限的情况下,如果你有足够大的服务器内存;那么传统的服务端语言将拥有更快的响应速度,Node 的事件循环机制将可能出现等待,即主线程有同步阻塞任务,事件循环将被阻塞

2.4 事件循环

Node.js 通过异步回调来处理,那么 Node 如何知道请求或操作完成了添加回调;又是如何执行回调的?这是由于 Node.js 的另一特性:事件循环机制,主线程通过 Event Loop 事件循环触发的方式来运行程序

注意,Node.js 的事件循环与浏览器下 JavaScript 的事件循环机制是不一样的,具体参考浏览器事件循环 VS Node.js 事件循环

3、结束语

好消息:今天周三了

坏消息:今天才周三

按道理,我没记错的话,朋友,今天应该是周五的吧~

image.png 有多少软件工程的小伙伴被戳中了,哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/631475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频转码实例:把MP4转为MKV视频,一键批量转换的操作方法

在数字媒体时代,视频格式的多样性是不可避免的。经常把MP4格式的视频转换为MKV格式。MKV格式有较高的音频和视频质量,能在其他设备或软件上播放视频。以下是云炫AI智剪如何把MP4视频转为MKV格式的一键批量转换操作方法。 已转码的mkv视频效果缩略图展示…

20240117在本地机器识别OCR法语电影的字幕效果PK

20240117在本地机器识别OCR法语电影的字幕效果PK 2024/1/17 11:18 1959 - Jirai Cracher Sur Vos Tombes [Gast, Vian].avi https://www.pianbar.net//drama/52892.html 1959[我唾弃你的坟墓]Jirai cracher sur vos tombes[BT下载/迅雷下载] magnet:?xturn:btih:7c9c99d9d048…

Elasticsearch各种高级文档操作

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据查询所有文档匹配查询文档关键字精确查询文档多关键字精确查询文档字段匹配查询文档指定查询字段查询文档过滤字段查询文档概述指定想要显示的字段示例指定不想要显示的字段示例 组合查询文档范围查询文档概述使…

微服务入门 | 项目分割 | 远程调度Feign | 用户中心erueka 和 nacos

认识微服务 微服务架构演变: 单体架构:所有功能集中在一个项目中开发,打成一个包部署 分布式架构:就是各功能模块的代码不在同一个项目中写了,到时候修改其中一个过能的代码,对另一个功能完全没有任何影响…

循环异步调取接口使用数组promiseList保存,Promise.all(promiseList)获取不到数组内容,then()返回空数组

在使用 vue vant2.13.2 技术栈的项目中,因为上传文件的接口是单文件上传,当使用批量上传时,只能循环调取接口;然后有校验内容:需要所有文件上传成功后才能保存,在文件上传不成功时点击保存按钮&#xff0c…

非常有趣的AI应用-用大语言模型来玩星际争霸2(附代码链接)

非常有趣的AI应用-用大语言模型来玩星际争霸2(附代码链接) 偶然看到的,比较有意思,分享一下: GitHub地址:Large-Language-Models-play-StarCraftII arxiv:Large Language Models Play StarCra…

ChatGPT 报:“Unable to load history…”如何处理?

ChatGPT界面出现:“Unable to load history…” 说明:无法加载历史记录。。。 原因: 一般是代理的问题,网络加载延迟严重,也可能是官方请求过多,造成响应不及时。 解决: 出现这个问题时&#…

新三板操作指南!哪家证券公司开通新三板交易佣金费率最低?

新三板操作指南:掌握规则,赢得先机! 随着中国资本市场的蓬勃发展,新三板市场日益成为投资者关注的焦点。然而,对于许多新手投资者来说,新三板市场的交易规则和流程可能较为陌生。本文将为您详细解读新三板…

移动端开发进阶之蓝牙通讯(一)

移动端开发进阶之蓝牙通讯(一) 移动端进阶之蓝牙通讯需要综合考虑蓝牙版本选择、协议栈使用、服务匹配、设备连接、安全性和硬件支持等方面。 一、蓝牙版本选择 根据实际需求和应用场景选择合适的蓝牙版本; 1.0,1M/s。 2.0EDR…

线程安全的集合类

Java中提供了许多集合类,其中有的是线程安全的,有的是线程不安全的。线程安全的集合类有: 1. Vector:Vector类实现了一个动态数组,与ArrayList相似,但Vector是同步访问的 2. Stack:Stack是Vec…

C++ 数论相关题目(约数)

1、试除法求约数 主要还是可以成对的求约数进行优化&#xff0c;不然会超时。 时间复杂度根号n #include <iostream> #include <vector> #include <algorithm>using namespace std;int n;vector<int> solve(int a) {vector<int> res;for(int i…

leetcode 每日一题 2024年01月18日 拿出最少数目的魔法豆

题目 给定一个 正整数 数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩下的 非空 袋子中&#xff08;即 至少还有一颗 魔法豆的袋子&#xff09;魔法豆的数目 …

保证Kafka消息有序性

一、Kafka特性 写入同一个partion分区中的数据是一定有顺序的kafka中一个消费者消费一个partion的数据&#xff0c;消费者取出数据时&#xff0c;也是有顺序的 二、保证消息Kafka消息有序性 在生产者端&#xff0c;应保证消息被写入同一分区。可以在构造消息时指定消息的key…

如何将音频转文字?4个方法帮你轻松搞定!

如何将音频转文字&#xff1f;在日常生活中&#xff0c;将音频转换为文字的应用可以带来很多便利。例如&#xff0c;在会议、讲座、课堂等场合&#xff0c;我们可以使用识别软件将语音转换为文字&#xff0c;方便记录和整理。此外&#xff0c;在语言学习、语音翻译等领域&#…

基于springboot+vue的在线拍卖系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

预处理详解(#和##运算符、命名约定、#undef​​、命令行定义​、条件编译、头文件的包含​)

目录 一、#和## 1.1#运算符 1.2## 运算符​ 二、命名约定​ 三、#undef​ 四、命令行定义​ 五、条件编译​ 六、头文件的包含​ 4.1 头文件被包含的方式&#xff1a;​ 4.1.1 本地文件包含​ Linux环境的标准头文件的路径&#xff1a;​ VS环境的标准头文件的路径&…

Vue3在点击菜单切换路由时,将ElementPlus UI库中el-main组件的内容滚动恢复到顶部

功能&#xff1a;Vue3在点击菜单切换路由时&#xff0c;将页面el-main的内容滚动到顶部&#xff0c;布局如下&#xff0c;使用UI组件库为ElementPlus 在网上搜很多都是在route.js中的router.beforeEach中使用window.scrollTop(0,0) 或 window.scrollTo(0,0) 滚动&#xff0c;但…

如何用GPT 运行python?GPT4科研应用与AI绘图及论文高效写作

详情点击链接&#xff1a;如何用GPT 运行python&#xff1f;GPT4科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型…

SpringBoot 统计API接口用时该使用过滤器还是拦截器?

统计请求的处理时间&#xff08;用时&#xff09;既可以使用 Servlet 过滤器&#xff08;Filter&#xff09;&#xff0c;也可以使用 Spring 拦截器&#xff08;Interceptor&#xff09;。两者都可以在请求处理前后插入自定义逻辑&#xff0c;从而实现对请求响应时间的统计。 …

【前端】vue.js从入门到项目实战笔记

文章目录 第三章3.1 插值绑定&#xff08;{{}}&#xff0c; v-html&#xff09;3.1.1 文本插值3.1.2 HTML插值 3.2 属性绑定 v-bind3.2.1 指令v-bind3.2.3 类名和样式绑定 【前端目录贴】 第三章 3.1 插值绑定&#xff08;{{}}&#xff0c; v-html&#xff09; 文本插值中的代…