什麼是模組化開發,及模組化開發的好處
- 什麼是模組化開發: 把一些功能類似的程式碼,封裝到一個單獨的檔案中去,這些單獨抽離出來的程式碼,就能夠提供各種各樣好用的功能.這種通過程式碼功能分割檔案的方式就叫做模組化開發.
- 好處: 保證了每個檔案的功能(職能)單一.需要什麼特定的功能,就直接呼叫某一個特定的模組.這樣對將來程式開發和維護都有好處
Node中如何實現模組化開發
在Node中主要通過三個東西實現模組化開發:
- module: 表示一個模組,在Node中最常見的模組就是一個一個的JS檔案.
- require: 作用是載入其他模組用的.在一個JS檔案中如果想要引用其他JS檔案的成員,就需要使用
require
. - exports: 在Node的模組中,如果要這個模組向外暴露一些成員,以供其它JS模組使用,那麼就要使用
exports
Node中的模組化主要是為了解決JS檔案之間的相互依賴關係
Node中模組的分類
Node有三部分組成:ECMAScript + 核心API + 第三方包
核心API
- 什麼是核心API: 由Node官方將一些常用的功能模組編譯成二進位制的執行檔案,然後整合到Node的安裝包中.在我們安裝完Node之後,也同時安裝了這些功能模組.
- 如何使用核心模組: 使用require(“核心模組名稱”)如下例
const XXX = require("XXX");複製程式碼
第三方模組
-
什麼是第三方模組: 除了官方提供的核心模組之外,我們在日常開發中也許還有一些使用頻率很高的功能程式碼.而這些功能就被一些厲害的團隊、個人、公司打包成可複用的模組.並通過NPM官網託管出去,供其他人下載使用.
-
如何使用第三方模組:
- 先使用npm下載這個模組.
- 使用require匯入你所下載的第三方模組.你匯入模組的名字就是你安裝時的名字.
- 通過查閱官方文件,使用你所下載的第三方模組
注意:無論是核心模組還是第三方模組,都是通過 識別符號名稱 來引用這個模組的.
使用者模組
- 什麼是使用者模組: 自己所寫的JS檔案,統統屬於使用者模組
- 使用者模組向外匯出成員的兩種方式:
- 使用global這個全域性物件,將你想要匯出的成員掛載到這個物件上面.但是這種方法有兩個缺陷.
- 會造成全域性變數汙染
- 不知道所引用的成員是誰匯出的.
所以一般情況下我們使用下面這種方式.
- 使用exports來匯出需要暴露的成員
- 使用global這個全域性物件,將你想要匯出的成員掛載到這個物件上面.但是這種方法有兩個缺陷.
exports和module.exports
- 通過module.exports可以使用
.
的形式追加屬性,也可以使用=
直接賦值的形式匯出成員 - exports只能通過
.
的形式追加屬性,不能使用=
直接賦值的形式 - 在一個module中,最終向外暴露的成員,以
module.exports
指向的物件為準. - 在一個module中,不要混合使用
module.exports
和exports
.
Node中的模組載入規則
優先從快取中載入
- 載入核心模組: 優先從快取中載入,如果快取中沒有再去執行載入核心模組
- 載入自己的模組: 優先從快取中載入,如果快取中沒有,再去執行載入自己的模組.
使用者模組的查詢規則:
不過不寫字尾名,則先嚴格按照給定的檔名去查詢模組並載入.如果找不到,則按照一定的規則順序去查詢載入帶字尾名的同名檔案.如下例:index -> index.js -> index.json -> index.node複製程式碼
- 第三方的模組查詢規則:
- 首先檢視專案的跟目錄下有沒有
node_modules
這個資料夾. - 查詢
node_modules
資料夾中有沒和第三方模組名稱一致的資料夾. - 在模組對應的資料夾中,查詢有沒有
package.json
這個檔案 - 在
package.json
檔案中查詢有沒有main
屬性. - 如果有
main
屬性,並且main
屬性指向的路徑存在,那麼就嘗試載入這個路徑指定的檔案 - 如果
package.json
檔案中,沒有main
屬性,或者main
屬性指向的路徑不存在,或者乾脆就沒有package.json
檔案.那麼,就會嘗試載入模組根目錄中的index
相關檔案:index.js -> index.json -> index.node
- 如果在
node_modules
檔案中找不到對應的模組資料夾,或者在專案根目錄中就沒有node_modules
這個資料夾.則會向上一層的資料夾中查詢,查詢規則同上. - 如果上一層資料夾得目錄中也沒有找到,則再向上一層資料夾中去找,直到找到當前專案所在的碟符根目錄為止.
- 如果找到碟符根目錄還沒有找到,則報錯:
cannot find module ***
- 首先檢視專案的跟目錄下有沒有
關於模組化
- Node中的模組化基於
common.js
,其特點是有所的依賴項同步載入. common.js
由於是一個同步載入規範,所以不適合瀏覽端使用.於是瀏覽端有了非同步模組載入機制AMD規範.- 在ES6中已推出了語言規格上的模組化方案.
我的個人網址: www.wangyiming19950222.com