ES6
- 严格模式
- use strict 必须先声明后使用
- let
- 块级作用域 变量当前声明所在的{} ,没有{}就是模块的作用域,相比var不存在变量类型提升
- 查找机制:就近原则,如果当前{}内有声明,直接使用,没有声明,向上级作用域查找
- 不能重复声明
- const
- 块级作用域
- 使用方式: 首先完成初始化,声明并且赋值
- 不能二次赋值,直接用等号=赋值该对象,用该对象.属性=值,修改对象的属性值
- 模板字符串
- 能够包含换行
- 能够嵌入变量
- 原生字符串:String.raw
hello\r\nworld
只有模板字符串能这么玩
- 扩展函数
- Math.truc 截取整数部分
- 数组.find(function(ele,index,数组对象){})
- 数组.findIndex(function(ele,index,数组对象){})//查找数组元素下标
- 字符串对象.startsWith(‘xxx’);//判断是否以xxx开头
- 字符串对象.endsWith(‘xxx’);
- 箭头函数
- function(){}
- ()=>{} //如果不是多行,可以省略{}
- 箭头函数的this不再多变,绑定声明时所在的对象
- 箭头函数没有arguments
FS核心对象
- path对象
- path.basename();//文件名称
- path.dirname();//目录名称
- path.extname();//获取后缀名 .txt
- basename + dirname = 绝对路径
- path.join(过个参数path); //拼接路径并且矫正不合法的路径写法,返回路径字符串
- path.parse(path);//解析路径字符串返回路径对象,修改base属性,名称及可以改变
- path.format(obj);//格式化一个对象成为路径字符串
- fs.readFile(path路径,options对象||’utf8’,(err,data)=>{});//读取文件
- fs.writeFile(path路径,data数据,options,(err)=>{}); //flag :’a’追加
- fs.appendFile(path路径,data数据,(err)=>{});//文件追加
- fs.stat(path路径,(err,stats)=>{});//获取文件信息对象
- stats.isFile()/isDirectory()目录/size文件大小/mtime修改时间/birthtime创建时间/
- fs.readdir(path,(err,files)=>{})//读取目录
文件的监视
- 早期nodejs的fs核心模块对于监视文件有一系列问题
- mac系统上出现report功能不兼容
- 占用CUP高,会让内存暴增
- 会出现两次监视
- 子文件夹监视不能实现
- fs.watch(filename[, options][, listener]) 监视文件改动
- chokidar 解决原生fs模块存在的问题
- 小补充
- num => num; //看得懂就可以了,一个形参可以省略括号
- (num1,num2) => 1;
流
- 可以读取的内容最大是2G
- 原本nodejs中读取文件依据的是有多大文件,就创建多大的缓冲区buf
- 过大的文件会造成内存溢出
- nodejs提供了一种操作流的方式,内部默认的缓冲区大小是65536byte
- 我们通过事件(IO操作是异步的)的机制,注册了一个当流中有数据的回调
- 如果有数据,我们通过对应形参data拿到数据在nodejs内存中,直接向输出流内写入,最终写入到文件
- rs.pipe(ws); 实际上省略了API相关的操作,原理上IO的读写是不变的,
- 我们直接将读取的数据通过Pipe,直接建立一个管道,从输入流直接流向输出流(还是基于Nodejs)
- 默认我们读取文件IO,是一个字节一个字节的读取,这样效率太低,来回访问次数过多
- 对于读取大文件,创建一个缓冲区(篮子),通过篮子减少来回访问的次数,提高效率
- pipe 实际上节约的API繁琐的操作,仍然有缓冲区
- 流对象.pipe(流对象) rs.pipe(ws);
http
- http是一种协议,数据格式的约束
- 协议:约束多方,遵守规定,完成更好的协议(客户端–服务器)
- 一问一答,有问才有答
- 五大特点
- 支持客户端、服务器架构
- 简单
- 灵活
- 无状态 服务器不会去记录用户上次访问的 cookie session来解决
- 无连接 服务器不会为客户端hold住连接,请求过来建立连接,请求结束,关闭连接
- http1.1 会对一个客户端来的请求hold住连接,这样可以存在一次开启,多次请求
socket
- 一台计算机中有65536个端口 –> 如果有一个程序,使用一个端口
- 通过IP能找到计算机,通过端口找到对应的程序
- Socket 套接字,是一个网络连接对象
- socket = IP + 端口
http核心模块相关对象
- 服务器对象 server
- let server =http.creatServer(linsener);
- 客户端对象 client
- let client = http.request();
- 请求对象 request
- 封装了一些请求相关的数据
- 响应对象 response
- 封装了服务器向客户端返回数据的功能
http基本使用(连接事件)
- 127.0.0.1 本地回环地址,也就是找到自己,localhost
- 关于端口,我们尽量选择1024以上的,1024以内可能已经被占用了,有些是一些系统程序
- 最终不要超过65535
事件 : 'request'
let server = http.createServer([requestListener])
server.listen(port, [hostname], [backlog], [callback])
* 案例演示: 多人连接服务器,连接成功打印数据
获取数据(request)
request.method
request.url
request.headers
- http 请求报文数据
- 请求首行:请求方式 请求url http版本
- connection: ‘keep-alive’ 由于http1.1协议,浏览器默认加上了该字段,表示支持长连接
- user-agent 判断访问服务器的设备类型,企业中根据类型做适配
- accept 支持的文件类型
- accept-encoding’: ‘gzip, deflate, sdch’ 告知服务器,本浏览器支持什么压缩方式
- 案例演示: 获取请求数据
http数据交互(response)
response.setHeader(name, value)
response.writeHead(statusCode, [headers])
response.write(chunk, [encoding])
response.end([data], [encoding])
- 案例演示: 将数据显示在页面
小补充
npm i -g nodemon
启动: nodemon app.js
服务器响应浏览器状态码:
1开头 ---正在执行
2开头 ---执行成功
3:开头---重定向(转移资源)
301 永久重定向
302 临时重定向
4开头: 客户端出现的异常
5开头:服务端的异常
- http.STATUS_CODES
- URL完整形式
- URL和URI
- 完整的URL:协议(http):// 域名(www.itcast.com) 端口(:8080) / 路径资源(/question) 锚点(#abc) 查询字符串(?wd=知乎)
- 不完成的URL我们统称为URI,URI范围更广泛,只有严格的URL形式,才算是URL
在地址栏输入网址后页面是如何呈现的?
response要注意的问题
- Can’t set headers after they are sent.(设置了头以后又发送了信息)
- 解决通知浏览器以什么文件方式解析
- res.writeHead(200,{‘content-type’:’text/html’});
- 解决中文乱码
- res.writeHead(200,{‘content-type’:’text/html;charset=utf-8’});
三次握手和四次挥手(TCP)
- SYN(synchronous) 建立联机
- ACK(acknowledment) 确认 建立连接(分配连接的资源)
- FIN(finish)结束
- ACK(acknowledment) 确认
netstat /nao 打印出正在监听的端口。
通过url及请求方式返回静态资源
base64编码图片
转发和重定向
文本类型
聊天室案例
- 案例演示: 基于浏览器的聊天