再看一遍node.js吧
- Node.js REPL(交互解释器)
- Node.js 回调函数
- node.js事件循环
- Node.js EventEmitter
- Node.js Buffer(缓冲区)(二进制操作)
- Node.js Stream(流) (文件操作读取写入文件)
- Node.js 模块系统
- Node.js函数
- node.js 路由
- Node.js 全局对象
- Node.js常用工具
- Node.js文件系统
Node.js REPL(交互解释器)
怎么理解这个交互解释呢,应该和windows的cmd,liunx 的git base here 。可以支持你在这里输入命令并接受系统的响应。
打开 在上面三种环境里输入node 命令 前提是你电脑有node环境的哈
node
如上图所示这个东西就打开喽 它的作用主要有四种
1.读取 -读取用户输入,解析输入的Js数据结构并存储在内存中
2.执行-执行输入的数据结构
3.打印 -输出结果
4.循环-循环操作以上步骤知道用户按下两次ctrl-c退出
打开后和浏览器的控制台又很像就是说
上图这个终端
上图浏览器控制台 就是不能说一模一样也可以说毫无差别吧 啊哈哈
再然后就是它有一些自己的命令
1.ctrl-c 退出当前终端(感觉通用的吧 好多都是这么退出)
2.ctrl-c 按下两次 退出node REPL (退出这个环境) ctrl-d也是这样作用
3.上下箭头查看历史作用
4.tab 列出当前明明
5.help 列出使用命令
6.break 退出多行表达式
7.clear 退出多行表达式
8.save 文件名 保存会话到指定文件
9.load 文件名 载入打过去会话的文件内容
Node.js 回调函数
node.js异步编程的直接提现就是回调,异步编程依托于回调去实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后会被调用,node.js使用了大量的回调函数,node所有的api都支持回调函数。例如,我们可以一边读取文件,一边执行其他命令。在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等到文件i/o执行操作。这种方式会提高node.js的性能,可以处理大量的并发请求。
node.js事件循环
node.js是单进程单线程应用程序,但是因为v8引擎提供的一部执行回调接口,通过这些接口可以处理大量的并发,所以性能很高。
node.js几乎每一个API都是支持回调函数的
node.js基本所有的事件机制都是用设计模式中观察者模式实现的
node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有时间发生就调用该回调函数
事件驱动程序
1.node.js使用事件驱动模型,当web server 接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
2.它被放回处理队列,当到达队列开题,这个结果被返回给用户。
3.这个模型非常的高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作(这也称为非阻塞式IO或者事件驱动IO在这个事件驱动模型真难过,会生成一个主循环来监听事件,当检测到事件时触发回调函数)
Node.js EventEmitter
1.ndoe.js所有的一部I/O操作在完成时都会发生一个事件到事件队列
2.node.js里面的许多对象都会分发事件:一个net.server对象会在每次有新连接时触发一个事件,一个fs.readStream 对象会在文件被打开的时候触发一个事件,所有产生事件的对象都events.eventemitter实例。
event模块值提供了一个对象:eventemitter 。eventemitter的核心就是时间触发与事件监听功能的封装。我们可以通过require("event”)来访问模块
就怎么说呢 如果是先学Vue后来补node基础的家人们要开始熟悉了
$emit $on 这里也是这一套就是说
EventEmitter的每个事件由一个事件名和若干参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器
当事件触发时,注册到这个时间的事件监听器被依次调用,事件参数作为回调函数参数传递。
EventEmitter的属性(方法)
1.addListener(event,listener) 为指定事件添加一个监听器到监听数组的尾部
2.on(event,listener)为指定事件注册一个监听器,接受一个字符串event和一个回调函数
3.once(event,listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器
4.removeListener(event,listener) 移除指定事件的某个监听器,监听器必须是该数据已经注册过的监听器。它接受两个参数,第一个是事件名称,第二个是回调函数名称
5.removeAllListeners([event]) 移除所有事件的所有监听器,如果制定事件,则移除指定事件的所有监听器
6.setMaxListeners(n)默认情况下,eventemitters如果你添加的监听器超过10个就会输出警告信息,这个方法能改变那个最大量。
7.listeners(event) 返回制定事件的监听器数组
8.emit(event,[arg1].[arg2],[…])按监听器的顺序执行每个监听器 如果事件有注册监听返回true,否则返回false
EventEmitter的属性(事件)
1.newListener 该事件在添加新监听器时被触发
2.removeListener 从制定监听器数组中删除一个监听器,需要注意的是,此操作将会改变处于被删监听器之后那些监听器的索引
error事件
EventEmitter定义了一个特殊的事件error,它包含了错误的语义,我们在遇到异常的时候通常会触发error事件,当error被触发时,EventEmitter规定如果没有响应的监听器,node.js会把它当做异常,退出程序并输出错误的信息。我们一般要为触发error事件的对象设置监听器,避免遇到错误后导致的整个程序的崩溃
大多数时候我们不会直接使用EventEmitter,而是在对象中继承它。包括fs,net,http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。这么做的原因有两点
1.具有某个试题功能的对象实现时间符合语义,事件觉得监听和发生应该是一个对象的方法
2.js对象机制是基于原型的,支持部分多重继承,继承eventEmitter不会打乱原有的继承关系.
Node.js Buffer(缓冲区)(二进制操作)
JS语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。但是在处理像TCP流或文件流时,必须使用到二进制数据。因此在node.js中 定义了一个buffer类,该类用来创建一个专门存放二进制数据的缓存区。
在node.js中,buffer类是随node内核一起发布的核心库。buffer库为了node.js带来了一种存储原始数据的方法,可以让node.js处理二进制数据。每当需要在node.js中处理I/O操作中移动的数据时,就有可能使用buffer库。原始数据存储在buffer实例中。一个buffer类类似于一整个整数数组,但它对应于V8堆内存职位的一块原始内存。
(感觉可抽象啊 一点都看不懂这里讲的什么 说是用来存储二进制数据的 缓存 碎碎念)
Buffer与字符串编码
buffer实例一般用于标识编字符的序列,比如utf-8,ucs2,base64,或者十六字编码的数据。通过显式的字符编码,就可以在buffer实例与普通的js字符串值进行相互转换
node.js目前支持的字符编码
1.ascii -仅支持7位ASCII数据。如果设置去掉高位的话,这种编码是非常快的
2.utf-8 -多字节变成的unicode字符。许多网页和其他文档格式都使用utf-8
3.utf16le 小字节序编码的unicode编码
4.ucs2-utf16l2的别名
5.base64 base64编码
6.latin1-一种把buffer编码成一字节编码的字符串的方式
7.binary-latin1的别名
8.hex 将每个字节编码为两个十六进制字符串
(有些实在看不懂了 这章节先跳过了)
Node.js Stream(流) (文件操作读取写入文件)
stream 是一个抽象接口,node中有很多对象实现了这个接口。例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)
Node.js Stream 有四种流类型
1.readable 可读操作
2.writable 可写操作
3.Duplex 可读可写操作
4.Transform 操作被写入数据然后读出结果
所有的Stream对象都是EventEmitter的实例。常用的事件有
1.data -当前数据可读时触发
2.end-没有更多数据可读时触发
3.error-在接收和希尔过程中发生错误时触发
4.finish -所有数据已被写入到底层系统时触发
Node.js 模块系统
为了让node.js的文件可以相互调用,node.js提供看一个简单的模块系统。
模块是node.js应用程序的基本组成部分,文件和模块是一一对象的,换言之,一个node.js文件就是一个模块。这个模块可能是js代码,json或者编译过的c / C++ 扩展。
- 导出:export.xxx ——引入:require(‘地址’)
Node.js存在四种模块(一种原生模块,3种文件模块)
1.从文件模块中缓存中兼职
尽管原生模块与文件模块的优先级不同,但是都会优先从文件模块的缓存中加载已经存在的农垦
2.从原生模块加载
原生模块的哟县级仅次于文件模块缓存的优先级。require方法在捷信文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目录下存在一个http/http.js require(‘http’) 都不会从这些文件中加载,而是从原生模块中加载,原生模块也有一个缓存区,同意也是有限从缓存区加载。如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。
3.从文件加载
当文件模块缓存中不存在而不是原生模块的时候,node.js会解析require方法传入的参数,并从文件系统重加载实际的文件。
Node.js函数
在Js中 ,一个函数可以作为另一个函数的参数。
我们可以先定义函数在座位参数传递也可以在传递参数的地方直接定义函数,都是一样的。
function aaa(){
xxx
};
function bbb(aaa){
};
function ccc(fuction(){
});
node.js 路由
API接口通常用于数据的传输和处理。路由是指将特定的URL请求映射到相应的处理函数或类方法,以便处理该请求并返回相应的数据。
Node.js 全局对象
js中含有一个特殊对象,称为全局对象(global object),它以及其所有的属性都可以在程序的任何地方访问,即全局变量。在浏览器Js中,通常全局对象是window。而node.js中全局对象是global,所有全局变了都是gobal多选的属性。在node.js我们可以直接访问到global属性,而不需要再应用中包含它。
全局对象与全局变量
global最更笨的左右是作为全局变量的宿主。安装ecmascript的定义,满足一下条件的变量是全局变量
1.在最外层定义的变量
2.全局对象的属性
3.隐式定义的变量(未定义直接赋值的变量) (这里和全局状态提升有些关系)
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。咋node.js只能怪你不可能在最外层定义变量因为所以得用户代码都是属于当前模块的,而模块本身不是最外层上下文。
1._filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置绝对路径,且和命令行参数所指定的文件名不一定相同。如果在模块中华魂返回的值是模块文件的路径
2._dirname 表示当前执行脚本所在的目录
3.两个定时器和清除定时器的方法也是全局对象
4.console 也是全局对象 (不累述)
5.Process 是一个全局多选。它用于描述带你过去node.js进程状态的对象,提供了一个与操作系统的简单接口。(和进程有关)
Node.js常用工具
util 是一个Node.js核心库,提供常用函数的集合,用于弥补核心js的功能公寓精简的不足
使用要先引入
const util =require('util')
1.util.callbackify 将异步函数(或者一个返回值为promise的函数)转换成遵循异常优先的回调风格的函数。
2.util.inherits 是实现一个对象减原型继承的函数。js的面向对象的特性是基于原型的,与常见的基于类的不同。js没有提供对象继承的语言级别的特性,而是通过复制原型实现的
3.util.inspect 是一个将任意对象转换为字符串的方法,通常用于调试和错误的输出。它至少接受一个参数object,即要转换的对象。
4.util.isArray 判断参数是不是数组
5.util.isRegExp 判断参数是不是正则表达式
6.util.isDate 判断参数是不是日期
Node.js文件系统
node.js提供了类似unix(posix)标准的文件操作API。
node.js文件系统(fs模块)模块中的方法均有异步和同步版本。例如读取文件内容的函数有异步的fs.readFile()和异步的fs.readFileSync()。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息。官方建议大家使用异步方法,比起同步,异步方法性能能搞,速度更快,而且没有阻塞。
const fs=requrie('fs')
打开文件
fs.open(path,flags[,mode],callbacl)
open的参数使用说明如下
1.path-文件的路径
2.flags- 文件的打开行为
Flags | 描述 |
---|---|
r | 以读取模式打开文件。如果文件不存在抛出异常 |
r+ | 以读写模式打开文件。如果文件不存在则抛出异常 |
rs | 以同步方式读取文件 |
rs+ | 以同步的方式读取和写入文件 |
w | 以写入模式打开文件,如果文件不存在则创建 |
wx | 以写入模式打开文件,如果文件不存在则创建。如果文件路径存在,则文件写入失败 |
w+ | 以读写模式打开文件,如果文件不存在则创建 |
wx+ | 已读写模式打开文件,文件存在写入失败 |
a | 以追加模式打开文件,如果文件不存在则创建 |
ax | 类似‘a’,但是如果文件存在,则文件追加失败 |
a+ | 以读取追加模式打开文件,如果文件不存在则创建 |
ax+ | 类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。 |
3.mode-设置文件模式(权限),默认可读可写
4.callback - 回调函数
获取文件
fs.stat(path,callback)
fs.stat('xxx.js', function (err, stats) {console.log(stats.isFile()); //true
})
stat的类方法用来判断文件的相关属性
方法 | 描述 |
---|---|
isFile | 是不是文件 |
isDirectory | 是不是目录 |
isBlockDevice | 是不是块设备 |
isCharacterDevice | 是不是字符设备 |
isSymbolicLink | 是不是软链接 |
isFIFO | 是不是FIFO |
isSocket | 是不是socket |
写入文件
fs.writeFile(file,data[,options],callback)
异步写入文件,直接打开文件默认是w模式,如果文件存,该写入的内容会覆盖旧的文件内容
1.file 文件名或文件描述符
2.data 要写入文件的数据,可以说String或Buffer
3.options 对象 配置项 有默认值
4.callback 失败的回调
读取文件
fs.read(fd,buffer,offset,length,position,callback)
异步模式下读取文件的语法格式
1.fd 通过fs.open 方法返回的文件描述符
2.buffer 数据写入的人缓冲区
3.offset 缓冲区西融入的写入偏移量
4.position 文件读取的其实位置,如果postion的值为null,则会从当前文件的指针位置读取
5.callback 回调函数 有是哪个参数err(错误信息),bytesRead(读取的字节数) buffer (缓存区对象)
关闭文件
fs.close(fd,callback)
异步模式下关闭文件的语法格式,使用了文件描述符来读取对象
1.fd 通过fs.open 方法返回的文件描述符
2.callback 回调函数没有参数
–未完待续–