一個 Node.js 文件就是一個模塊,這個文件多是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展。html
模塊是Node.js 應用程序的基本組成部分,文件和模塊是一一對應的。node
在 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 方法傳入的參數,並從文件系統中加載實際的文件
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");
全局對象(Global Object),它及其全部屬性均可以在程序的任何地方訪問,即全局變量。
在 Node.js 咱們能夠直接訪問到 global 的屬性,而不須要在應用中包含它。
global 最根本的做用是做爲全局變量的宿主。按照 ECMAScript 的定義,知足如下條 件的變量是全局變量:
當你定義一個全局變量時,這個變量同時也會成爲全局對象的屬性,反之亦然。
須要注意的是,在 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("程序執行完畢。")
參見:[Node.js] 06 - Multi-thread and process module
util 是一個Node.js 核心模塊,提供經常使用函數的集合,用於彌補核心JavaScript 的功能 過於精簡的不足。
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的類的設計問題,須要專題講解。
將任意對象轉換 爲字符串的方法,一般用於調試和錯誤輸出。
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] } } }
若是給定的參數 "object" 是一個數組返回true,不然返回false。
var util = require('util'); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // false
若是給定的參數 "object" 是一個正則表達式返回true,不然返回false。
var util = require('util'); util.isRegExp(/some regexp/) // true util.isRegExp(new RegExp('another regexp')) // true util.isRegExp({}) // false
若是給定的參數 "object" 是一個日期返回true,不然返回false。
var util = require('util'); util.isDate(new Date()) // true util.isDate(Date()) // false (without 'new' returns a String) util.isDate({}) // false
若是給定的參數 "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