淺理解node.js

最近開始瞭解node.js,在這裏把最近了解的大概串一下,加深一下理解。javascript

 node.js是一個解析器——一種運行環境,容許JS使用運行環境提供的內置對象和方法作一些事情。例如fs/http內置對象。
           ——運行在服務端的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)]) //同步

 

  • filename(必選),表示要讀取的文件名。
  • encoding(可選),表示文件的字符編碼。
  • callback 是回調函數,用於接收文件的內容。

如 果不指 定 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,把複雜的工做拆分紅小時間,提升響應速度,節省響應時間(本人此處理解不太透)

相關文章
相關標籤/搜索