写此目的是为了记录自己看《了不起的Node.js》感觉重要的地方。
1. 事件轮询
从本质上来说,Node会先注册事件,随后不停的询问内核这些事件是否已经分发。当事件分发时,对应的回调函数就会被触发,然后继续执行下去。如果没有事件触发,则继续执行其他代码,直到有新事件时,再去执行对应的回调函数。
Node并发实现也采用了事件轮询。
2.模块系统
绝对模块:是指Node通过在其内部node_modules查找到的模块,或者Node内置的如fs这样的模块。
相对模块:将require指向一个相对工作目录中的JavaScript文件。 需要将require参上前加上 ./ 例如:require('./module_a');
3 事件
Node暴露了Event EmitterAPI,该API上定义了on,emit以及removeListener方法。它以process.EventEmitter形式暴露出来:
eventemitter/index.js
var EventEmitter = require('events').EventEmitter;
var a = new EventEmitter;
a.on('event', function(){
console.log('event called');
});
a.emit('event');
Node内部在使用,你也可以很容易的将其添加到自己的类中:
var EventEmitter = process.EventEmitter;
var MyClass = function(){};
MyClass.prototype.__proto__ = EventEmitter.prototype;
这样,所有MyClass的实例都具备了事件功能:
var a = new MyClass;
a.on('do', function() {
// do something
console.log('event called');
});
var MyClass = function(){};
MyClass.prototype.__proto__ = EventEmitter.prototype;
这样,所有MyClass的实例都具备了事件功能:
var a = new MyClass;
a.on('do', function() {
// do something
console.log('event called');
});
a.emit('do');
事件是Node非阻塞设计的重要体现。Node通常不会直接返回数据(以为这样可能会在等待某个资源的时候发生线程阻塞),而是采用分发事件来传递数据的方式。
4 buffer
buffer是一个表示固定内存分配的全局对象,它就好比是一个由八位字节元素组成的数组,可以有效的在JavaScript中表示二进制数据。
该功能一部分作用就是可以对数据进行编码转换。
5 __dirname
使用__dirname来获取执行文件时该文件在文件系统中所在的目录。