1. 程式人生 > >NodeJS中的CommonJS規範

NodeJS中的CommonJS規範

CommonJS

  • 每個檔案是一個模組,有自己的作用域
  • 在模組內部module變數代表模組本身
  • module.exports屬性代表模組對外介面

首先,我們想定義一個模組,就需要建立一個檔案。其次,我們在模組內部我們使用module.exports把我們想輸出的東西放到這個屬性中。

require規則

  • /表示絕對路徑,./表示相對於當前檔案的路徑
  • 支援js、json、node拓展名,如果不寫拓展名,node會按順序依次嘗試解析拓展名,如果不是這三種拓展名,則會報錯。
  • 不寫路徑則認為是build-in模組或者各級node_modules內的第三方模組
require特性:
  • module被載入的時候執行,載入後快取(只加載一次,之後會儲存在記憶體中,就可以直接用了)
  • 一旦某個模組被迴圈載入,就只輸出已經執行的部分,還未執行的部分不會輸出(比較難以理解,應儘量避免迴圈引用模組)
引用系統內建模組:
const fs = require('fs');

// 非同步操作,因為是非同步函式,所以才需要回調函式
const result = fs.readFile('./mode_fs.js', (err, data) => {
    if (err) {
        console.log(err);

    } else {
        console.log(data.toString());
    }

})
// 非同步操作,需要在回撥函式中返回,不能直接輸出結果
console.log(result);//undefined
CommonJS中module.exports與exports的關係

exports就相當於module.exports的快捷方式,它是這樣定義的:

const exports = module.exports;
exports.test = 100;
//可以給exports新增屬性,但不能對exports賦值為物件字面量,因為這樣改變了exports對module.exports的引用關係,切斷了module.exports與exports間的聯絡。
// 這是錯誤的
exports = {
    a:100,
    b:200
}
// 這是可以的
module.exports = { a:100, b:200 }

1.在CommonJS中模組對外輸出的只有module.exports,而exports不過是它的簡寫形式。
2.exports是module.exports的快捷方式,是為了簡寫module.exports,我們可以給exports新增屬性。
但要特別注意不能對exports賦值為物件字面量,因為這樣會改變exports的引用,切斷module.exports與exports的聯絡。