node node是什么 Buffer 模块化开发 第三方模块 事件订阅机制EventEmitter
Posted bnzw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node node是什么 Buffer 模块化开发 第三方模块 事件订阅机制EventEmitter相关的知识,希望对你有一定的参考价值。
一, 为什么学习node
- 能够了解后台,可以和后端的程序员更加紧密的配合
- 前段人员至少需要一门后端技术的掌握(ajax)
- 扩展视野
二,node是什么?
node不是一门语言,而是一个开发平台,是一个基于chromeV8引擎。
开发平台:有对应的语言和实现特定功能的api
node特点
所谓特点,就是node.js如何解决服务器的高性能瓶颈问题
异步I/O
单线程会有等待问题,加入有10个线程,等第一个完事,开始第二个,就会有等待阻塞的问题。
i/o操作就是input和output;输入/输出的问题(读和写),但是,node里面的这个意思,是网络传输中的 ---请求/响应
非阻塞
不排队,不等待
事件循环
客户请求建立连接,提交数据,会触发一个事件,在node中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件的回调函数的中途,可以转为处理其他事件,(又有新的用户进来),返回继续执行事件的回调函数,这种机制,就是事件循环机制
node的单线程仅仅是指javascript的运行在单线程中,也就是说node.js本身是一个多线程平台,而对于javascript层面的任务处理是单线程。
node进目录文件
cls:清屏
dir:列出当前目录下的文件
cd:目录名,进入到指定的目录
cd ../:返回到上一层
输入node,进入node编辑环境,这个时候,不能执行js文件,属于环境挂起,按住ctrl+c退出
rd:删除一个文件夹
顶层对象global
全局对象
__filename
表示当前执行的脚本文件,输出的是所在位置的绝对路径
__dirname
表示当前执行的脚本的所在的目录
三, Buffer
专门用来存储二进制数据,使得Buffer不需要引入模块,直接使用就可以,所以是一个全局对象
Buffer初始化
Buffer用来处理二进制数据流
实列类似整数数组,大小固定
在全局作用域中,可以直接使用
语法:
Buffer.from(string ending)
返回一个被string的值初始化的新的Buffer实列
// 创建一个长度为10的Buffer
// 默认的编码格式 是 utf-8
const buf1 = Buffer.from([1,2,3]);
const buf2 = Buffer.from(‘test‘);
const buf3 = Buffer.from(‘test‘,‘base64‘);
console.log(buf3);
Buffer编码
当Buffer和字符串之间转换的时候,可以指定编码格式,默认的就是utf-8
const buf = Buffer.from(‘hello word‘,‘utf8‘);
console.log(buf.toString(‘hex‘));
console.log(buf.toString(‘base64‘));
console.log(Buffer.from(‘dewdwdewdwed‘,‘utf16le‘));
写入缓冲区
语法:
buf.write(string,offset,lenght,ending)
string:写入缓冲区的字符串
offset:缓冲区开始写入的索引值,默认值是 0
lenght:写入的字节数,默认值是buf.length
ending:使用的编码格式,默认时候utf8
// 实列一个对象,并规定大小
const buf = Buffer.alloc(200);
const len = buf.write(‘www.baiduewfdwfwfwefwfewefewfwefwefewf.com‘);
console.log(‘写入字节数:‘ + len);
从缓冲区读取数据
语法:
buf.toString(ending,start,end)
ending:使用的编码格式,默认时候utf8
start:指定开始读取的索引位置,默认值是0
end:结束位置,默认值是缓冲区的末尾
const len = buf.write(‘www.baidu.com‘);
console.log(buf);
console.log(buf.toString());
const buf1 = Buffer.from(‘hello world‘);
console.log(buf1);
console.log(buf1.toString(‘base64‘));
将Buffer转换为JSON对象
语法:
buf.toJSON()
返回值:JSON对象
const buf = Buffer.from([1,2,3,4]);
const json = buf.toJSON();
console.log(json);
const buf = Buffer.from([1,2,3,4]);
const json = JSON.stringify(buf);
缓冲区的合并
语法:
Buffer.concat(list,length)
list:用于合并的Buffer对象的数组列表
length:指定合并后Buffer对象的总长度
const buf1 = Buffer.alloc(100);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
console.log(buf3);
const totalLength = buf1.length + buf2.length + buf3.length;
// console.log(totalLength);
const bufA = Buffer.concat([buf1,buf2,buf3])
console.log(bufA);
四, 模块化开发
javascript在使用的时候,会出现文件依赖和命名冲突
node中的模块化开发
exports对象对模块中的内部成员导出,使用require方法导入到模块中
exports.变量名/方法名 = 变量名/方法名 // 导出
let a = require(导出模块的那个文件的路径)
// a.js
let version = 1;
const sayHi = name =>`您好 ${name}`;
// 把这个变量名导处去
exports.version = version
exports.sayHi = sayHi
// b.js
let a = require(‘./a.js‘);
console.log(a.version);
console.log(a.sayHi(‘刘德华‘));
模块成员的另一种导出方式
module.exports.version = version;
module.exports.sayHi = sayHi;
exports和module.exports两者的使用区别
exports是module.exports的别名(小名)他俩的关系就是一种地址引用的关系,导出的对象最终以module.exports为准
module.exports = {
name: ‘张三‘,
age: 20
}
exports = {
age:50
}
系统模块
node运行环境提供的API都是以模块化的方式运行开发的,所以我们又称为node运行环境提供的API为系统模块
file文件 s:system;文件的操作系统
let fs = require(‘fs‘)
自定义模块引入
let fs = require(路径)
读取文件内容
fs.readFile(‘文件路径‘,‘编码‘,calllback)
callback:错误 数据
使用
let fs = require(‘fs‘)
fs.readFile(‘./css/style.css‘,‘utf-8‘,function(err,doc){
// 如果文件读取发生错误,参数err的值为错误对象,否则err的值为null;
// doc参数就是文件内容
if(err == null){
console.log(doc);
}
})
给文件写入内容
fs.writeFile(‘文件路径‘,‘数据‘,callback)
let fs = require(‘fs‘);
var content = ‘<h3>我是标题</h3>‘
fs.writeFile(‘./index.html‘, content, function (err, doc) {
if (err != null) {
console.log(err);
return;
}
console.log(‘写入成功‘);
})
五, 什么是第三方模块
别人写好的,有特定功能的,可以直接使用的模块,由于第三方模块是由多个文件组成并放置在一个文件夹中,所以我们称为包
包的描述:
package.json:包各种描述
bin:用于存放可以执行的二进制的目录
lib:用于存放js的目录
doc:用于存放文档或者文档目录
test:用于存放测试数据或者单元测试使用的案例代码
npm install 第三方模块的名称 // 本地安装
npm install 第三方模块的名称 -g // 全局安装
全局安装:把模块安装到一个公共的地方,所有的项目都可以使用
本地安装:把模块安装到当前项目中的某一个文件,只有当前的这个项目使用
卸载模块
npm uninstall 模块名称
生成介绍项目的json文件
npm init // 生成一个描述的json文件
查看包的注册信息
npm view
用于搜索npm仓库,后面可以跟字符或者表达式(正则)
npm search
安装nrm第三方模块
npm install nrm -g
安装cnmp淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org/
六, 事件订阅机制EventEmitter
node所有的I/O异步完成时都会发送一个事件到事件队列
EventEmitter类
events这个模块只提供了一个对象:events.EventEmitter,核心就是事件触发和监听器的封装
require(‘events‘);// 访问这个模块
EventEmitter提供了多个属性,on和emit,on函数用于绑定事件,emit用来触发一个事件
var events = require(‘events‘); // 引入这个模块
// 创建一个对象
var eventEnitter = new events.EventEmitter();
console.log(eventEnitter);
如果发生错误,会触发一个error事件,当添加的新的监听器,new Listener会被触发
var EventEmitter = require(‘events‘).EventEmitter;
// 实列化一个对象
var event = new EventEmitter();
// 绑定事件
event.on(‘a‘,function(){
console.log(‘a这个事件被触发了‘);
})
// 触发事件
event.emit(‘a‘);
事件参数作为回调函数的参数传递
var events = require(‘events‘); // 引入这个模块
// 实列化一个对象
var emiter = new events.EventEmitter();
// 绑定事件
emiter.on(‘a‘, function (a1, a2) {
console.log(‘第一个‘,a1, a2);
})
emiter.on(‘a‘, function (a3, a4) {
console.log(‘第二个‘,a3, a4);
})
emiter.emit(‘a‘,‘a1参数‘,‘a2参数‘);
属性和方法
addListener(event,listener) 为指定事件添加一个监听器
on(event,listener):为指定事件注册监听器
once(event,listener):注册单次的监听器
removeListener(event,listener):为指定事件移除一个监听器
removeAllListeners(event):为指定事件移除所有监听器
setMaxListener(n):超过十个有警告
listeners(event):返回监听事件的监听器数组
emit(event,1,2,3,4):顺序执行每一个监听器
// 属性和方法
var events = require(‘events‘); // 引入这个模块
// 实列化一个对象
var EventEmitter = new events.EventEmitter();
// 监听器 1
var listener1 = function listener1() {
console.log(‘监听器 listener1 执行了‘);
}
// 监听器 2
var listener2 = function listener2() {
console.log(‘监听器 listener2 执行了‘);
}
// 绑定事件 处理函数为 监听器 1
EventEmitter.addListener(‘addL‘,listener1);
// 绑定事件 处理函数 监听器 2
EventEmitter.on(‘addL‘,listener2);
var eventListeners = EventEmitter.listenerCount(‘addL‘);
console.log(eventListeners + ‘个监听器监听链接事件‘); // number
EventEmitter.emit(‘addL‘);
// 移除监听事件
EventEmitter.removeAllListener(‘addL‘,listener1);
console.log(‘listener1 被移除了‘);
// 触发链接事件
EventEmitter.emit(‘addL‘);
eventListeners = EventEmitter.listenerCount(‘addL‘);
console.log(eventListeners + ‘个监听器监听链接事件‘);
console.log(‘执行完毕‘);
以上是关于node node是什么 Buffer 模块化开发 第三方模块 事件订阅机制EventEmitter的主要内容,如果未能解决你的问题,请参考以下文章