nodejs复习笔记

news2024/10/6 2:25:24

最近在复习nodejs,整理了一些笔记来记录和分享。

非常惭愧,我之前关于nodejs学习的一篇文章《nodejs全栈开发学习笔记》已经是2019年6月份的时候了,大概浏览了一下,发现当时很多不明白的地方,现在通过复习,都明白了很多。其实我在复习的过程中已经感觉和初学的时候不一样了。初学的时候知识空白太多,很多听不懂也不重视,也没有时间细嚼慢咽,更加急躁和功利,更多的在乎怎么实现功能,现在复习,有多年工作经验和网课学习成果加持,理解容易多了,也会更注意当初来不及关注的一些原理问题。

废话不多说,直接上笔记。笔记内容不是原创,可以理解为听网课做的课堂笔记。

NodeJS是什么

运行于服务端的JavaScript解释器

使用包管理器 npm(开源生态系统)

NodeJS is a JavaScript runtime(运行时) built on Chrome’s V8(V8 JavaScript 引擎超级快,谷歌有优化)

NodeJS 不是一门语言,JavaScript 是一门语言

语言想在不同的宿主上跑,就需要不同的runtime

Nodejs 就是让JavaScript 可以在服务器端跑起来的 runtime

此描述并不精确,因为 nodejs 并不能使用 JavaScript 的全集,如 dom bom (都是浏览器的特性)

NodeJs uses an event-driven(事件驱动), non-blocking I/O(非阻塞I/O) model

异步 I/O 模型

非阻塞I/O(input output 计算机输入 输出)

键盘,显示器,打印机 I/O 设备

读写磁盘 I/O操作

阻塞 I/O

I/O 时进程休眠等待 I/O完成后进行下一步

非阻塞

I/O 时函数立即返回,进程不等待 I/O 完成

计算机所有的指令都可以理解为阻塞的

一条语句执行完,才可以执行下一句

大部分指令依赖的都是 CPU 运算

CPU 运行速度奇快无比(一秒钟执行30亿条指令)

大部分非 I/O 操作感觉不出来慢,非常快,感觉不到阻塞

I/O 操作比较慢,参考往硬盘里拷贝电影的速度,肉眼可以感知

I/O 是一个比较特殊的操作,特殊在非常慢

非阻塞 I/O

I/O 结束后通知主程序

I/O 结束后怎么通知主程序

事件驱动

前端页面按钮绑定点击事件(事件处理程序),非立马调用(JavaScript 进程也不知道什么时候调用),当用户点击按钮就触发了click 事件,主程序就得到了通知。

Nodejs 是 JavaScript 的 runtime ,天然就可以使用 事件驱动 这种模式 来通知主进程 I/O 完成

事件驱动

I/O的时候 等异步操作结束后通知主进程

内部实现是 观察者模式

为什么偏爱nodejs

Nodejs 并不适合所有server 端的场景,使用场景极其有限

Web(如:http 模块) 是 nodejs 最适合的场景

前端为何偏爱nodejs

Nodejs 使用 JavaScript 语言

前端工作延伸到服务器端,前后端开发都可以使用JavaScript

更早的在server端使用 JavaScript 是七牛(JavaScript in Java)

Nodejs 胜出,在于两大特性:事件驱动 和 异步 I/O 模型

处理 高并发,I/O 密集 场景性能优势明显

CPU 密集 VS I/O 密集

CPU密集:计算,逻辑判断

例如:压缩,解压,加密,解密,图形运算

I/O 密集:存取设备,网络设施的读取操作

例如:文件操作,网络操作(http),数据库

计算机运行指令速度很快,I/O 速度慢

Web 常见场景(I/O 密集)

静态资源读取(HTML,结束,css 等)

数据库操作

渲染页面

应对高并发(单位时间内访问量特别大)

增加物理服务器

增加每台机器的CPU数--多核

进程

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

音乐播放器

浏览网页

程序加载到内存中执行

执行中的程序叫做进程

多进程,计算机频繁切换执行,使得用户在听音乐的同时又可以浏览网页。

多进程

启动多个进程,多个进程可以一块执行多个任务。

不是同时进行,使用调度算法,快速切换,使人同时可用。

CPU分配的最大进程数是有限的,用户并发到一定数目,就一定要排队了。

CPU 空转(资源浪费) 等待 I/O 执行完

Nodejs工作模型

单线程(single thread)

线程:进程内一个相对独立的、可调度的执行单元,与同属一个进程的线程共享进程的资源。

多线程:启动一个进程,在一个进程中启动多个线程,这样多个线程也可以一块执行多个任务。

JavaScript 的特性 单线程,nodejs 也继承了 单线程

Nodejs 的原理

一个 CPU 上 只开一个进程,一个进程里面只有一个线程。

Nodejs 的单线程

单线程只针对主进程,I/O 操作系统底层多进程多线程调度。

单线程并不是单进程

Nodejs 模块:集群

