Node 基础
文章平均质量分 83
Node 基础学习笔记
皮蛋很白
没有什么难点是一觉醒来解决不了的
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Node 学习八、通信之 03 HTTP模块、客户端代理、创建HTTP静态服务、静态服务工具示例
HTTP 模块基于 NodeJS 中的 http 模块,掌握 HTTP 协议中一些必要的内容组成以及一些常见功能实现的原理,如缓存、编码、断点续传、防盗链等。快速使用net 模块创建服务:const net = require('net')// 创建服务端const server = net.createServer()server.listen(1234, () => { console.log('服务端启动,访问 localhost:1234')})server.on(原创 2021-11-25 11:59:28 · 969 阅读 · 0 评论 -
Node 学习八、通信之 02 创建 TCP 通信、数据粘包、数据封包与拆包
创建 TCP 通信使用 NodeJS 提供的内置模块创建 TCP 的服务端与客户端的实例,然后让两者进行通信。Net 模块实现了用于底层通信的接口,可以直接创建基于流操作的(TCP或IPC 的)服务端和客户端。通信过程创建服务端:接收和回写客户端数据创建客户端:发送和接收服务端数据数据传输:内置服务事件和方法读写数据通信事件关于连接的常用事件:listening 事件:调用 server.listen 方法之后触发connection 事件:新的连接建立时触发,也就是服务端每次收到原创 2021-11-25 11:58:09 · 2662 阅读 · 1 评论 -
Node 学习八、通信之 01 网络通信基本原理、网络层次模型、数据封装与解封装、TCP三次握手与四次挥手
网络通信基本原理网络通信(或通讯)模型和通讯协议(常见的 HTTP、TCP/IP、FTP等)解决的本质问题就是主机与主机之间的网络通信。下面以最基本的两台主机之间的通信开始,慢慢认识网络通信模型和每层所做的事情,最后再学习 NodeJS 中提供的内置核心网络模块。通信必要条件抛开封装数据的部分,两台主机之间要想完成通信,至少需要满足的条件:主机之间需要有传输介质建立物理连接如网线、蓝牙、光纤、wifi主机上必须有网卡设备当两台主机建立了连接后就要考虑数据是以什么样的形式进行传输不原创 2021-11-25 11:57:17 · 883 阅读 · 0 评论 -
Node 学习七、核心模块 stream之 05 模拟文件汇总
模拟文件汇总文件可读流const fs = require('fs')const EventEmitter = require('events')class MyFileReadStream extends EventEmitter { constructor(path, options = {}) { super() this.fd = null this.path = path this.flags = options.flags || 'r' // 文件打原创 2021-11-25 11:52:51 · 265 阅读 · 0 评论 -
Node 学习七、核心模块 stream之 04 链表结构、单向链表实现、模拟文件可写流、pipe使用和模拟
链表结构链表是一种存储数据的结构。在文件可写流 write 方法工作的时候,有些被写入的内容需要在缓冲区中进行排队等待,而且遵循的是先进先出的规则。为了存储这些排队的数据,在新版 Node 中就采用了链表的结构存储这些数据。为什么不采用数组存储数据?相对于链表结构,数组会有一些明显的缺点:在多个语言下数组存储数据的长度具有上限数组存在塌陷问题,在执行插入或删除元素的时候,有可能会移动其它元素的位置在 JavaScript 中数组实际上是对象类型,在使用效率上会低一些以上缺点只是相对于链原创 2021-11-25 11:51:05 · 382 阅读 · 0 评论 -
Node 学习七、核心模块 stream之 03 背压机制、模拟 pipe 背压机制、模拟文件可读流
背压机制Node.js 的 steam 已经实现了可以保证数据平滑流动的背压机制。通过 drain 事件和 highWaterMark 可以很好的控制数据写入速度和控制内存消耗。pipe 方法实现了这个背压机制。数据读写时可能存在的问题下面示例是将 A 文件内容拷贝到 B 文件中。const fs = require('fs')const rs = fs.createReadStream('A.txt')const ws = fs.createWriteStream('B.txt')r原创 2021-11-25 11:47:51 · 1625 阅读 · 0 评论 -
Node 学习七、核心模块 stream之 02 write 执行流程及源码分析
write 执行流程流程梳理通过文件可写流执行流程的梳理,可以帮助理解背压机制,还能帮助更好的确认 drain 事件的触发时机。drain 事件:当前缓冲区可以继续执行数据写入的时候就会触发 drain 事件。示例代码:const fs = require('fs')const ws = fs.createWriteStream('test.txt', { highWaterMark: 3 // 水位线,可写流缓冲区上限})// 模拟底层数据const source = [1, 2原创 2021-11-25 11:45:53 · 678 阅读 · 0 评论 -
Node 学习七、核心模块 stream之 01 Stream 流、Nodejs 中流的类型
Stream 流模块流**“流”**并不是 Nodejs 中独创的概念。例如,可以直接在类 Unix 系统中使用 ls | grep *.js 查找当前目录下 .js 文件,这就是流操作的一种应用。它会将管道左侧命令执行之后的结果数据,交给右侧的命令进行处理,这种通过流操作数据的方式,无论在空间还是时间上都会有明显的效率提升。Node.js 诞生之初就是为了解决 IO 密集型的性能问题(密集型:阻塞导致的等待状态),其中文件操作系统和网络模块就实现了流接口。Node.js 中的流就是处理流式数据原创 2021-11-25 11:44:11 · 738 阅读 · 0 评论 -
Node 学习六、核心模块 events之 02 Nodejs 和 浏览器中的 Event Loop
浏览器中的 Event Loop示例代码// 宏任务setTimeout(() => { console.log('s1') // 微任务 Promise.resolve().then(() => { console.log('p1') }) // 微任务 Promise.resolve().then(() => { console.log('p2') })})// 宏任务setTimeout(() => { consol原创 2021-11-12 09:42:55 · 345 阅读 · 0 评论 -
Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现
events 事件模块events 与 EventEmitternode.js 是基于事件驱动的异步操作架构,内置 events 模块events 模块提供了 EventEmitter 类这个类的实例对象具备注册事件、发布事件和删除事件的一系列事件模型机制的常规操作node.js 中很多内置核心模块继承 EventEmitter 类所以开发者在使用的时候无需单独的引入 events 模块。EventEmitter 常见 APIon:注册事件监听器emit:触发事件,按照注原创 2021-11-12 09:41:45 · 2630 阅读 · 0 评论 -
Node 学习五、模块化之 03 VM 模块、模块加载模拟实现
内置模块之 VMvm 模块是 Nodejs 内部核心模块,Nodejs 底层的 require 实现用到了这个模块。它的核心作用是可以创建一个独立运行代码的沙箱环境。所谓“沙箱”可以理解为“独立”、“封闭”。此处不讨论 vm 模块 API 的使用语法和细节,主要了解如何运用 vm 模块为实现模块的加载做准备。也就是怎么通过 vm 把 A 模块中的内容,放在 B 模块中执行。初始化示例创建一个 test.txt 文件(为了演示运行的是模块内容,而不是 js 文件,这里使用的 .txt):var原创 2021-11-12 09:38:37 · 1357 阅读 · 0 评论 -
Node 学习五、模块化之 02 模块加载源码解析
模块加载源码分析配置 vscode 调试用 vscode 打开文件夹,在里面创建两个文件:m.js 作为被加载的模块文件require-load.js 作为加载模块的文件const obj = require('./m')module.exports = { foo: 123}打个断点:创建 vscode 调试配置文件:点击左边的【运行和调试】,点击【创建 launch.json 文件】,选择【Node.js】修改配置文件:{ // 使用 IntelliSense原创 2021-11-12 09:37:39 · 636 阅读 · 0 评论 -
Node 学习五、模块化之 01 模块化历程、CommonJS、模块加载流程
模块化历程前端开发为什么需要模块化?最初的时候前端工作更多的是页面内容的制作,往往只是很简单的网页结构搭建,或 css 样式编写,再难点就是 UI 交互,前后端数据交互。因此一个页面的开发工作量不会太大,所以也不会依赖太多的外部文件,其中的逻辑代码也不会有很多。随着 Web 技术的发展,前端项目也越来越大,移动端的需求也越来越多,所以现在需要完成的都是组件化的前端开发。在这种情况下,之前传统的前端开发模式中的一些问题也就逐渐的凸显出来了。传统开发常见问题:命名冲突和污染代码冗余,无效请求原创 2021-11-12 09:36:02 · 457 阅读 · 0 评论 -
Node 学习四、核心模块 fs 之 02 大文件读写、目录API及模拟实现
文件打开与关闭前面的 API 是将文件中的数据一次性的读取/写入到内存中,这种方式对于大体积的文件来说,显然不合理。所以需要实现一个可以边读边写或边写边读的操作方式,这就需要将文件的打开、读取、写入、关闭看作各自独立的环节。打开/关闭 API:open:打开文件close:关闭文件// open & closeconst fs = require('fs')const path = require('path')// fs.open(path[, flags[, mode]]原创 2021-11-12 09:33:01 · 880 阅读 · 0 评论 -
Node 学习四、核心模块 fs 之 01 模块介绍、文件一次性操作
FS 模块介绍在 Nodejs 中存在着 Buffer(缓冲区) 和 Stream (数据流)两个非常常见的概念。Buffer 就是存储的中间变量,目的是方便 CPU 在执行数据存取操作时,可以有一个中间的存储区域。而流操作类似水流一样,可以通过管道传输数据,以及将数据进行分段。Buffer 和 Sream 一般操作的都是二进制数据,它们往往与 FS 密不可分。FS 是 Nodejs 内置核心模块,提供文件系统操作的 API。所有和文件相关的操作都是通过 FS 模块进行实现的,如文件目录的创建原创 2021-11-12 09:31:42 · 485 阅读 · 0 评论 -
Node 学习三、全局变量 Buffer
全局变量之 BufferBuffer 一般称之为 Buffer 缓冲区。Buffer 让 JavaScript 可以操作二进制。JavaScript 语言起初服务于浏览器平台,因此它内部主要操作的数据类型就是字符串。Nodejs 的出现使得可以在服务端使用 JavaScript 进行编程,完成 IO 操作,例如文件的读写、网络服务中数据的传输等,在这个过程中就是用到了 Buffer。二进制数据用户使用软件获取信息,开发者使用语言处理和展示信息,这个“信息”其实就是数据,例如在客户端上看到的字符、原创 2021-11-12 09:28:39 · 944 阅读 · 0 评论 -
Node 学习二、全局变量 process 和 核心模块 path
全局变量 process获取进程信息// 1 资源// 1.1 内存// 占用 arrayBuffers// 声明一个大小为 1000 的 Buffer// Buffer.alloc(1000)console.log(process.memoryUsage())// {// rss: 24879104, // 常驻内存// heapTotal: 4509696, // 脚本执行之初申请的总的内存大小// heapUsed: 2415608, // 当前脚本在执行中实际原创 2021-11-12 09:27:09 · 447 阅读 · 0 评论 -
Node 学习一、基础理论
Nodejs 可以做什么?轻量级、高性能的 Web 服务前后端 JavaScript 同构开发便捷高效的前端工程化Nodejs 架构Nodejs 核心分为三个部分:Natives modules:内置核心模块暴露了响应的 JS 功能接口,供开发者进行调用Builtin modules “胶水层”:帮助找到对应功能的 C/C++ 具体实现这个过程需要 V8 引擎配合实现具体的功能模块,如 V8、libuv 等V8 引擎除了构建 Nodejs 运行环境,还负责 JS原创 2021-11-12 09:19:42 · 928 阅读 · 0 评论
分享