node node是什么 Buffer 模块化开发 第三方模块 事件订阅机制EventEmitter

Posted bnzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node node是什么 Buffer 模块化开发 第三方模块 事件订阅机制EventEmitter相关的知识,希望对你有一定的参考价值。

一, 为什么学习node

https://nodejs.org/en/下载官网

  • 能够了解后台,可以和后端的程序员更加紧密的配合
  • 前段人员至少需要一门后端技术的掌握(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的主要内容,如果未能解决你的问题,请参考以下文章

Node.js(十四)——Net模块之Buffer

《超实用的Node.js代码段》连载二:正确拼接Buffer

Node.js Buffer解读

node 中间层怎样做的请求合并转发

Node.js缓冲模块Buffer

Node.js处理I/O数据之Buffer模块缓冲数据