1. 程式人生 > >Node.js筆記

Node.js筆記

簡介

nodejs是一個js解析器,類似Python,可以直接執行js檔案或者在互動命令中執行js程式碼,安裝好了nodejs之後只要執行node.exe就能進入互動式環境

模組

require,require類似Python裡面的import,用於將一個模組匯入到當前模組,但是require的使用形式類似函式,使用如下:

main.js

//這一行程式碼引入相同路徑下的tt.js作為一個模組,賦值給變數a
var a=required('./tt');
a.helllo();//輸出hello
console.log(a==a.ex);//輸出true

tt.js

//exports物件是一個模組的匯出物件,上面main.js裡面的
exports.hello=function(){ console.log('hello'); } exports.ex=function(){ return exports; }

module,module物件可以在本模組內部訪問到,裡面包含模組的一些資訊,可以通過設定module模組來設定這些資訊,例如替換模組的exports:

module物件例項

Module {
  id: 'D:\\workspace\\softwares\\node\\hello.js',
  exports: { hello: [Function], md: [Circular] }
, parent: Module { id: '<repl>', exports: {}, parent: undefined, filename: null, loaded: false, children: [ [Circular] ], paths: [ 'D:\\workspace\\softwares\\node\\repl\\node_modules', 'D:\\workspace\\softwares\\node\\node_modules', 'D:\\
workspace\\softwares\\node_modules', 'D:\\workspace\\node_modules', 'D:\\node_modules', 'C:\\Users\\Administrator\\.node_modules', 'C:\\Users\\Administrator\\.node_libraries', 'D:\\workspace\\softwares\\lib\\node' ] }, filename: 'D:\\workspace\\softwares\\node\\hello.js', loaded: true, children: [], paths: [ 'D:\\workspace\\softwares\\node\\node_modules', 'D:\\workspace\\softwares\\node_modules', 'D:\\workspace\\node_modules', 'D:\\node_modules' ] }

NODE_PATH環境變數,可以通過指定NODE_PATH環境編輯指定包載入的路徑,類似CLASSPATH環境變數。

包和入口模組,通常會將一個資料夾稱為一個包,並且使用包來管理模組,為每一個包設定一個入口模組,在入口模組裡面返回包裡的所有模組:

模組1

exports.create=function(){
    return exports;
}

模組2

exports.create=function(){
    return exports;
}

入口模組

var m1=require('./m1');
var m2=require('./m2');
var name='module name';
exports.create=function(){
    return{
        name:name,
        m1:m1.create(),
        m2:m2.create()
    }
}
需要使用的時候只用使用main模組的create方法獲取所有模組的引用就可以了

index.js ,當檔名為index.js的時候require不用寫模組名,下面兩條語句等價

var c= require('/home/user/lib/cat');
var c= require('/home/user/lib/cat/index');

package.json,package.json是定義當前路徑的模組路徑的配置檔案,假如在/path/package.json 裡面寫了這樣的程式碼:

package.json

{
    "name":"path",
    "main":"./lib/main.js"
}

那麼`require(‘path’)就會匯入path/lib/main.js這個檔案,package.json欄位全解

node.js可以使用read/writeFileSync(path)讀取檔案或寫檔案,這樣會將整個檔案都放到記憶體中間去,node.js使用createRead/WriteStream(path)建立檔案的讀寫流。

讀取的內容可以使用toString()方法轉換成字串。

node.js和java一樣,使用引用控制例項,兩個引用指向同一個例項的時候修改會同時應用到兩個例項。

事件回撥機制

nodejs使用events模組實現事件回撥,即為某一個事件繫結一個handler函式,手動觸發事件呼叫事件處理函式。實現的功能很像c#裡面的時間委託。

//匯入模組
var events=require("events");
//建立時間發射器
var eventEmitter=new events.EventEmitter();
//宣告事件處理函式
var eventHandler=function(){
    console.log("test");
}
//繫結處理函式
eventEmitter.on('test',eventHandler);
//可以繫結多個處理函式
eventEmitter.on('test',function(){
    console.log('tet');
});
//觸發事件
eventEmitter.emit('test');

利用events實現任務定時排程

//匯入模組
var events=require("events");
//建立時間發射器
var eventEmitter=new events.EventEmitter();
//宣告事件處理函式
var eventHandler=function(){
    console.log("test");
}
//繫結處理函式
eventEmitter.on('test',eventHandler);
//可以繫結多個處理函式
eventEmitter.on('test',function(){
    console.log('tet');
});
//1000秒觸發事件
function run(){
    setTimeout(function(){
        eventEmitter.emit('test');
        run();
    },1000);
}
run();

路徑解析

nodejs的路徑解析模式不是總是在當前目錄搜尋,當前目錄搜尋不到的話會一直向上搜尋,如在/dir1/dir2/test.js裡面使用如下程式碼require('module'),則搜尋路徑依次是:

/dir1/dir2/node_modules/module
/dir1/node_modules/module
/node_modules/module

也就是隻要上層目錄裡面有node_modules目錄裡面有這個模組就行