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 物件出現目的:解決 node 中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
這個用來重新建立引用關係的
./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 程序啟動時被載入到記憶體中,因此當這部分模組引入時,會只直接跳過檔案定位和編譯執行,且在路徑分析中優...