NODE基础(五)

来源:互联网 发布:学编程的游戏 ios 编辑:程序博客网 时间:2024/06/05 10:43

复习

  • 异步究竟用在了哪里?
    • rs.readFile();//node中文件操作 都有一半是异步的
    • 访问数据库也是异步的
    • 用户通过浏览器访问一个网站,数据的输出(请求),浏览器看到了首页的样子(服务器对我们的输入)响应
    • nodejs :建议我们多使用异步


fs.readFileSync();//5秒 + 2秒小猪等待和询问(节约的如何检测文件读写完毕的机制时间)
//后续操作5秒打妖怪
….
10秒

fs.readFile(); //;立刻执行后续代码
5秒打妖怪
主线程程序结束以后
还是要读文件,可能花上5秒时间

  • node异步处理就是遇到一个异步代码就从线程池中拿出一个线程,直到执行完毕,放回线程池
    • 主线程在执行完你所能看到的代码后,继续执行异步操作中的回调函数
  • npm nrm 找不到路命令
    • npm init/install/uninstall/docs
    • nrm nodejs中的3M
    • nvm node版本管理工具(绿色版)
    • nvm :
    • 安装 nvm install 5.11.0 [系统位数] 或者install 5.11 后面版本号自动匹配
    • 卸载 nvm uninstall
    • 查看 nvm ls
    • 切换 nvm use 版本号
    • npm(根据node具体版本来兼容) npm 3.0以后,安装包的目录编程了全部都在一级目录,为的是共享依赖包
    • npm init/install/uninstall/docs
    • nrm 切换和管理npm镜像源的工具
    • 查看 nrm ls
    • 切换 nrm use 镜像源别名
  • try catch


try{
code1:JSON.parse('dasdsad');... //如果code1出现异常,code2执行吗?不执行,直接进入catch块
**Syntax Error** if(正则匹配不符合){ throw new SyntaxError(); }
**BadMan Error** if(badMan){ throw new BadMadError(); }
code2...
code3...
}catch(e){
code4...
//如果不是我预期的异常,我就在这里throw
}

异步

  • 异步带来了什么问题?
    • 异步操作执行结束时机无法获知
    • 只要包含异步操作的代码异常无法捕获
    • 异步操作无法return

回调

  • 当异步内操作完毕调用回调函数,获知异步内操作结束时机(保障程序的执行顺序)
  • 当异步内操作完毕后,调用回调函数,将返回值作为参数传递
  • 异常对象和数据对象都可以作为回调函数的参数传递
    • 在外部无法根据一个参数来判断,所以我们需要多个参数
    • nodejs建议回调函数参数列表:错误优先,函数的参数:回调函数最后
    • fs.readFile(path,xxx,function(){})

path 路径处理模块

  • path 管不管文件存在? 不管,只操作字符串路径的解析
  • join 可以矫正输入错误的路径


path.substr(path.lastIndexOf('/'),path.length-1);//大家好
所有的代码实现:基于需求,使用人群
path核心对象提供给:后端开发人员,全站开发
- basename(p[, ext]) 获取路径的文件名称-->和parse对象的base
- dirname(p) 获取的是目录路径,不包含文件名称 --> 和parse对象的dir一致
- extname(p) 获取的是路径的后缀名 .txt -->parse对象的ext属性一致
- join([path1][, path2][, ...]) **会去自动的矫正路径,比如多个/ /也能解析**
- parse(path) //根据路径去解析一个对象

{ root: ‘C:/’,
dir: ‘C:/大家好///你好//’,
base: ‘好dodo.txt’,
ext: ‘.txt’,
name: ‘好dodo’ }

- format(pathObject) //根据路径对象解析成路径字符串 根据属性来做dir,base,

滚动歌词案例

  • 1:引入文件对象
  • 2:读取歌词文件 ——->整个文件字符串
  • 3:切割文件 \r\n –> 获取一个数组,一行一行的字符串
  • 4:遍历数组
  • 5: 一行数据、 正则匹配:凡是我们需要匹配的原封不动给\ ,我们需要拿到的数据,分组
  • 6: 执行正则,获取数组,arr[0] 元素我们不需要
  • 7: 计算时间,arr[1]~arr[4], 毫秒值是不被计算的情况,担心他本身是一个字符串,用加号连接会出问题
  • 8: 通过定时器调用
  • 9: 在定时器内输出内容

ES6


webStorm:ES6–>设置–>语言和框架–>JavaScript–>下拉菜单ES6
* chrome对ES6的支持非常好,基于V8的node完全不是问题
* ES6的初衷是为了让js语言更加健壮、完善,更为适合大型应用的开发
- use strict 严格模式
- 旨在消除一些不严谨,不合理的语法问题
- 严格模式要求先声明后使用

let关键字

  • 案例演示
    • let重复声明和var重复声明的区别
    • let是块级作用域,不会提升成全局变量
    • 块级作用域,首选遵循就近原则,如果当前有,就使用,
    • 否则就到更大的作用域中查找
  • 使用方式
    • 不允许重复声明
    • let是块级作用域,不会提升成全局变量
    • 块级作用域,首选遵循就近原则,如果当前有
    • 就使用,否则就到更大的作用域中查找 ,块级指的就是{}
    • 如果不在可见的{}内,那么就是在整个模块内

const关键字

  • 注意:
    • 也是块级作用域
    • 先完成初始化(声明并赋值)才能使用
    • 只能被赋值一次
    • 可以对属性修改,不能直接修改指向(=)
  • 应用场景
    • 画球声明PI
    • 1024 在我们认为的1024是1M 转换单位,更久不变
    • 硬盘厂商就是1000的常量
  • 值和引用的问题
    • 只有= 才叫赋值。。对象=值,将这个值赋给这个对象,此时指向已经改变
    • 对象.属性 = 值,对象原来指向不变,对象中的属性发生改变。const 可以这样

