Node那些事之模組化

玉鴦發表於2019-02-27

什麼是模組化開發,及模組化開發的好處

  • 什麼是模組化開發: 把一些功能類似的程式碼,封裝到一個單獨的檔案中去,這些單獨抽離出來的程式碼,就能夠提供各種各樣好用的功能.這種通過程式碼功能分割檔案的方式就叫做模組化開發.
  • 好處: 保證了每個檔案的功能(職能)單一.需要什麼特定的功能,就直接呼叫某一個特定的模組.這樣對將來程式開發和維護都有好處

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官網託管出去,供其他人下載使用.

  • 如何使用第三方模組:

    1. 先使用npm下載這個模組.
    2. 使用require匯入你所下載的第三方模組.你匯入模組的名字就是你安裝時的名字.
    3. 通過查閱官方文件,使用你所下載的第三方模組

    注意:無論是核心模組還是第三方模組,都是通過 識別符號名稱 來引用這個模組的.

使用者模組

  • 什麼是使用者模組: 自己所寫的JS檔案,統統屬於使用者模組
  • 使用者模組向外匯出成員的兩種方式:
    1. 使用global這個全域性物件,將你想要匯出的成員掛載到這個物件上面.但是這種方法有兩個缺陷.
      • 會造成全域性變數汙染
      • 不知道所引用的成員是誰匯出的.
        所以一般情況下我們使用下面這種方式.
    2. 使用exports來匯出需要暴露的成員

exports和module.exports

  1. 通過module.exports可以使用 . 的形式追加屬性,也可以使用 = 直接賦值的形式匯出成員
  2. exports只能通過 . 的形式追加屬性,不能使用 = 直接賦值的形式
  3. 在一個module中,最終向外暴露的成員,以module.exports指向的物件為準.
  4. 在一個module中,不要混合使用module.exportsexports.

Node中的模組載入規則

優先從快取中載入

  • 載入核心模組: 優先從快取中載入,如果快取中沒有再去執行載入核心模組
  • 載入自己的模組: 優先從快取中載入,如果快取中沒有,再去執行載入自己的模組.
    使用者模組的查詢規則:
    不過不寫字尾名,則先嚴格按照給定的檔名去查詢模組並載入.如果找不到,則按照一定的規則順序去查詢載入帶字尾名的同名檔案.如下例:
    index -> index.js -> index.json -> index.node複製程式碼
  • 第三方的模組查詢規則:
    1. 首先檢視專案的跟目錄下有沒有node_modules這個資料夾.
    2. 查詢node_modules資料夾中有沒和第三方模組名稱一致的資料夾.
    3. 在模組對應的資料夾中,查詢有沒有package.json這個檔案
    4. package.json檔案中查詢有沒有main屬性.
    5. 如果有main屬性,並且main屬性指向的路徑存在,那麼就嘗試載入這個路徑指定的檔案
    6. 如果package.json檔案中,沒有main屬性,或者main屬性指向的路徑不存在,或者乾脆就沒有package.json檔案.那麼,就會嘗試載入模組根目錄中的index相關檔案:index.js -> index.json -> index.node
    7. 如果在node_modules檔案中找不到對應的模組資料夾,或者在專案根目錄中就沒有node_modules這個資料夾.則會向上一層的資料夾中查詢,查詢規則同上.
    8. 如果上一層資料夾得目錄中也沒有找到,則再向上一層資料夾中去找,直到找到當前專案所在的碟符根目錄為止.
    9. 如果找到碟符根目錄還沒有找到,則報錯:cannot find module ***

關於模組化

  • Node中的模組化基於common.js,其特點是有所的依賴項同步載入.
  • common.js由於是一個同步載入規範,所以不適合瀏覽端使用.於是瀏覽端有了非同步模組載入機制AMD規範.
  • 在ES6中已推出了語言規格上的模組化方案.

我的個人網址: www.wangyiming19950222.com

相關文章