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,非原生模块的文件模块。