node入门知识、环境配置、事件、模块

一、入门知识

.

Node.js是让Javascript脱离浏览器运行在服务器的一个平台,不是语言;

Node.js采用的Javascript引擎是来自Google Chrome的V8;运行在浏览器外不用考虑头疼的Javascript兼容性问题

采用单线程、异步IO与事件驱动的设计来实现高并发(异步事件也在一定程度上增加了开发和调试的难度);

Node.js内建一个HTTP服务器,所以对于网站开发来说是一个好消息;、

二、部署sublime nodejs环境

在GitHub下载插件 https://github.com/tanepiper/SublimeText-Nodejs

修改C:\Users\sherry\AppData\Roaming\Sublime Text 3\Packages\SublimeText-Nodejs-master下两个文件

测试

Ctrl+B编译后

三、事件模块

events是node.js 最重要的模块,events模块只提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。

Node.js中大部分的模块,都继承自Event模块。

与DOM树上事件不同,不存在事件冒泡、逐层捕获等行为。

EventEmitter 支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。   

在nodejs根目录下运行

/*
    EventEmitter.emit(event, [arg1], [arg2], [...])   触发指定事件
    参数1:event  字符串,事件名
    参数2:可选参数,按顺序传入回调函数的参数
    返回值:该事件是否有监听
*/
/*
    EventEmitter.once(event, listener)  为事件注册一次性监听,触发一次后移除监听
    参数1:event  字符串,事件名
    参数2:回调函数
*/
/*
    EventEmitter.removeListener(event, listener)  移除指定事件的监听器
    注意:该监听器必须是注册过的
    PS:上一个例子之后以会失败,很大原因就是忽略了监听器,理所当然的认为传个事件名就OK了,所以就悲剧了!
*/

emitter.removeListener的第二个参数是要移除的监听,而非移除成功后的回调函数!!!!!

/*
    EventEmitter.removeAllListeners([event])   移除(批定事件)所有监听器,也可以不传参数直接执行
    参数1:可选参数,event  字符串,事件名
*/
emitter.removeAllListeners();
/*
    EventEmitter.listeners(event)   //返回指定事件的监听数组
    参数1:event  字符串,事件名    
*/

给some_events注册两个监听,调用emitter.listeners函数,传入some_events事件名,接收函数返回值;

从结果可以看出,返回值接收到some_events所有注册监听的集合!

/*
    EventEmitter.setMaxListeners (n)   给EventEmitter设置最大监听
    参数1: n 数字类型,最大监听数
    
    超过10个监听时,不设置EventEmitter的最大监听数会提示:
    (node) warning: possible EventEmitter memory leak detected. 11 listeners added.
     Use emitter.setMaxListeners() to increase limit.
    设计者认为侦听器太多,可能导致内存泄漏,所以存在这样一个警告
*/

EventEmitter.listenerCount(emitter, event)

返回指定事件的监听数

四、模块

通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取;核心模块具有最高的加载优先级(有模块与核心模块同名时会体现)

Node.js还有一类模块为文件模块,可以是JavaScript代码文件(.js作为文件后缀)、也可以是JSON格式文本文件(.json作为文件后缀)、还可以是编辑过的C/C++文件(.node作为文件后缀);

前面提到文件后缀可以省略,Nodejs尝试加载的优先级 js文件 > json文件 > node文件

var counter = require('./count.js')

console.log('第一次调用')

counter.seOutputVal(10);               //设置从10开始计数
counter.setIncrement (10);             //设置增量为10

counter.printNextCount();
counter.printNextCount();

/*
    require多次调用同一模块不会重复加载
*/
var counter = require('./count');

console.log('第二次调用模块');
counter.printNextCount();

node.js通过requirerequire多次调用同一模块不会重复加载,Node.js会根据文件名缓存所有加载过的文件模块,所以不会重新加载了

注意:通过文件名缓存是指实际文件名,并不会因为传入的路径形式不一样而认会是不同的文件

exports和module.exports 区别

exports仅仅是module.exports的一个地址引用。nodejs只会导出module.exports的指向,如果exports指向变了,那就仅仅是exports不在指向module.exports,于是不会再被导出。

module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是module.exports本身不具备任何属性和方法。
如果,module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

总结:

1.最好别分别定义module.exports和exports,尽管module.exports可以覆盖exports

2.NodeJs开发者建议导出对象用module.exports,导出多个方法和变量用exports

其他

发布了13 篇原创文章 · 获赞 1 · 访问量 5627

猜你喜欢

转载自blog.csdn.net/sinrryzhang/article/details/103262137