node.js學習-1

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章