Node.js,不是一种语言,而是一种解析Javascript的运行环境,只是运行在服务端。Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。相比之下,Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。
API文档地址: http://www.jq-school.com/api/nodejs/api.html
下面是几个特性:
1.事件驱动,简单的说就是先注册N个回调函数,待发生事件时调用。
2.单线程
没用过这个,最近工作需要,强学。
安装完开发环境后,先按照例子尝试了一个helloword。
var http = require('http');
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
对于我这种十年前用过js的准文盲,先温习下大概的js语法。
1.都用var来定
function foo() {}
var a = 0;
var b = 'a';
var c = 1.0;
var d = foo;
2.基本数据
var int1 = 123;
var string1 = "3";
var bool1 = false;
var list1 = ["1", "2", "3"];
var map1 = {
"key1":"value1",
"key2":"value2",
"key3":"value3"
};son子串
3.json
var dog = {
"pre" : "嘘~",
"sub" : {
"name" : "蛋花汤",
"act" : "在睡觉",
"time" : 12
},
"suf" : [ "我说了", "它在睡觉", "就是在睡觉" ]
};
console.log(dog.pre);
4.类
js中的类,严格说就是个函数体,里面的this.不能忽略,忽略了就不算他的成员属性了。要用的时候直接new Object。
function parentFunc ()
{
this.id = 1;
this.childfunc = function childFunc()
{
return this.id+1;
}
}
var parentFuncObj = new parentFunc();
console.log(parentFuncObj.id);
console.log(parentFuncObj.childfunc());
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
异步回调用法:
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
readFile是异步读取文件的api。
EventEmitter 类:
这个类有点类似于安卓里的addListener后事件触发时激发对应listener的逻辑。
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter(); //获取一个对象
event.on('some_event', function() {
console.log('some_event 事件触发');
});
setTimeout(function() {
event.emit('some_event');
}, 1000); //过1秒钟触发some_event
下面这个就相当于注册了多个listener
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
还有removeListener等函数:
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
var callback = function(arg1, arg2) {
console.log('listener2', arg1, arg2);
};
emitter.on('someEvent', callback);
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
emitter.removeListener("someEvent", callback);
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
输出:
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
listener1 arg1 参数 arg2 参数
当然还有 removeAllListeners、once等不同用途的方法。
Node.js Buffer(缓冲区)
js在处理二进制信息时,需要用到Buffer这个类。该类用来创建一个专门存放二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
var buf = new Buffer(10);
var length = buf.write("asdfasdfazsdfasdf");
console.log("length"+length);
console.log( buf.toString('ascii'));
buffer能自定义初始长度,如果超过了,则只能写初始长度。
具体的其他方法可见api
模块系统:
那么不同js文件之间,怎么互相调用呢?比如我们写c程序,有export等标识符。这个也有。
比如,我们先写个hello.js
var text = "hello";
exports.printit = function()
{
console.log(text);
}
这里的exports代表这个类中的这个函数可以让另外一个模块调用。
然后写个print.js:
var module = require("./hello");
module.printit();
这样就行了。
当然也可以定义成类的模式,一次暴露出多个公共方法:
function printclass()
{
var text = "hello";
this.printit = function()
{
console.log(text);
}
this.printit2 = function()
{
console.log(text);
}
}
module.exports = printclass;
var module = require("./hello");
newObj = new module()
newObj.printit();
newObj.printit2();
require方法接受以下几种参数的传递:
http、fs、path等,原生模块。
./mod或../mod,相对路径的文件模块。
/pathtomodule/mod,绝对路径的文件模块。
mod,非原生模块的文件模块。