最近開始瞭解node.js,在這裏把最近了解的大概串一下,加深一下理解。javascript
1 先來個實際點的小例子,感覺一下nodejsjava
var http = require('http'); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8888); console.log('Server running at http://127.0.0.1:8888/');
這樣就建立了一個http服務器了。在http://127.0.0.1:8888上用瀏覽器訪問,就能夠看到輸出的Hello World了。node
2 模塊npm
require //引用模塊 json
main.js中引用其它模塊數組
var hello=require('./hello.js');
exports //導出對象給require改模塊的模塊使用瀏覽器
exports.hello=function(){console.log('hello world');} 緩存
function hello(){ console.log('hello world'); } exports.hello=hello; 服務器
module //可訪問當前模塊的信息,主要用於替換模塊的默認導出對象異步
注意:模塊中的代碼僅在初始化時執行一次,再次利用時調用緩存重複利用
當一個包中有多個模塊,可將主模塊名爲index.js,或者package.json,經過目錄做爲訪問包的入口(而不是文件路徑);
package.json { "name":"package" //模塊的當前文件夾所在的文件夾 「main」:"./lib/main.js" // / home /node/package/lib/xx.js } //訪問模塊 require('/home/node/package') 哈,一看就是訪問包的感受
4 npm
獲取第三方包
下載第三方包 npm install agrv;
或者在package.json 裏配置
{ "name": "node-echo", "main": "./lib/echo.js", "dependencies": { "argv": "0.0.2" } }
5 文件處理,文件處理通常存在兩個版本:同步,異步。
//文件的讀取
fs.readFile(filename,[encoding],[callback(err,data)])
fs.readFileSync(filename,[encoding],[callback(err,data)]) //同步
如 果不指 定 encoding,則 callback 就是第二個參數。回調函數提供兩個參數 err 和 data,err 表 示有沒有錯誤發生,data 是文件內容。若是指定了 encoding,data 是一個解析後的字符 串,不然 data 將會是以 Buffer 形式表示的二進制數據。
小文件的copy
var fs=require('fs') //內置文件模板 function copy(src,dst){ fs.writeFileSync(dst,readFileSync(src)) } function main(argv){ copy(argv[0],argv[1]); } main(process.argv.slice[2]);//argv[0],argv[2]分別儲存的執行程序和主模塊的絕對路徑
上述小文件屬於一次性寫入內存,一次性讀出,會引發內存爆倉
大文件的寫入(流水式)
var fs = require('fs'); function copy(src, dst) { fs.createReadStream(src).pipe(fs.createWriteStream(dst)); //(邊讀邊寫) } function main(argv) { copy(argv[0], argv[1]); } main(process.argv.slice(2));
6 event的對象,eventemitter 事件發射和事件監聽功能的封裝
每一個事件有一個事件名(字符串)和若干參數組成,一個事件能夠有多個事件監器
var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { //註冊事件監聽器 console.log('第一個事件', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('第二個事件', arg1, arg2); }); emitter.emit('someEvent', 'byvoid', 1991); //發射事件,依次調用事件監聽
eventemitter API:
eventemitter.on(event,listener);
eventemitter.once(event,listener);事件只用一次解除
eventemitter.removeListener(event,listener);移除事件
error是eventemitter的特殊事件
遇到異常是發射error事件,調用監聽函數,避免程序崩潰
var events = require('events'); var emitter = newevents.EventEmitter(); emitter.on('error',function(){ console.log('error') }) emitter.emit('error');
關於繼承:大多數時候咱們不會直接使用 EventEmitter,而是在對象中繼承它。包括 fs、net、 http 在內的,只要是支持事件響應的核心模塊都是 EventEmitter 的子類。
7 全局變量
process:
process.argv 命令行參數數組
process.stdout/process.stdin
process.stdin.resume(); process.stdin.on('data', function(data) { process.stdout.write('read from console: ' + data.toString()); });
process.nextTick(callback),爲時間循環設置任務,下次循環響應事調用callback,把複雜的工做拆分紅小時間,提升響應速度,節省響應時間(本人此處理解不太透)