全局变量--Buffer
Buffer让JavaScript可以操作二进制。Nodejs平台下JavaScript可实现IO。IO行为操作的是二进制数据。Stream流操作并非Nodejs独创,流操作配合管道实现数据分段传输。
Nodejs中Buffer是一片内存空间。
- 无须require的一个全局变量
- 实现Nodejs平台下的二进制数据操作
- 不占据V8堆内存大小的内存空间
- 内存的使用由Node来控制,由V8的GC回收
- 一般配合Stream流使用,充当缓冲区
创建Buffer
Buffer是Nodejs的内置类
创建Buffer实例
- alloc:创建指定字节大小的buffer
- allocUnsafe:创建指定大小的buffer(不安全)
- from:接收数据,创建buffer
Buffer实例方法
- fill:使用数据填充buffer
- write:
- toString:
- slice:
- indexOf:
- copy:
Buffer静态方法
- concat:将多个buffer拼接成一个新的buffer
- isBuffer:判断当前数据是否为buffer
核心模块--FS
- FS是内置核心模块,提供文件系统操作的API
- 代码层面上fs分为基本操作类和常用API
- 权限位、标识符、文件描述符
前置知识
权限位、标识符、文件描述符
- 权限位:用户对于文件所具备的操作权限(r:读,w:写,x:执行权限)
- 标识位: Nodejs中flag表示对文件操作方式
- 文件描述符:fd就是操作系统分配给被打开文件的标识
FS常用API
文件操作API
目录操作API
模块化规范
- 模块化是前端走向工程化中的重要一环
- 早期JavaScript语言层面没有模块化规范
- Commonjs、AMD、CMD都是模块化规范
- ES6中将模块化纳入标准规范
- 当下常用规范是Commonjs与ESM
Commonjs规范
主要应用于Nodejs,是语言层面上的规范。同步加载(所有不适用于浏览器环境)
- 模块引用
- 模块定义
- 模块标识
nodejs与Commonjs
- 任意一个文件就是一模块,具有独立作用域
- 使用require导入其他模块
- 将模块ID导入require实现目标模块定位
module属性
- 任意js文件就是一个模块,可以直接使用module属性
- id:返回模块标识符,一般是一个绝对路径
- filename:返回文件模块的绝对路径
- loaded:返回布尔值,表示模块是否完成加载
- parent:返回对象存放调用当前模块的模块
- children:返回数组,存放当前模块调用的其他模块
- exports:返回当前模块需要暴露的内容
- paths:返回数组,存放不同目录下的node_modules位置
module.exports与exports的区别
exports是nodejs为了方便导出自己定义的一个指向module.exports的变量,不能直接进行赋值
require属性
- 读入并且执行一个模块文件
- resolve:返回模块文件绝对路径
- extensions:依据不同后缀名执行解析操作
- main:返回主模块对象
模块分类及加载流程
模块分类
- 内置模块
- 文件模块
模块加载速度
加载流程
1.路径分析之标识符:路径标识符,非路径标识符(核心模块)
找不着路径会抛出错误
2.文件定位
3.编译执行
js文件的编译执行
JSON文件编译执行
将读取到的内容通过JSON.parse()进行解析
缓存优化原则