[Node.js] 05 - Modules and Function

一個 Node.js 文件就是一個模塊,這個文件多是JavaScript 代碼JSON 或者編譯過的C/C++ 擴展html

模塊是Node.js 應用程序的基本組成部分,文件和模塊是一一對應的。node

 

Node.js 工具模塊

在 Node.js 模塊庫中幾種經常使用模塊的使用:web

序號 模塊名 & 描述
1 OS 模塊
提供基本的系統操做函數。
2 Path 模塊
提供了處理和轉換文件路徑的工具。
3 Net 模塊
用於底層的網絡通訊。提供了服務端和客戶端的的操做。
4 DNS 模塊
用於解析域名。
5 Domain 模塊
簡化異步代碼的異常處理,能夠捕捉處理try catch沒法捕捉的。

 

建立模塊 

調用函數正則表達式

  • 形式一:

定義一個對外的world功能:定義一個對外的函數。api

// hello.js

exports.world = function() {  // world() 成爲 exports 對象的成員函數 console.log('Hello World'); }

在 main.js 中經過 require('./hello') 加載這個模塊,而後就能夠直接訪 問 hello.js 中 exports 對象的成員函數了。數組

var hello = require('./hello');  // var hello 表明了一個模塊,也就是./hello這個文件表明的東西
hello.world();
  •  形式二:【更流行】

定義一個對外的counter功能:定義一個函數,以後再使其對外瀏覽器

Use this api (counter) here.緩存

 

調用網絡

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName(
'BYVoid'); hello.sayHello();

 模塊定義方法:dom

//hello.js 
function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports
= Hello;

 

(1) 其實也是開放多個對外函數的一個tricky方法:

(2) 以上較爲麻煩。咱們用類包裹多個函數,而後再導出該類,這樣豈不是會輕便些。

 

 

模塊加載 

var http = require("http");

當文件模塊緩存中不存在

並且不是原生模塊的時候,

Node.js 會解析 require 方法傳入的參數,並從文件系統中加載實際的文件 

  • require方法接受如下幾種參數的傳遞:
1 http、fs、path等 原生模塊
2 ./mod 或 ../mod 相對路徑的文件模塊
3 /pathtomodule/mod 絕對路徑的文件模塊
4 mod 非原生模塊的文件模塊

在路徑 Y 下執行 require(X) 語句執行順序,參見連接

 

 

函數做爲參數 

兩種寫法,推薦後者。

function sayHI() { ... }

var Bye = function ([args]) { ... }

 

這麼用的意義在於什麼?

"作什麼""誰去作"分離開來,也就是將‘不變的事物’和‘可變的事物’分離開來。

好比:有這麼一個,它是功能參數的粘合劑!

function execute(someFunction, value) {
  someFunction(value);
}

function say(word) {
  console.log(word);
}
execute(say, "Hello");

或者,匿名函數方式,看起來簡潔一些。

function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

 

 

Node.js 全局對象

全局對象(Global Object),它及其全部屬性均可以在程序的任何地方訪問,即全局變量。

  1. 在瀏覽器 JavaScript 中,一般 window 是全局對象,
  2. 在 Node.js 中的全局對象是 global,全部全局變量(除了 global 自己之外)都是 global 對象的屬性。

在 Node.js 咱們能夠直接訪問到 global 的屬性,而不須要在應用中包含它。

 

  • global 的屬性

global 最根本的做用是做爲全局變量的宿主。按照 ECMAScript 的定義,知足如下條 件的變量是全局變量:

    1. 在最外層定義的變量;
    2. 全局對象的屬性;
    3. 隱式定義的變量(未定義直接賦值的變量)。

當你定義一個全局變量時,這個變量同時也會成爲全局對象的屬性,反之亦然。

須要注意的是,在 Node.js 中你不可能在最外層定義變量,由於全部用戶代碼都是屬於當前模塊的, 而模塊自己不是最外層上下文。

 

  • 若干經常使用屬性
// 輸出全局變量 __filename 的值
console.log( __filename );
--------------------------------------
// 輸出全局變量 __dirname 的值
console.log( __dirname );
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 兩秒後執行以上函數 setTimeout(printHello, 2000);
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 兩秒後執行以上函數 var t = setTimeout(printHello, 2000); // 清除定時器 clearTimeout(t);
--------------------------------------
function printHello(){ console.log( "Hello, World!"); } // 兩秒後執行以上函數 setInterval(printHello, 2000); 

 

  • console 方法

console 用於提供控制檯標準輸出,它是由 Internet Explorer 的 JScript 引擎提供的調試工具,後來逐漸成爲瀏覽器的實施標準。

Node.js 沿用了這個標準,提供與習慣行爲一致的 console 對象,用於向標準輸出流(stdout)或 標準錯誤流(stderr)輸出字符。

console.log('byvoid%diovyb'); 
console.log('byvoid%diovyb', 1991);   // 有%d就看有沒有匹配的變量,有則「替換」,無則「失效」

console.error():與console.log() 用法相同,只是向標準錯誤流輸出。

console.exception() 是 console.error() 的別名;它們功能相同。

console.trace();

Trace: 
at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40)
console.info("程序開始執行:"); console.time("獲取數據");    // 表示計時開始

