node中的JavaScript
- 在nodejs中寫(xiě)js和在瀏覽器中不同,node除了提供和瀏覽器一樣的基本語(yǔ)言外,還在語(yǔ)言基礎(chǔ)上提供了構(gòu)建強(qiáng)大網(wǎng)絡(luò)應(yīng)用所需的API
global對(duì)象
- 在瀏覽器中,全局對(duì)象指的就是window對(duì)象,在window對(duì)象上定義的任何內(nèi)容都可以被全局訪問(wèn)到,比如,setTimeout其實(shí)就是window.setTimeout,document其實(shí)就是window.document
- 在node中有兩個(gè)類似但是給子代表著和不同含義的對(duì)象,
global: 和window一樣,任何global對(duì)象上的屬性都可以被全局訪問(wèn)到
process:所有全局執(zhí)行上下穩(wěn)重的內(nèi)容都在process對(duì)象中,在瀏覽器中,只有一個(gè)window對(duì)象,在node中,也只有一個(gè)process對(duì)象,舉例來(lái)說(shuō),在瀏覽器中窗口的名字是 window.name ,類似的 在node 中 進(jìn)程的名字是 process.title
實(shí)用的全局對(duì)象
- 瀏覽器中有一些函數(shù)和工具并非是語(yǔ)言標(biāo)準(zhǔn)被的一部分,但瀏覽器卻仍將其視作重要的特性來(lái)實(shí)現(xiàn),例如setTimeout,事實(shí)上該函數(shù)是無(wú)法通過(guò)純js重寫(xiě)
- 在node中為了提高小路就加進(jìn)來(lái)了,setImmediate API就是一個(gè)例子,在node中它的作用和process.nextTick相當(dāng)
console.log(1);
process.nextTick(function () {
console.log(3);
});
console.log(2);
setTimeout(function () {
console.log(4);
}, 1000);
- 把它想象成setTimeout(fn,1) 或者"通過(guò)異步的方式在最近的將來(lái)調(diào)用函數(shù)",
- 還有一個(gè)例子是console,console 最早由firefox中輔助開(kāi)發(fā)的插件 firebug實(shí)現(xiàn),現(xiàn)在node也引入了一個(gè)console對(duì)象,該對(duì)象用來(lái)輸出打印
- console.log和 console.errot
模塊系統(tǒng)
- node內(nèi)置了很多模塊 例如 http ,net,fs
- 引入了一些核心模塊 require module exports
絕對(duì)和相對(duì)模塊
- 這里絕對(duì)模塊指的是node通過(guò)其內(nèi)部的 node_modules 或者node內(nèi)置的如fs
- 相對(duì)模塊指的是require調(diào)用的指向相對(duì)工作目錄中得 JavaScript文件
暴露API
- 相對(duì)模塊得通過(guò)modules exprots導(dǎo)出文件接口 主文件那邊用require來(lái)調(diào)用
事件
- nodejs的基礎(chǔ)api之一就是
EventEmitter
無(wú)論在node還是瀏覽器中,大量代碼都依賴于所監(jiān)聽(tīng)或者分發(fā)的事件 window.addEventListerner('load',function () { alert('試試');};
- 瀏覽器中負(fù)責(zé)處理事件相關(guān)的DOM API主要包括addeventlistener,removeeventlistener以及dispatchevent
- 下面發(fā)起一個(gè)ajax 瀏覽器中
var ajax = new XMLHttpRequest;
ajax.addEventListener('stateChange', function () {
if (ajax.readyState == 4 && ajax.responseText) {
alert('獲取一些數(shù)據(jù)' + ajax.responseText);
}
});
ajax.open('GET', '/my-page');
ajax.send(null);
- 用node發(fā)起一個(gè)異步請(qǐng)求,一個(gè)回調(diào)函數(shù)
let http = require('http');
http.Server(function (req, res) {
let buf = "";
req.on('data', function (data) {
buf += data;
});
req.on('end', function () {
console.log("數(shù)據(jù)接收完畢");
});
}).listen(3000);
- 這是node中常見(jiàn)的例子: 將請(qǐng)求數(shù)據(jù)內(nèi)容進(jìn)行緩沖(data事件),等到所有的數(shù)據(jù)都接收完畢(end事件)再對(duì)事件進(jìn)行處理
- 不論某個(gè)事件在將來(lái)被觸發(fā)了多少次,我都希望只調(diào)用一次回調(diào)函數(shù),這類需求提供了一個(gè)名字簡(jiǎn)潔的方式
a.once('某個(gè)事件',function(){
//無(wú)論觸發(fā)多少次 該方法只執(zhí)行一次
})
- API手冊(cè)很重要 學(xué)的時(shí)候記得多看
buffer
- 除了模塊以外 node還彌補(bǔ)了語(yǔ)言另外一個(gè)不足之處,對(duì)于二進(jìn)制數(shù)據(jù)的處理
- buffer是一個(gè)表示固定內(nèi)存分配的全局對(duì)象(也就是說(shuō),要放到緩沖區(qū)中得字節(jié)數(shù)需要提前定下),他就好比一個(gè)由八位字節(jié)元素組成的數(shù)組,可以有效的在JavaScript中表示二進(jìn)制數(shù)據(jù)
- 該功能可以對(duì)數(shù)據(jù)進(jìn)行編碼轉(zhuǎn)換,例如可以創(chuàng)建一副用base64表示的圖片,然后將其作為二進(jìn)制png形式寫(xiě)入文件
let mybuffer = new Buffer('==ii1j2i3h1i23h','base64');
console.log(mybuffer);
require('fs').writeFile('log.opng',mybuffer)