node 12 模組系統 其他成員

2021-09-01 03:00:17 字數 3844 閱讀 7776

main.js

var fooexports =

require

('./foo');

// referenceerror: foo is not defined

// console.log(foo);

// 這種方式匯出的都是物件

// console.

log(fooexports)

;

foo.js

var foo =

'bar'

;function

add(x, y)

// 只能得到我想要給你的成員

// 這樣做的目的是為了解決變數命名衝突的問題

exports.add = add;

// exports 是乙個物件

// 我們可以通過多次為這個物件新增成員實現

exports.foo = foo;

exports.str =

'hello world'

;

現在,我有另乙個需求:

希望載入得到直接就是乙個:

main.js

var fooexports =

require

('./foo');

console.

log(fooexports)

;

foo.js

function

add(x, y)

// exports = add;//沒用

// 如果某個模組需要直接匯出某個成員,而非掛載的方式

// 那這個時候必須使用下面的方式

// module.exports = add;// [function: add]

module.exports =

'hello'

;// hello

// 注意:重複寫會後面的覆蓋前面的(hello 被覆蓋掉了)

module.

exports

=function

(x, y)

;// [function]

// 通過物件的方式匯出多個成員

module.exports =

, b:

'hello',}

;//

在 node 中,每個模組內部都有乙個自己的 module 物件,該物件中有個成員 exports 也是物件

// 類似於這個

var module =

};

如果你需要對外匯出成員,只需要把匯出的成員掛載到 module 物件上去

// module.exports.foo = 'bar';

// module.exports.add = function (x, y) ;

// 上面那種方法點的太多了,所有 node.js 提供了 exports === module.exports

console.

log(

(exports === module.exports));

// true

// 所以可以簡化為

exports.foo =

'bar'

;exports.

add=

function

(x, y)

;

require 時就相當於預設在**最後新增一句:return module.exports

// 另乙個 js 檔案獲取

var fooexports =

require

('./foo');

console.

log(fooexports)

;//

所以想要匯出其他型別的資料

// 相當於把 exports 物件型別重新定義了

module.exports =

'hello'

;

而實際用的時候:

注意:如果實在分不清 exports 和 module.exports,那就選擇忘記 exports,而只使用 module.exports 也沒問題

foo.js 中

console.

log(__filename)

;console.

log(__dirname)

;

main.js 中引用 foo.js 就會列印出來:

每個模組中都有乙個 module 物件

module 物件中有乙個 exports 物件

我們可以把需要匯出的成員都掛載到 module.exports 介面物件中

也就是:moudle.exports.*** = ***的方式

但是每次都moudle.exports.*** = ***很麻煩,點兒的太多了

所以 node 為了你方便,同時在每乙個模組中都提供了乙個成員叫:exports

exports === module.exports結果為true

所以對於:moudle.exports.*** = ***的方式 完全可以:expots.*** = ***

當乙個模組需要匯出單個成員的時候,這個時候必須使用:module.exports = ***的方式

不要使用exports = ***不管用

因為每個模組最終向外return的是module.exports

exports只是module.exports的乙個引用

所以即便你為exports = xx重新賦值,也不會影響module.exports

但是有一種賦值方式比較特殊:exports = module.exports這個用來重新建立引用關係的

出現目的:解決 node 中./a.txt讀取檔案只是相對於執行 node 命令所處的路徑

如果通過fun.js呼叫index.js讀取檔案a.txt,執行順序為fun.js>>index.js>>a.txt,那麼 node 呼叫fun.js,執行到index.js便會出錯,因為a.txt的讀取會在fun.js去尋找

所以為了解決這個問題,把相對路徑轉換為絕對路徑,在index.js中,便可以用__dirname + '/a.txt'代替./a.txt,為了避免手動拼接帶來的一些低階錯誤,推薦用 path 模組的path.join(__dirname,'./a.txt')

注意:模組中的路徑標識require不受影響(檔案的讀取fs.readfile()會出現上面錯誤)

Node 12 值得關注的新特性

前言 時隔一年,node.js 12 如約而至,正式發布第乙個 current 版本。該版本帶來了諸如 如果你不了解 node.js 的 long term support 發布策略的話,一定要看看 就目前而言,node.js 6.x 和 8.x 將在 2019 年末結束 lts 的支援,大家盡快公...

Node模組型別

在node應用中,並不是所有的模組都是同一類,通常會有核心模組 第三方模組 檔案模組 資料夾模組幾種。核心模組指的是那些被編譯進node的二進位制模組,它們被預置在node中,提供node的基本功能,如fs http https等。核心模組使用c c 實現,外部使用js封裝。要載入核心模組,直接在 ...

Node 模組引入

node 模組引入主要會經歷如下3個步驟 在 node 中,模組分為核心模組和檔案模組。核心模組是 node 提供的模組。其中部分模組在 node 原始碼編譯時直接生成二進位制執行檔案,在 node 程序啟動時被載入到記憶體中,因此當這部分模組引入時,會只直接跳過檔案定位和編譯執行,且在路徑分析中優...