本文学习内容来自b站视频:【尚硅谷】最经典Node.JS全套完整版教程(快速入门nodejs)
视频地址:https://www.bilibili.com/video/BV1bs411E7pD?share_source=copy_web
本文内容只有 Node.js 简介、模块化、NPM、以及 Buffer、fs等模块的基本使用。
Node.js官方文档地址:http://nodejs.cn/
目录
一、 Node.js 简介
1. node.js是能在 服务端 运行 Javascript 的开放源代码、跨平台 Javascript运行环境 。
2. Node 是对ES标准的实现,是JS的引擎,通过node可以使js代码在服务端执行
3. 可以使用所有的内建对象,但是不能使用DOM和BOM
4. 可以在后台编写服务器
5. node处理请求时是单线程的,但是在后台拥有一个I/O(input、output对磁盘的读和操作)线程池。
二、 模块化简介
1. 模块:在node中,一个js文件就是一个模块
2. 引入外部模块:通过require()函数引入外部模块
- require()传递 外部模块的路径 作为参数
- require()会 返回对象 ,对象就是引入的外部模块
3. node里,js文件中的 js代码 都独立运行 在一个函数中,而不是全局作用域
4. 模块中的变量和函数 无法在外部模块中访问
5. 暴露变量和方法: 通过 exports.变量
6. 两大类:
- 核心模块:由node引擎提供
- 文件模块:用户自己创建
三、模块化详解
1. node全局对象global
- 作用和window类似
- 全局创建的变量,会作为global的属性保存
- 全局创建的函数,会作为global的方法保存
2. function(experts,require,module,__filename,__dirname){}
- 模块中的代码 都包装在此函数中,传递5个参数
- experts 该对象将变量和函数暴露在外面 (是module的属性)
- require 函数,用来引入外部模块
- module 代表当前模块本身
- __filename 当前模块的完整路径
- __dirname 当前模块所在文件夹的完整路径
四、包
1. comonjs的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具
2. comonjs的包规范由 包结构和 两个部分组成
- 包结构:用于组织包中的各个文件
- 包描述文件:描述包相关的信息,以供外部读取分析
3. 包结构
- package.json 包描述文件(必需)
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试
五、NPM简介(node package manager)
1. comonjs的包规范是理论,npm是其中一种实践
2. 对于node而言,npm帮助其完成第三方模块的发布、安装、依赖等
3. npm命令
- npm -v 查看npm版本
- npm 帮助说明
- npm version 查看所有模块的版本
- npm search 包名 搜索模块包
- npm install 包名 在当前目录安装包
- npm install 包名 -g 全局模式安装包(全局安装一般是工具)
- npm remove 包名 删除包
- npm install 包名 --save 安装包并添加到依赖中 *
- npm install 下载当前项目所依赖的包
六、node搜索包的流程
1. 通过npm下载的包都放在 node_modules 文件夹中
2. node搜索包的流程
- 首先在当前目录node_modules中寻找是否含有该模块,如果有之间使用
- 如果没有,则去上一级目录的node_modules中寻找
- 如果没有,则再去上一级目录寻找,找到为止
- 如果找不到则报错
七、Buffer (缓冲区)
1. 从结构上看,Buffer像数组,以16进制的形式显示,存储的是二进制数据
2. 实际上,一个元素就表示内存中的一个字节
3. Buffer中的内存 不是通过js分配的,而是在底层通过C++申请的
let str = 'hello buffer';
// 将一个字符串保存到buffer中
const buf = Buffer.from(str)
console.log(buf) // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
// 占用内存的大小
console.log(buf.length) //12
// 字符串的长度
console.log(str.length) //12
4. 可以直接通过Buffer来创建内存中的空间
5. Buffer的方法
- Buffer.from(strign) 将一个字符串转换为buffer
- Buufer.alloc(size) 创建一个指定大小的Buffer
- Buffer.allocUnsafe(size) 创建一个指定大小的Buffer,可能包含敏感数据
6. 注意:buffer的构造函数都是不推荐使用的
// buffer的构造函数都是不推荐使用的
// 创建一个指定大小的buffer
// 10个字节的buffer
// const buf2 = new Buffer(10)
// 创建10个字节的buffer
const buf2 = Buffer.alloc(10);
// 通过索引,来操作buf中的元素
buf2[0] = 8
console.log(buf2) //<Buffer 08 00 00 00 00 00 00 00 00 00>
7. 使用场景:用户给服务器 发送请求(二进制数据)的数据 ,和服务器返回响应的数据(二进制数据) ,都是存在Buffer里面的
八、fs文件系统(File System)
1. 文件系统:就是通过Node来操作系统中的文件
2. 在node中,与文件系统的交互很重要。服务器的本质,就是将本地的文件发送给远程的客户端。
3. 使用文件系统:引入fs模块
4. 同步和异步调用
- fs模块中所有的操作有两种形式:同步和异步
- 同步文件系统:会阻塞程序的执行,也就是除非操作完毕后,否则不会向下执行代码
- 异步文件系统:不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回
5. 同步文件的写入
- 打开文件:fs.openSync(path,flag[,mode])
- path:要打开文件的路径
- flag:打开文件要做的操作的类型 (r:只读的 ; w:可写的)
- mode:设置文件的操作权限,一般不传
- 返回值:该方法会返回一个文件的 描述符 作为结果,可以通过该描述符对文件进行各种操作
- 向文件中写入内容:fs.writeSync(fd,string[,position[,encoding]])
- fd:文件的描述符,需要传递要写入的文件的描述符
- string:要写入的内容
- position:写入的起始位置
- encoding:写入的编码,默认utf-8
- 保存并关闭文件:fs.closeSync(fd)
//完整的fs同步写入
// 使用文件系统:引入fs模块
const fs = require('fs')
// 同步文件的写入
// 打开文件
// 返回值:返回一个文件的描述符
const fd = fs.openSync('hello.txt', 'w')
console.log(fd); // 3 (已经打开了)
// 向文件中写入内容
fs.writeSync(fd, '我已经通过nodejs写入内容了')
// 关闭文件
fs.closeSync(fd)
6. 异步文件的写入
- 打开文件:fs.open(path,flag[,mode],C)
- callback:通过参数返回结果
- callback的两个参数:err 错误对象,没有错误则为null ; fd 文件描述符
- 异步没有返回值
- 向文件中写入内容:fs.write(fd,string[,position[,encoding]],callback)
- 保存并关闭文件:fs.close(fd)
// 异步文件写入
const fs = require('fs')
// 1.打开文件
fs.open('hello2.txt', 'w', (err, fd) => {
// console.log(arguments);
if (!err) {
console.log(fd); //3
// 2.写入文件
fs.write(fd, '写入hello2', err => {
if (!err) {
console.log('成功写入~~~');
}
})
// 3.关闭文件
fs.close(fd, err => {
if (!err) {
console.log('文件已关闭');
}
})
} else {
console.log(err);
}
})
7. 简单文件写入:异步和同步
- fs.writeFile(file,data[,option],callback)
- 操作符flag:r 读取 ; w(默认) 写,会替换原有文件 ; a 写,用于追加不会替换
- fs.writeFileSync(file,data[,option])
// 简单文件写入
const fs = require('fs')
fs.writeFile('hello3.txt', '这是通过writeFile写入的内容', err => {
if(!err){
console.log('成功写入~~~~~');
}
})
8. 流式文件写入
- 同步、异步、简单文件写入的缺点:都不适合大文件的写入,性能较差,容易导致内存泄漏
- 创建可写流:const ws = fs.createWriteStream(path[,options])
- path:文件路径
- options:配置参数
- 写入文件:ws.write()
- 关闭文件:ws.end()
const fs = require('fs')
// 流式文件写入
// 创建一个可写流
const ws = fs.createWriteStream('hello3.txt')
console.log(ws);
// 通过ws向文件输出内容
ws.write('通过可写流写入文件的内容 ')
// 关闭流
ws.end()
9. 简单文件读取
- 同步:fs.readFileSync(path[,options])
- 异步:fs.readFile(path[,options],callback)
- path:文件路径
- options:读取选项
- callback:通过回调函数将读取到的数据返回
- 参数err:错误对象
- 参数data:读取到的数据,返回的是一个Buffer
const fs = require('fs')
fs.readFile('hello3.txt',(err,data)=>{
if(!err){
console.log(data); // 返回的数据是一个buffer
}
})
10. 流式文件读取
- 流式文件读取适用于比较大的文件,可以分多次将文件读取到内存中
- 创建可读流:const rs = fs.createReadStream(path[,options])
- 监听流的开启和关闭:使用once()方法可以监听开启和关闭
- 读取可读流的数据:必须为可读流绑定一个data事件,会自动读取数据和关闭可读流
- rs.pipe(ws):可以将可读流中的内容,直接输出到可写流中
ws.once('close', () => {
console.log('可写流关闭了');
})
// 读取可读流的数据
// rs.on('data', data => {
// // console.log(data);
// ws.write(data)
// })
// 将可读流中的内容,直接输出到可写流中
rs.pipe(ws)
11. fs模块的其他方法
- fs.existsSync(path):检查一个文件是否存在,返回一个Boolean值
- 获取文件的状态:
- fs.statSync(path)
- fs.stat(path,callback(err,stat)):callback返回对象,保存了当前对象状态的相关信息
- 删除文件
- fs.unlink(path,callback)
- fs.unlinkSync(path)
- 读取一个目录的目录结构
- fs.readdir(path[,options],callback)
- fs.readdirSync(path[,options])
- 截断文件,将文件修改为指定大小
- fs.truncate(path,length,callback)
- fs.readdirSync(path,length)
笔记到这里就结束了,这只是关于node.js最最简单的入门了。
本意是自己温故,如果能帮到你一点点,真是这篇笔记的荣幸。