console.timeEnd('獲取數據');  // 表示計時結束

console.info("程序執行完畢。")

 

  • process方法

參見:[Node.js] 06 - Multi-thread and process module

 

 

Node.js 經常使用工具

util 是一個Node.js 核心模塊,提供經常使用函數的集合,用於彌補核心JavaScript 的功能 過於精簡的不足。

 

  • util.inherits

util.inherits(constructor, superConstructor)是一個實現 對象間原型繼承 的函數。

JavaScript 的面向對象特性是基於原型的,與常見的基於類的不一樣。JavaScript 沒有 提供對象繼承的語言級別特性,而是經過原型複製來實現的。

在這裏咱們只介紹util.inherits 的用法,示例以下:

var util = require('util'); 
function Base() { this.name = 'base'; this.base = 1991; this.sayHello = function() { console.log('Hello ' + this.name); }; }
Base.prototype.showName
= function() { console.log(this.name); };
function Sub() { this.name = 'sub'; }
util.inherits(Sub, Base);   // 繼承的實現:繼承自Base的Sub
var objBase = new Base(); objBase.showName(); objBase.sayHello(); console.log(objBase);
var objSub = new Sub(); objSub.showName(); //objSub.sayHello(); console.log(objSub);

Jeff: 關於js的類的設計問題,須要專題講解。

 

  • util.inspect

將任意對象轉換 爲字符串的方法,一般用於調試和錯誤輸出。

var util = require('util'); 
function Person() { this.name = 'byvoid'; this.toString = function() { return this.name; }; } var obj = new Person();
console.log(util.inspect(obj)); console.log(util.inspect(obj,
true));

Result: 

Person { name: 'byvoid', toString: [Function] }
Person {
  name: 'byvoid',
  toString: 
   { [Function]
     [length]: 0,
     [name]: '',
     [arguments]: null,
     [caller]: null,
     [prototype]: { [constructor]: [Circular] } } }

 

  • util.isArray(object)

若是給定的參數 "object" 是一個數組返回true,不然返回false。

var util = require('util');

util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

 

  • util.isRegExp(object)

若是給定的參數 "object" 是一個正則表達式返回true,不然返回false。

var util = require('util');

util.isRegExp(/some regexp/)
  // true
util.isRegExp(new RegExp('another regexp'))
  // true
util.isRegExp({})
  // false

 

  • util.isDate(object)

若是給定的參數 "object" 是一個日期返回true,不然返回false。

var util = require('util');

util.isDate(new Date())
  // true
util.isDate(Date())
  // false (without 'new' returns a String)
util.isDate({})
  // false

  

  • util.isError(object)

若是給定的參數 "object" 是一個錯誤對象返回true,不然返回false。

var util = require('util');

util.isError(new Error())
  // true
util.isError(new TypeError())
  // true
util.isError({ name: 'Error', message: 'an error occurred' })
  // false
相關文章
相關標籤/搜索