nodejs复习笔记

最近在复习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.hqwc.cn/news/704517.html

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

相关文章

想让普通金额数字显示为逗号分隔的数字?

使用vueelement 后台传的数据 1.编写方法 放在method当中 /** 数字转换显示格式 */priceFormat (num, n) {n n || 2;let symbol ",";if (num null) return num;if (typeof num ! number) throw new TypeError(num参数应该是一个number类型);if (n < 0) thro…

angular13 自定义组件全项目都可用 自存

1.定义自定义组件 使用命令创建一个组件 但删除它在你的module里的声明&#xff0c;因为会报错只能引用一次 在本组件中创建一个module文件&#xff0c;引入刚才的组件component.ts import { NgModule } from angular/core; import { CommonModule } from angular/common; im…

粒子系统技术在AI去衣应用中的创新探索

引言&#xff1a; 随着计算机视觉和人工智能技术的飞速发展&#xff0c;AI去衣技术逐渐走进公众视野。这一技术以其独特的应用前景和技术挑战引起了广泛的关注。在实现衣物去除的同时保持图像质量的关键技术之一&#xff0c;便是粒子系统技术。本文将深入探讨粒子系统技术在AI去…

网络审计:为什么定期检查您的网络很重要

在数字化时代&#xff0c;网络安全成为组织和个人必须面对的重要挑战。网络审计是一种关键的安全措施&#xff0c;通过定期检查和评估网络系统的安全性&#xff0c;帮助发现潜在的安全漏洞和弱点&#xff0c;从而防止数据泄露和其他安全威胁。本文将介绍网络审计的重要性&#…

工单系统有哪些?

市面上的工单系统真的非常多&#xff0c;一个个列举肯定说不完&#xff0c;我大致给它们按照不同的依据&#xff0c;进行了一下分类&#xff1a; 1、按部署方式分类&#xff1a; 本地化部署工单系统&#xff1a;适用于对数据安全性要求较高的企业&#xff0c;需要企业在本地服…

华为正式放弃高通芯片 | 百能云芯

5月15日&#xff0c;据外媒最新报道&#xff0c;高通公司正式确认&#xff0c;华为已无需依赖其处理器供应。 在出口许可被正式吊销前&#xff0c;高通的首席财务官已公开表示&#xff0c;预计明年与华为之间的芯片销售将为零&#xff0c;因为华为决定不再从高通购买4G芯片。 报…

探索Playwright:Python下的Web自动化测试革命

在如今这个互联网技术迅速发展的时代&#xff0c;web应用的质量直接关系着企业的声誉和用户的体验。因此&#xff0c;自动化测试成为了保障软件质量的重要手段之一。今天&#xff0c;我将带大家详细了解一款在测试领域大放异彩的神器——Playwright&#xff0c;并通过Python语言…

实名举报:施先燕婚内出轨,身份证:湖北省麻城市

联系方式 施先燕&#xff1a;18664572582 施先燕&#xff1a;13510873532

如何管理测试用例?测试用例有什么管理工具?YesDev

3.1 测试用例 测试用例(Test Case) 是指对一项特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果等。简单地认为&#xff0c;测试用例是为某个特殊目标而编制的一组测试输入、执行条…

knife4j案例

1.导入 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId> </dependency>2.在配置类中加入 knife4j 相关配置并设置静态资源映射&#xff08;否则接口文档页面无法访问&#xff…

数据结构之栈与队列

一.栈 1.定义&#xff1a;一种线性表&#xff0c;只允许在固定的一端进行删除和插入数据的操作&#xff0c;该端叫栈底&#xff0c;另一端叫栈顶 2.特点&#xff1a;先进后出 注&#xff1a;栈中元素出栈是一对多的(他虽然满足先进后出但是我们可以在pop数据前先获取栈顶元素…

计算机网络 -- 序列化与反序列化

一 协议的重要性 我们都知道&#xff0c;在进行网络通信的过程中&#xff0c;通信的双方可以是不同的设备&#xff0c;不同的平台&#xff0c;不同的平台&#xff0c;比如说&#xff0c;手机用户和电脑用户进行通信&#xff0c;ios系统和安卓系统进行通信。 自己的数据&#xf…