Node.js 基礎教學 2 ( 模組化 )

在開發 Node.js 的時候我們會使用到 module.exports 與 require 實在非常方便。

# 模組化優勢
- 複用性
- 可維護性
- 按需加載
- 降低溝通成本

# Node.js模組分類
- 預設模組
- 自訂模組
- 第三方模組 npm 

# 引入語法
- require('fs') //引入時會自動執行js
- require('./xxx.js') //可以省略.js

# 作用域說明
- 變量,函式等等只存自己的檔案裡面,不會污染全域

# 共享語法(js檔案中存在一個 module 物件 可以使用屬性 exports 來共享內容)
- module.exports //預設為空物件 為定義時 require 為空物件
- module.exports.xxx = 'xxx'  //加入共享屬性這樣可以使用 require 獲取包含xxx屬性的物件
- 也可以使用 exports 語法 但是與 module.exports //指向的物件都是一樣的

# exports 與 module.exports 注意(導出的遠永是 module.exports)
- 如果把 module.exports = {} 原本賦值的屬性會全部消失 require 會拿到一個空 {}
- exports 不能賦值一個空 {} 會無法導出,因為只會導出 module.exports 所指向的物件
- 建議只使用一種語法

# 模組的載入機制
- require 多次使用同個套件並不會重新載入,會先從緩存中讀取。
- require 引入檔案,沒有加上相對路徑(./ or ../) node 會當作是預設模組和第三方模組去 node_modules 資料夾中尋找
- require 引入檔案(./ or ../),沒補上文件類型會自動去尋找 .js -> .json -> .node 結尾的檔案 -> 沒找到加載失敗
- require 引入檔案沒有./或../會從當前目錄去找 node_modules 資料夾下的檔案,若沒有就找上一層的 node_modules 資料夾下的檔案到系統根目錄
- 如果 require 引入的是資料夾,會去找 package.json 裡的 main 屬性的位置若沒有package.json,就會去找有無 index.js 檔案還是找不到就報錯

# Node.js 是 CommonJs 規範
- 每個.js檔案,都是一個 module 物件
- module.exports 屬性可以使用 require 獲取

歡迎到我的部落格 : https://frontenddotblog.com/node-js-%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b2-%e6%a8%a1%e7%b5%84%e5%8c%96/