自定義子產品
開發者自己寫的子產品就是自定義子產品。在node.js中 ,對代碼的封裝是以子產品(一個一個的檔案)為機關進行的。一般的做法是實作好某一個功能之後,封裝成一個子產品,然後在其它檔案中使用這個子產品。
使用一個子產品,就是在一個js檔案中去使用另一個js檔案中定義的變量,常量,函數…
基本步驟
-
定義子產品
建立一個js檔案,用子產品名給它命名。例如,子產品叫myModule,則這個js檔案最好叫myModule.js
-
導出子產品
在myModule.js内部,定義一些函數,變量,當然,它們會根據業務要求做一些不同的工作。最後根據情況導出這些函數,變量。
//myModule.js
const myPI = 3;
function add(a, b) {
return a + b;
}
// 通過module.exports來導出
module.exports = {
myPI,
add
};
注意:
- module.exports 是固定寫法,一般放在檔案的最末尾,也隻用一次。
- module.exports表示目前子產品要暴露給其它子產品的功能。當然不需要把所有在子產品中定義的函數都暴露出來。
-
引入子產品
在需要使用子產品的檔案中,使用require語句引入定義好的子產品,注意使用相對路徑。假設目前的檔案是index.js,而希望在index.js檔案中使用myModule.js中的add方法。
做法是:
// index.js
const myMath = require('./myMath');
// require()就是用來引入子產品的
注意:使用自定義子產品時,使用相對路徑,而使用核心子產品時,不需要寫路徑。
-
使用子產品
當一個子產品被成功引入之後,就可以按使用核心子產品的過程一樣去使用它們了。
// index.js
const myMath = require('./myMath');
// 在使用之前請先列印出來看看。
console.log(myMath);
let rs = myMath.add(23,45);
console.log(rs) // 68
導出子產品的兩種方式
在自定義子產品過程中,有兩種導出子產品内容的方式:
- exports
- module.exports
參考
它們的關系是: exports是module.exports的别名,即:
exports === module.exports
是以下面兩種寫法的效果是一樣的:
// 1 mymodule.js
exports.f = function(){ }
exports.pi = 3.1415926
// 2 mymodule.js
module.exports.f = function(){ }
module.exports.pi = 3.1415926
差別在于:
- 在引入某子產品時,以該子產品中module.exports指向的内容為準。
- 在定義子產品時:
- 在初始時,exports和module.exports是指向同一塊記憶體區域,其内容都是一個空對象。
- 如果直接給exports對象指派(例如:exports={a:1,b:2}),此時,exports就不會再指向module.exports,而轉而指向這個新對象,此時,exports與module.exports不是同一個對象。而在引入子產品時,是以子產品的中的module.exports為準,是以,此時寫在exports上的對象是無法導出的。
- 在導出子產品過程中,建議隻用一種方式(建議直接使用module.exports)。