CPU 有几个核,就启用几个进程,不会浪费 CPU 的能力

Nodejs 高性能的前提

Web场景,高并发,I/O密集

公司内使用场景:

Web server

本地代码构建

随着前端使用react es6 前端模块化 sass less 等

前端代码变得异常复杂

前端直接书写的代码在浏览器上或者在线上没法直接工作

需要在本地就行一些转化工作(编译构建)

工具 webpack babel

nodejs 写的工具

编译代码是CPU在运算(占大头),读取文件是 I/O 操作,不是高并发,从性能角度看使用nodejs 写的工具并不合适。

之所以使用,是因为处理前端代码,有前端特殊的逻辑,只有前端最了解。

前端如果用 Python Java 写,有语法的阻碍。(前端工具比较少的原因)

Nodejs 有语法优势,本身能在server中跑,处理文件,编译工作的能力有,只是速度慢。前端熟悉,前端就可以写。

实用工具开发

小的脚本工具:爬虫(快速收集数据),大部分从性能角度不是最佳选择,但出于语法,前端熟悉,对前端来说,用 nodejs 写是最好选择。

开发环境&调试工具

Nodejs 官网 下载 nodejs

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

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

相关文章

【MySQL数据库开发设计规范】之表设计规范

欢迎点开这篇文章,自我介绍一下哈,本人姑苏老陈 ,是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中,该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章,定期更新,欢迎关注&…

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得…

【计算机毕业设计】基于微信小程序文章管理系统

随着 计算机技术的成熟,互联网的建立,如今,PC平台上有许多关于文章管理方面的应用程序,但由于使用时间和地点上的限制,用户在使用上存在着种种不方便,而开发一款基于微信小程序的文章管理系统,能…

基于机器学习的网络流量识别分类(完整资源收米)NetFlow-Sentry

项目介绍 这是一个名为NetFlow-Sentry的项目,项目实现了对网络流量的实时检测,特征抓取,内置了基于Pytorch的深度学习模型来进行流量分类。该项目除可以进行实时特征提取,还提供了网络流量数据的输入口,可以直接识别分…

并发——进程

1. 程序 程序(program)是什么? 计算机程序(computer program)一般是指以某些程序设计语言编程,能够运行于某种目标体系结构上 程序 数据结构 算法 数据结构:用来表示人们思维对象的抽…

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引,在5.7之后才会为每个表生成一个独立表空间即一个ibd文件,在此之前,所有表默认下都会存储在“系统表空间”(共享表空间),所有表都在一个ibd文件。 inn…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)

Verilog复习(四)| 组合逻辑

一位全加器结构描述: 数据流描述: 行为描述: 只要有事件发生(列表中任何 信号有变化),就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中,处理POST请求是一项常见任务,特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架,它提供了方便的工具来处理HTTP请求&a…

答辩PPT自述稿如何与幻灯片同步?笔灵AI一键生成功能解析

在我原本的认知里面,答辩PPT是要包含论文各个章节的,在答辩时需要方方面面都讲到的,什么摘要、文献综述、实证分析、研究结果样样不落。但是,这大错特错! 答辩PPT环节时长一般不超过5分钟,老师想要的答辩P…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具,其突出特性在于功能强大,并且使用简便、易用性良好。不管是开发人员开展接口调试工作,还是测试人员进行接口测试任务,Postman 均属于首选工具之一。 接…

面试八股之Redis篇2——redis分布式锁

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 🏃人生之义,在于追求,不在成败,勤通…

图书馆APP开发解决方案

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言:pythonjavanode.jsphp均支持 运行软件…

blender 为世界环境添加纹理图像

1、打开世界环境配置项 2、点击颜色右侧的黄色小圆,选择环境纹理 3、打开一张天空图像 4、可以通过调整强度/力度,调整世界环境的亮度

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主 后端监听选择kde-…

QT-小项目:连接MY SQL数据库实现登录(下一章实现登录注册账号和忘记密码功能)

一、环境准备 1、下载MYSQL 64位,安装完成,制作简易数据库教程如下: MY SQL安装 2、QT 编译器使用 二、实现工程目录(基于上一章基础上) 三、源程序增加内容如下: login.cpp 增加头文件: #in…

MES系统与WMS集成方法(满分100学习资料)

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

头歌C语言数据结构(队列的应用)

第1关:循环队列 任务描述 本关任务:编写一个循环队列,实现入队、出队操作,判断队空、队满等特殊情况。 相关知识 为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义&#xff…

别的项目都有 awesome 仓库,RT-Thread 也要有!

awesome 仓库是 GitHub 上用于收集某个项目或者某个语言相关的优质内容的仓库,例如中间件、新闻资讯、网站等。 作为 RT-Thread 开发者,看到别的项目都有 awesome 仓库,我想 RT-Thread 也应该有! 于是,我创建一个 aw…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件: 例如:将home.ui文件转为vio_detect.py文件,所需命令如下: pyuic5 -x home.ui -o vio_detect.py