Node.js,是一个可以让JavaScript运行在服务器端的平台,让javascript拜托了浏览器的束缚。也是为实时web应用开发而诞生的,在实时响应、超大规模数据下架构的可扩展性方面有很好的表现,采用了单线程、异步式IO、事件驱动的程序设计模型。
Node.js的javascript引擎是google chrome的V8,v8在运行之前将javascript编译成了机器码,非字节码或解释执行它,以此提升性能。
Node.js不在浏览器中运行,不存在浏览器的兼容问题。
Node.js的脚本文件的扩展名不一定是.js,如可以保存成txt形式,使用node命令(node xxx.txt)同样可以运行。使用.js当做扩展名只是一个约定,遵循了javascript脚本的命名习惯。
Node.js是为网络而诞生的平台,其架构方式为:浏览器<--->Node.。
Node.js只有在第一次引用到模块的某部分时才会去解析脚本文件,以后会直接访问内存,避免重复载入。所以在修改脚本后,都必须对Node.js重新运行后才会生效,或是使用supervisor,方便于开发调试。它会监控代码的改动,自动重启Node.js,执行脚本如 supervisor server.js。
Node.js的最大特点是使用了异步式I/O(非阻塞I/O)与事件结合的模式。为了处理异步I/O,线程必须有事件循环,不断检查有没有未处理的事件,之后予以处理。异步式I/O是通过回调函数实现的。异步式I/O是将请求发送给操作系统,然后返回并执行后面的语句,执行完成后进入事件循环监听事件。当收到I/O请求完成的事件时,事件循环会主动调用回调函数。
Node.js程序起始于事件循环,也结束于事件循环,程序入口就是事件循环的第一个事件的回调函数,事件循环对开发者不可见,由libev库实现。
Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列,事件循环检查事件队列。事件由EventEmitter对象提供。EventEmitter示例代码如下:
var EventEmiter = require('events').EventEmitter;
var event = new EventEmiter();
event.on("test",function (){
console.log('event occured');
});
setTimeout(function(){
event.emit('test');
},1000);
Node.js用require函数调用其他模块,且模块都是基于文件。