鍍金池/ 教程/ HTML/ 模塊
文本編碼
小結(jié)
API 走馬觀花
API 走馬觀花
迭代
小結(jié)
運(yùn)行
回調(diào)
需求
代碼設(shè)計(jì)模式
進(jìn)程介紹
模塊
工程目錄
小結(jié)
小結(jié)
遍歷目錄
小結(jié)
小結(jié)
API 走馬觀花
用途
NPM
小結(jié)
安裝
網(wǎng)絡(luò)操作介紹
二進(jìn)制模塊
什么是 NodeJS
命令行程序
靈機(jī)一點(diǎn)
域(Domain)
應(yīng)用場景
模塊路徑解析規(guī)則
文件拷貝

模塊

編寫稍大一點(diǎn)的程序時(shí)一般都會將代碼模塊化。在 NodeJS 中,一般將代碼合理拆分到不同的 JS 文件中,每一個(gè)文件就是一個(gè)模塊,而文件路徑就是模塊名。

在編寫每個(gè)模塊時(shí),都有 require、exports、module 三個(gè)預(yù)先定義好的變量可供使用。

require

require 函數(shù)用于在當(dāng)前模塊中加載和使用別的模塊,傳入一個(gè)模塊名,返回一個(gè)模塊導(dǎo)出對象。模塊名可使用相對路徑(以./開頭),或者是絕對路徑(以/C:之類的盤符開頭)。另外,模塊名中的.js擴(kuò)展名可以省略。以下是一個(gè)例子。

var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');

// foo1 至 foo4 中保存的是同一個(gè)模塊的導(dǎo)出對象。 另外,可以使用以下方式加載和使用一個(gè) JSON 文件。

var data = require('./data.json');

exports

exports 對象是當(dāng)前模塊的導(dǎo)出對象,用于導(dǎo)出模塊公有方法和屬性。別的模塊通過 require 函數(shù)使用當(dāng)前模塊時(shí)得到的就是當(dāng)前模塊的 exports 對象。以下例子中導(dǎo)出了一個(gè)公有方法。

exports.hello = function () {
    console.log('Hello World!');
};

module

通過 module 對象可以訪問到當(dāng)前模塊的一些相關(guān)信息,但最多的用途是替換當(dāng)前模塊的導(dǎo)出對象。例如模塊導(dǎo)出對象默認(rèn)是一個(gè)普通對象,如果想改成一個(gè)函數(shù)的話,可以使用以下方式。

module.exports = function () {
    console.log('Hello World!');
};

以上代碼中,模塊默認(rèn)導(dǎo)出對象被替換為一個(gè)函數(shù)。

模塊初始化

一個(gè)模塊中的 JS 代碼僅在模塊第一次被使用時(shí)執(zhí)行一次,并在執(zhí)行過程中初始化模塊的導(dǎo)出對象。之后,緩存起來的導(dǎo)出對象被重復(fù)利用。

主模塊

通過命令行參數(shù)傳遞給 NodeJS 以啟動程序的模塊被稱為主模塊。主模塊負(fù)責(zé)調(diào)度組成整個(gè)程序的其它模塊完成工作。例如通過以下命令啟動程序時(shí),main.js 就是主模塊。

$ node main.js

完整示例

例如有以下目錄。

- /home/user/hello/
    - util/
        counter.js
    main.js

其中 counter.js 內(nèi)容如下:

var i = 0;

function count() {
    return ++i;
}

exports.count = count;

該模塊內(nèi)部定義了一個(gè)私有變量 i,并在 exports 對象導(dǎo)出了一個(gè)公有方法 count。

主模塊 main.js 內(nèi)容如下:

var counter1 = require('./util/counter');
var    counter2 = require('./util/counter');

console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());

運(yùn)行該程序的結(jié)果如下:

$ node main.js
1
2
3

可以看到,counter.js 并沒有因?yàn)楸?require 了兩次而初始化兩次。