NodeJs基础(一)

来源:互联网 发布:淘宝收入排行榜2015 编辑:程序博客网 时间:2024/06/06 00:48

一、什么是NodeJs?

NodeJs是基于Chrome V8引擎的JavaScript运行环境, 它对JS进行了增强,使JavaScript具有服务器语言开发能力(如:操作文件,读取系统信息,网络数据等);

1、node js与javascript有什么区别与联系呢?

首先,javascript(简称js)是一门编程语言,只要有js引擎就能运行js,在各大浏览器中都有自己的js引擎用于解析执行js代码,浏览器对js加入了浏览器和文件操作的接口(方法),所以我们可以通过js来操作浏览器中的对象(节点等);
node js是一个javascript运行环境,它是基于谷歌V8引擎开发的js运行环境,也可以用来执行js代码, nodejs与浏览器的js引擎的不同在于,node属于服务端的js,在浏览器端js主要操作DOM、BOM;而node js具有服务端语言的处理能力,可以处理网络请求,保存数据到数据库中等;

二、Node JS的模块

NodeJS采用模块方式管理和组织代码,在node中所有的功能都存在于每个模块中;其模块主要分为三种:1、核心模块(node自带的模块,如:fs文件模块,http网络模块等);2、自定义模块:由用户自己编写而成的模块;3、第三方模块:通过NPM官网下载的包模块;

2.1 模块的一些规范
目前有三种比较流行的模块规范:AMD,CMD,CommonJS

1、AMD

AMD:Asynchronous Module Definition :异步加载模块,适用于客户端浏览器环境,Require js应用了这一规范;在AMD中,模块的声明用define(id,dependecies,facotry);注意依赖模块dependecies会以形参的方式传入到函数factory中,所以函数中的形参个数要与之对应。

2、CMD

CMD:Common Module definition,规范类似于AMD规范,它们都是用在客户端浏览器环境中的,Seajs就应用了这一规范,它也是用全局函数define()来声明模块,它也是异步加载模块。
3、Common js
与AMD,CMD不同在于,common js采用了同步加载文件方式,因而适用于服务器,node js就是这一规范的生产化。

2.2 node中的自定义模块

在node中一个文件就是一个独立的模块,每个模块都有独立的作用域,若在一个模块中依赖了另一模块,那需要用require()方法来引用该模块。
在node中模块的导出用exports.name=name; exports是module.exports的简写,用于导出模块供其他模块使用。

三、Node js的控制台语句

1、console.log(); ——这是我们最常用的一个方法,用于向控制台输入语句;2、console.error();——向控制台输出错误信息3、console.assert();——类似于断点调试的语句输出4、console.time('t1');     console.timeEnd('t1');——用于输出time到timeEnd之间代码的执行时间,注意t1保持一致

四、NodeJS的作用域

Nodejs的作用域也分为两类:全局作用域(对应global),局部作用域(对应函数作用域);
在node中尽量少用全局变量,因为该变量挂在全局作用域上,其他模块都能访问到,很容易引起全局污染。而模块化编程的目的就是为了私有化变量,减少全局污染,所以全局变量要少用。

五 、Node中的事件模块

事件模块(events)是nodejs的核心模块之一,它提供了事件编程的api,具体用法如下:

var events=require('events');    //引入事件模块   var EventEmitter=events.EventEmitter;  //EventEmitter事件对象,类似于js中的event对象,            var event= new EventEmitter;  event.on('myevent',function(){       //自定义事件:myevent    console.log('被触发的事件');  });event.emit('myevent');    //自定义事件需要手动触发

1、添加事件的方法
addListener(eventname,Listener); //添加事件监听,与on等效
on(eventName,Listener);
once(eventName,Listener) //添加单次事件监听,即事件只会监听一次
2、移动事件监听
removeListener(eventName,Listener) ; //移除某事件的某一监听,注意Listener要相同
removeAllListeners(event); //移除某事件的所有监听
3、设置最大监听数
setMaxListeners(n); //设置最大的监听数,在node中默认为10
Listeners(event); //返回某事件的所有监听器集合,为一个数组;
emit(event,[arg1],[arg2]…..) //触发事件,arg为传入Listener的参数,可选。
## 六、同步与异步
####6.1 同步:
在应用程序中,一个任务会等待上一个任务执行完成后再开始执行,即代码的执行是有序的,串联执行的,它们的执行顺序与它们的程序中的排列顺序一致。
例:

console.log('start');   //首先输出console.time(t1);for(var i=0;i<100000;i++){};console.timeEnd(t1);   //其次输出console.log('end');      //最后输出

同步的一个问题在于,当前面的任务执行时间过长时,后面的代码就会阻塞;

6.2 异步

与同步相反,异步的程序执行顺序与它们的排列顺序不一致,当一个任务有一个或多个callback时,其后面的任务会在它执行callback时已经开始执行了。

1、在node中异步编程的实现

主要有三种方式来实现异步: 回调,事件(基于回调),Promise
1)、回调

console.log('start') ;console.time('t1')setTimeout(function(){    console.log('回调执行');},2000)console.timeEnd('t1');console.log('end');

以下代码的执行结果为:start——1ms——end——回调执行
在setTimeout里的回调函数设置了在2000ms后执行,这并不影响后面的代码执行,异步是肯定有回调函数的。
2)、事件(基于回调)

var fs=require('fs');console.log(1);fs.readFile('./test/01',function(err,data){    console.log(data);    //在2打印后,才会输出data});console.log(2);

如上,采用异步方式读取文件,并输出读取的数据,然而上面的代码输出顺序为:1——2——data;由此可见,异步中回调函数的执行是在同步之后的。

3)、Promise

Promise是在ES 6才被规范出来的一个对象,也是一个构造函数,它可以接受一个函数作为参数,此函数有有两个参数:resolve:用于事件完成的回调,reject:用于事件失败的回调。Promise主要用来解决回调函数的嵌套问题,我们都知道当回调函数多了时,一层层的嵌套会使代码的可读性很差,因为使用Promise的then方法可以解决这一问题。

Promise共有三种状态:Pending:进行中、Resolved:已完成、Rejected:已失败;只有异步操作的结果能够决定当前是哪一种状态;而Promise的状态只有两种可能:Pending到Resolved,或者Pending到Rejected;一旦状态改变就不会再变。具体用法如下:

var fs=require('fs');   //引用文件模块function fn1(){    var p=new Promise(function(resolve,reject){   //Promise内函数的两个参数:resolve,reject        fs.readFile('./data/01','utf-8',function(err,data1){  //异步读取文件            resolve(data1);        });    })    return p;   //注意要返回P对象};function fn2(){    var p=new Promise(function(resolve,reject){        fs.readFile('./data/02','utf-8',function(err,data2){            resolve(data2);        });    })    return p;};fn1().then(function(data1){    console.log(data1);    return fn2();   //为了进行链式操作而返回fn2();注意有()代表调用函数}).then(function(data2){    console.log(data2);})
0 0
原创粉丝点击