NodeJs基础(一)

一、什么是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);
})
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sophie_U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值