拼接(模板)字符串及相关函数

  • 使用方式:
    • 通过反引号(tab上面的键)包裹的字符串
    • 可以接受换行
    • 可以嵌入变量
    • String.raw“
ES6:新增函数* 字符串4:  字符串对象A.includes(字符串对象B) 判断是否包含 返回boolean  字符串对象A.startsWith(字符串对象B) 判断是否以b开头 返回Bool  字符串对象A.endsWith(字符串对象B) 判断是否以b结尾 返回Bool  字符串对象A.repeat(x次数) 重复输出a字符串x次* Math  Math.trunc(1.1) //截取整数位* 数组Array  Array.from({'1':'abc','0':'des',length:2}) 通过对象创建数组  Array.of(1,2,3,4); * 数组查找元素  数组.find(function(num,index,arr){      return num == 1;     })* 数组查找下标数组.findIndex(function(num,index,arr){    return num == 1;   })

箭头函数

  • 使用方式
    • 没有参数
    • let func = ()=> 1;
    • 多个参数
    • let func = (n1,n2)=>n1+n2;
    • 多行代码
    • let func = (n1,n2)=>{ code…}
  • 箭头函数中的this只绑定声明时的对象,而不是调用时的对象,this不再多变
  • 箭头函数没有arguments
  • 箭头函数不能做构造函数
  • 应用场景:匿名函数作为参数来传递

文件IO


二进制数据

  • 二进制
  • 字节 计算机存储数据我们可见的最小单位
  • 对于文本数据,计算机会保存文本内容码表对应的位置值,显示的时候就根据码表对应的位置值找到该字符 ,例:文本中a 对应计算机内的97 a:97 A:65 0:48

Buffer

字符串转Buffer

  • 早期可以使用 new Buffer的方式,现在nodejs不建议,已是过时的方法
  • 创建:Buffer.from(数组、字符串、数字); //nodejs 需要 v5.10.0以后的版本

Buffer 转字符串

  • toString([endecoing][,offset][,end]);//如果需要制定从那一部分开始转换字符串,就需要给定编码
  • 在nodejs中encoding默认是utf8
  • 在utf8中,一个中文是三个字节

write函数

  • 向buf中写入数据
  • buf.write(string, [offset起始], [length长度], [encoding编码])

文件操作

读写文件

  • 在fs核心模块中,对所有文件操作都提供了同步和异步版本
  • 如果给定编码,拿到的是字符串。
  • 默认是utf8,其他地方utf-8
  • 写入文件:文件不存在,自动创建文件,创建文件的时候,会将文件内容清空,如果希望追加数据可以传入 options对象


let options = {encoding:'utf8',flag:'a',autoclose:true}; //a表示append,autoclose表示出现异常或者结束之后自动关闭资源连接
fs.writeFile(path路径,data数据,[options可选对象],callback);
//第二种方式追加
appendFile(path,data,options,callback(err){})

图片加密

  • 加密解密原理
    • 异或运算,一个数被同一个数异或两次就是他本身
    • 异或运算符 是^:shift + 6

文件相关操作

在操作一个文件之前可能需要判断文件是否存在 fs.exits(); //过时了fs.stat(path,callback(err,stats))fs.Stats对象stats.isFile() //返回bool,判断是否是文件stats.isDirectory() //返回bool,判断是否是文件夹fs.readdir(path, callback(err,files))// 需求: 通过一个路径,做一个遍历文件名fs.rename(oldPath,newPath,callback) 移动文件(重命名)

state状态说明

size 文件的大小mtime 修改的时间birthtime  创建时间

目录相关操作


读取一个目录
fs.readdir(path,callback(err,files))
监视文件变化:
fs.watchFile(filename[, options], listener(curr,prev))
options:{persistent,interval}
fs.watch(filename[,options][,listener])
* 目前比较流行的文件监视
npm install chokidar
chokidar.watch(文件路径, ).on('all', (event, path) => {
console.log(event, path);
});

API application programming Interface 应用程序编程接口
如果使用,API: 使用说明说

案例:利用监视文件功能实现一个markdown文件转换器

  • 文件监视 chokidar
  • md转html markdown-it
  • 路径的转换 path
  • 模板来转换,添加body
  • browser-sync start –server –files ./node_05.html 实现实时刷新

FS总结


  • 掌握读和写文件就ok

ES6总结


  • 让JavaScript更加完善,更加健壮,更适合更大型应用的开发
  • 对于严格模式(use strict)
    • 旨在消除一些怪异、不符合逻辑的代码,比如未声明就使用
  • let
    • 块级作用域,不存在变量类型提升,块指的是{},代码内部没有{}。代表就是模块的作用域
    • 如果该对应被其他模块引入 根据其他模块的声明情况来看 let xx =require(‘xx’);
    • 不能重复的声明
    • 查找机制–>就近原则
  • const
    • 应用场景基于更久不变的数值,核心对象或者第三方包对象
    • 块级作用域
    • 必须先完成初始化 声明+ 赋值,再使用
    • 不可以被二次赋值,可以修改属性值
  • 模板字符串
    • 可以包含换行
    • 可以嵌入变量
  • 扩展函数
    • startsWith/endsWith/数组对象.findIndex/数组对象.find/Math.trunc
  • 箭头函数
    • 箭头函数的this不再多变,绑定的是声明时所在的对象,不再是调用时所在的对象
    • 箭头函数没有arguments
    • 不能当做构造函数使用
    • 作为匿名函数参数的传递
0 0
原创粉丝点击