node.js(一)包管理、缓冲区、事件驱动、定时器

来源:互联网 发布:ubuntu安装mysql5.7 编辑:程序博客网 时间:2024/05/16 13:44

1.      NPM包管理

(1)      本地模式:如果想在安装包时,不会对那些已经在本地安装的应用程序造成影响,那么本地模式十分适合。(尽量使用本地模式,除非模块作者要求某个模块需要以全局模式来安装。)

(2)      全局模式:适合安装那些全局可用的包,比如提供命令行工具的包,或者不被应用程序直接调用的包。

安装指令CMD下:npm install –g (包名)   本地模式去掉-g

卸载指令CMD下:npm uninstall –g (包名)

更新包指令:     npm update –g (包名)

安装固定版本号:npm install (包名)@版本号  npm install sax@0.2.5

(3)      本地模式安装时,cd到你要安装的目录。

(4)      应用包时通过  var sax = require(‘sax’);  来加载。  Sax是包名。

 

2.      事件驱动编程(异步编程):是指程序执行流程取决于事件的编程风格。事件由事件处理程序或者事件回调函数进行处理。  当感兴趣的事件发生时,由系统调用函数来取代应用返回值的的编程风格就叫事件驱动编程。

 

3.      Node每个模块都拥有一个上下文,将该模块和其他模块隔离开来,这意味着模块不会污染全局作用域,并且不会对其他模块造成干扰。(将代码拆分成一系列定义良好的模块,可以有效的控制代码。)

(1)      导出模块(本地模块)

function printA(){    console.log('A');}module.exports.printA = printA;

通过module.exports表示模块向需要它的脚本所导出的对象,它可以是任意对象。例如像上面那样导出一个函数。在test2.js使用这个模块时可以:

var mymodule2 = require('./test.js');mymodule2.printA();         //A

(2)      加载核心模块

一些以二进制形式发布的模块被称为核心模块。核心模块只能通过模块名引用,而不能通过文件路径引用。

Eg:  var http = require('http');

(3)      加载文件模块

可以使用绝对路径,也可以使用相对路径。

(4)      加载文件夹模块

如此之后,Node就会在指定的文件夹下查找模块。Node会假定该文件夹是一个包,并试图查找包定义。包定义包含在名为package.json的文件中。如果文件夹中不存在包定义文件package.json ,就会假定为默认index.js

如果有package.json 就会在该文件中查找main属性

Eg:  {

    "name":"myModule",

   "main":"./lib/myModule.js"

}

(5)      从node_modules文件夹加载

如果一个模块名既不是相对路径也不是核心模块,那么node就会尝试在当前目录下的node_modules文件夹中查找该模块。

(6)      模块的初始化过程只执行一次。

 

说明:Node取消了Javascript默认的全局名称空间,而是用CommonJS模块系统取而代之。

4.      缓冲区

为了方便处理二进制数据,引入缓冲区。

var buf =new Buffer("abcdef");  //可以加第二个可选参数  指定编码格式  默认是utf-8var buf2= new Buffer(1024);       //创建长度为1024的缓冲区console.log(buf[1]);     //获取缓冲区内容使用[]  可为其赋值console.log(buf2.length);  //求其长度var smallerBuffer = buf.slice(2,4);  //切分缓冲区buf2.copy(buf,0,2,4);  //将buf第2到4的数据复制给buf2 从0开始的位置

说明:切分的缓冲区还是使用父缓冲区域内的内容。这些内容不会被垃圾机制回收。

 

5.      事件发射器模式。

(1)Node中很多对象都可以发射事件。(这些对象被称为事件发射器。可以将回调函数绑定到这些事件上,每当事件发射器发射事件时,对应的回调函数就会被调用。)

(2)可以通过伪类EventEmitter创建自定义的事件发射器。

说明:如果事件反复发生多次,那么这个时候使用回调模式就不行了。应该使用事件发射器模式。

      一般而言,当需要再请求的操作完成后重新获取控制权时就使用CPS模式,如果事件可能发生多次就使用事件发射器模式。

(3)事件发射器模式会涉及两个或更多对象,这些对象包括事件发射器以及一个或多个事件监听器。(事件监听器则是绑定到事件发射器上的代码。)

(4) 发射的事件具有类型,类型用一个字符串表示。一旦相关事件发生,事件发射器就会调用相应的事件监听器,并将相关数据作为参数传递给事件监听器。

              一般而言,应该总是监听错误事件,并对其进行恰当的处理。

(5)      创建事件发射器

var util= require('util');var EventEmitter = require('events').EventEmitter; var myClass = function(){};util.inherits(myClass,EventEmitter);  //建立一条原型链,使myClass类实例能够使用EventEmitter类的原型方法myClass.prototype.someMethod= function(){    this.emit("custom","argument1", "argument2");};
<span style="font-family: Arial, Helvetica, sans-serif;">//当someMethod方法被调用时,就会发射一个名为custom的事件。该事件还可以发射若干数据例如argument1  它们将会作为</span>

// 参数传递给事件监听器//myClass类实例的客户端可以监听custom事件var myInstance =new myClass();myInstance.on('custom',function(str1, str2){    console.log('got a custom with the str1 %sand str2 %s!', str1, str2);});


Eg2:

var util= require('util');var EventEmitter = require('events').EventEmitter;var Ticker = function(){    var self = this;    setInterval(function(){        self.emit('tick');    },1000);}; util.inherits(Ticker,EventEmitter);var ticker = new Ticker();ticker.on("tick",function(){    console.log("ticker");});


说明:.on 为指定类型的事件添加事件监听器。除此之外还有.once  

.removeEventListent .remveAllEventListen

 

6.      使用定时器。

var time= 1000;

vartimeout = setTimeout(function(){

    console.log("hello");

},time);

clearTimeout(timeout);

说明:clearTimeout()可以取消函数的执行。对应setInterval()的取消是clearInrerval()

(1)      使用process.nexTick(callback),回调函数会在事件队列内的所有事件处理完毕后立刻执行。

(2)      Node和javascript运行时采用的是单线程事件循环。

0 0
原创粉丝点击