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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇,前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了,本文将会是它们的实操讲解。 HDFS相关前文&#x…

大学生体质测试|基于Springboot+vue的大学生体质测试管理系统设计与实现(源码+数据库+文档)

大学生体质测试管理系统 目录 基于Springboot+vue的大学生体质测试管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 4教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算…

SEMI启动SiC专有技术项目

公司郑重声明,其正致力于筛选那些能够稳定输出、且可重复使用的关键参数性能。SEMI,这家SiC领域的佼佼者,已经启动了一项独具匠心的专有技术(KGD)筛选程序。该程序旨在为客户提供高品质的、经过严格电气分类与光学检验…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同: 1)、web、openfeign 2)、每一个服务,包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3)、模块名&#x…

【1 bit 翻转+无任何保护】MidnightsunQuals 2021 BroHammer

前言 又是一道非常有意思的题目,其实笔者很喜欢这种跟页表、特权级等相关的题目(:虽然大多都无法独立做出来,但是通过这些题目可以学到很多的东西 题目分析 内核版本:v4.17.0smap/smep/kpti/kaslr 全关 题目给了源…

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结,部分算法图解 环境 ubuntu20,ros 版本 noetic 运行测试 按照 readme 提示进行测试,跳过第一个步骤,并不需要 turtlebot3。 执行第三个 launch 报…

第02章 计算机网络概述

2.1 本章目标 了解计算机网络的定义了解计算机网络的功能了解计算机网络的分类了解计算机网络的组成 2.2 计算机网络的定义 2.3 计算机网络的功能 2.4 计算机网络的分类 物理拓扑结构分类:总线型、环型、星型 2.5 计算机网络的组成 网络适配器(NIC)接口规格分类&a…

事件高级。

一、注册事件(绑定事件) 就是给元素添加事件 注册事件有两种方式:传统方式和方法监听注册方式 1 传统注册方式 方法监听注册事件 2、 addEventListener 事件监听方式 里面的事件类型是字符串,必定加引号,而且不带o…

【busybox记录】【shell指令】ls

目录 内容来源: 【GUN】【ls】指令介绍 【busybox】【ls】指令介绍 【linux】【ls】指令介绍 使用示例-默认输出: 列出目录内容 - 默认输出 列出目录内容 - 不忽略以.开头的文件 列出目录内容 - 不忽略以.开头的文件,只忽略.和..文件…

机器学习笔记导航(吴恩达版)

01.机器学习笔记01:机器学习前置概念导入、线性回归、梯度下降算法 02.机器学习笔记02:多元线性回归、多元梯度下降算法、特征缩放、均值归一化、正规方程 03.机器学习笔记03:octave安装、创建矩阵 04.机器学习笔记04:octave中移动…

量化之王西蒙斯:那些投资“神迹”和难言的“身后事”

投资大师总是相偕而来,又相伴而去。 美国当地时间2024年5月10日,量化投资大师西蒙斯(James Harris Simons)骤然去世,享年86岁。 此时距离芒格离世不到半年。 西蒙斯拥有数学家、投资家、慈善家、量化行业开拓者、密…

17_基于Flash和RAM的的文件系统选择

嵌入式系统常见文件系统 本文主要讲述在嵌入式系统中,常见的基于flash和内存(RAM)的文件系统类型,具体选择要结合实际需求灵活选配。 一、基于 Flash 的文件系统 基于 Flash 的文件系统主要包括 JFFS2、 YAFFS、 Cramfs 和 Romfs 等,各种文件系统具有不同的特点,本文将分…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具,该工具支持复刻一个现实场景中完整功能的Botnet测试环境,广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制,以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

halcon学习之一维测量基础

目录 创建测量矩形,获取测量句柄 gen_measure_rectangle2() 使用句柄进行测量 measure_pos() 修改参数Threshold 修改参数Transition 修改参数select 参数RowEdge,ColumnEdge,Distance …

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范,函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时,a2寄存器保存13 …

7.STL_string1.0(详细)

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 1. 为什么学习string类? 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 reserve 3. string类对象…

C++入门必读-Qt的安装与配置

QT简介 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 QT下载 访问下载网站: Index of /archive/qt 安装编译器 QT安装 建议安装之前将网络断…

【回溯 字典树(前缀树)】212. 单词搜索 II

本文涉及知识点 回溯 字典树(前缀树) LeetCode212. 单词搜索 II 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元…

Android studio 打开Device Mirroring方便调试

巧合下发现一个很好用的工具,在平时调试真机的时候在每次run app后都要低头找找手机看看效果。但是,用了AS上的Device Mirroring,你会发现根本不需要再低头点手机,调试方便一万倍啊。 话不多说,上图。直接就可以在电脑…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈,栈是一种后进先出的结构,即LIFO,…