【通识】NodeJS基础
1. 基础模块
一个简单的server
var http = require('http')
http.createServer(function(request, response) {response.writeHead(200, {"Content-type": "text/plain"});response.write("Hello world");response.end();
}).listen(8888);
- Flie System -fs
const { readFile } = require('node:fs/promises');
const { resolve } = require('node: path');
async function logFile() {try {const filePath = resolve('./package.json');const contents = await readFile(filePath, {encoding:'utf-8'});console.log(contents);} catch(err) {console.error(err.message);}
}
logFile();
- Path
- Http
- Net
- Cmd
- Process
2. V8核心
- 事件循环:宏任务和微任务
宏任务是消息队列中等待被主线程执行的事件,每个宏任务在执行时都会创建栈,宏任务结束栈也会被清空。
微任务:
1)若当前任务中产生了一个微任务不会再被当前的函数中被执行,执行微任务时不会导致栈的无限扩张
2)微任务在当前任务执行结束前被执行
3)微任务结束执行前不会执行其他任务
生存期Generator
function* getResult() {console.log('getUserID before');yield "getUserID"; // yield是生成器函数中的暂停和恢复点,首先暂停并返回`{value:"getUserId, done:false}`console.log('getUserName before'); // 下次执行.next()时执行yield 'getUserName'; // 暂停并返回`{value:"getUserName, done:false}`console.log('name before');return 'name'; //
}
let res = getResult();
- 内存原理
3. 基础概念
- 文字编码 - Node.js支持以下:
ascii
(7位,去掉高位的话这种编码非常快);utf-8
多字节编码的Unicode字符、许多网页和其他文档都使用UTF-8;utf16le
中2或4个字节,小字节序编码的Unicode字符,支持代理对(U+10000至U+10FFFF);ucs2
和utf16le
的别名;base64
编码(包括小写字母a-z,大写A-Z,数字0-9,符号+、/一共64个字符的字符集(另加一个"=",实际65),任何符号都可以转换成这个字符集中的字符,转换过程称为base64编码);latin1
一种将Buffer
编码成一字节编码的字符串的方式(由IANA定义在RFC1345);binary
是latin1
的别名;hex
将每个字节编码为两个十六进制字符
在ECMAScript 2015(ES6)引入TypedArray前,JS没有读取或操作二进制数据流的机制。TypedArray已被添加进ES6中,buffer类以一种更优化、更适合Node.js的方式实现了Uint8Array。Buffer类的实例类似于整数数组,但buffer大小固定且在V8堆外分配物理内存。Buffer类在Node.js中是一个全局变量,因此无需使用require(‘buffer’).Buffer
Buffer
对象用于表示固定长度的字节序列,类是JS中Uint8Array
类的子类,并用涵盖额外用例的方法对其进行扩展。Node.js API在支持Buffer的地方页接受纯Uint8Array,通过import或require语句显式地引用
js: Unit8Array - 该类型的数组,内容初始化为0。建立后用对象或标准数组索引语法(即使用括号表示)引用数组中的元素
const { Buffer } = require('buffer');
// 创建一个长度为10的缓冲区
const buf1 = Buffer.alloc(10);
// ...的Buffer
// 填充值为'1'
const buf2 = Buffer.alloc(10,1);
// 创建...为10的未初始化缓冲区
// 比调用alloc()要快但返回的Buffer实例可能包含旧的数据
// 使用fill(),write()或其他填充Buffer的函数覆盖内容
const buf3 = Buffer.allocUnsafe(10);
// 从数组创建[1,2,3]
const buf4 = Buffer.from([1,2,3]);
// creates a buffer containing the bytes[1,1,1,1] - the entries are all truncated using `(value &255)` to fit into the range 0-255
// 翻译:creates a buffer containing the bytes[1,1,1,1] - the entries are all truncated using `(value &255)` to fit into the range 0-255
// 其中,保留技术符号&和位运算表达式原貌;"truncated"译为"截断"并补充说明"截取到...范围内"的操作结果;使用中文破折号“——”或括号()体现原文的补充说明关系
// 明确0-255范围值(计算机领域通常不写作"0~255“)
// 补充位运算说明使”&“操作的技术含义更清晰
const buf5 = Buffer.from([257,257.5, -255, '1'])
// 为字符串'tsamest'创建一个包含utf-8编码字节的缓冲区
// [0x74, 0xc3, 0xa9, 0x73, 0x74](十六进制)
// [116, 195, 169, 115, 116](十进制)
const buf6 = Buffer.from('test')
// 创建一个包含Latin-1字节的缓冲区[0x74, 0xe9, 0x73, 0x74]
const buf7 = Buffer.from('test', 'latin1');
const { Buffer } = require('node: buffer');
const buf = Buffer.from('Hello world', 'utf8');
console.log(buf, toString('hex');
- 图像编码 - Base64
概念是字符串(图片等)转换成二进制序列,然后按每6个二进制位为一组分成若干组。若不足6位,则低位补0。每6位组成一个新字节、高位补00,构成一个新的二进制序列,最后根据base64索引表中的值找到对应的字符
原始字符 | a | b | c | |
---|---|---|---|---|
ascii编码 | 97 | 98 | 99 | |
二进制位 | 01100001 | 01110010 | 01100011 | |
编码转换 | 00011000 | 00010110 | 00001001 | 00100011 |
base64索引值 | 24 | 22 | 9 | 35 |
base64字符 | Y | W | J | j |
如01100001这里,分割为6位组需要补到12位(即6x2),即低位补4个0:01100001+0000 $\rightarrow $011000010000:分割为两组011000, 010000
->Base64字节:高位补0有00011000,00010000
通过查表映射
左移两位:01100001->10000100不匹配
循环右移:01100001->01011000不匹配
位反转:01100001->10000110不匹配
(该图像来源于:https://www.w3ccoo.com/tools/base64code/)
- 1
2. Express Koa的开发
- Web Server开发
1)开发web server需要处理的问题:
a. 接受请求,解析参数,get/post, restful, upload
b. 处理静态资源
c. ssr渲染前端页面
d. 创建数据库页面,使用model进行数据库操作
e. session, cookie等用于登录的处理, token的签发
f. api请求的处理,包括路由逻辑
g. 拦截器的开发方便做路由拦截
h. api参数过滤,方便处理请求参数
i. mq消息队列,分布式系统基础
j. websocket\webrtc实时性
k. 并发处理(nodejs异步函数原生性支持)
l. 事物处理(nodejs弱项)
2)核心原理
a. 异步串行流程控制:用串行化流程控制让异步任务按顺序执行,并放置到一个数组中。如图,
b. 一个由服务端渲染的Vue.js应用被认为是“同构的”(lsomorphic)或“通用的”(Universal),因为应用的大部分代码通识运行在服务端和客户端。
使用SSR的优势:更快的首屏加载(慢网速或运行缓慢的设备上很重要);统一的心智模型;更好的SEO - 1