轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
原文參考:https://dzone.com/articles/nodejs-dependency-management
引言
Node.js中的一個重要概念是依賴關係管理。本文就將帶大家瞭解依賴管理的各種模式以及Node.js如何載入依賴。
Node.js編寫模組化程式碼非常簡單,我們可以使用單個js檔案非模組化的編寫所有應用程式的內容。
在這裡你可能會問,模組(module)是什麼,它又有什麼作用。
大型專案的實施之中,會有很多分工協作,為了可以讓分工更加方便和順利,我們可以將編寫好的程式碼封裝起來,重複使用或者提供給第三方使用。在專案封裝階段將所有模組組織編譯成一個完整程式。
總而言之,模組是程式碼為了便於在開發中共享和重用,而進行的分組。這些模組使我們可以將複雜的應用程式分解。以便讓我們更好地理解程式碼,發現並修復Bug。基於CommonJS,Node.js中使用require這個關鍵字來獲取一個JavaScript檔案。
開始
我們給專案建立一個目錄,用npm init 進行初始化,建立了app.js和appMsg.js兩個JavaScript檔案。
此時兩個.js檔案都是空的,我們來繼續更新appMsgs.js檔案
此處可以看到module.exports的用法,該方法公開給定檔案(appMsgs.js)中的屬性或物件,這些屬性或物件可以在另一個檔案中使用。本例中該檔案是app.js
在這個系統中每個檔案都可以訪問module.exports,所以appMsgs.js檔案中的一些項就被公開了,下面是具體使用這些內容的展示:
使用require關鍵字引用檔案,使用的時候它將返回一個表示模組化程式碼段的物件。我們將其分配給變數appMsgs variable,然後在console.log語句中使用屬性。得到以下輸出:
執行JavaScript,構造一個返回物件。這個物件可以是一個類建構函式,也可以是一個包含許多元素或一些簡單屬性的物件。
因此,通過管理require和module.exports,我們可以建立這些模組化應用程式。
所需的功能載入程式碼並只載入一次。如果其他人通過require請求這個物件,只會得到這個物件的快取版本。
接下來看看其他方法
對程式碼進行修改,不再公開一個物件,而是匯出整個函式。每次函式呼叫都會執行此程式碼
下面是它如何在app.js檔案中使用
不需要呼叫屬性,只需要像執行函式一樣。與函式執行不同的是每次執行這個程式碼,函式中的程式碼都會被重新執行
下面是執行結果
以上是module.exports的兩種模式及其差異,另一個常見模式中我們需要知道如何使用它作為建構函式
下面是更新後的app.js檔案
本質上來說這樣與在JavaScript中建立偽類並允許建立偽類的例項時是一樣的,下面是更改之後的輸出
以下是該模式的另一個例子
我們建立一個名為userRepo.js的新檔案
下面是app.js和此更改的執行結果
單個檔案使用require很常見,但別忘了另一種模式:資料夾的之間的依賴關係
資料夾相關性
在正式介紹資料夾相關性之前,我們先來了解Nodejs如何查詢依賴項,不要忽略前面例子中的這一內容:
var appMsgs = require("./appMsgs")
Node.js會查詢appMsgs.js檔案,也會將appMsgs作為目錄查詢,無論它首先找到哪個都會進行記錄。
接著我們建立一個名為logger的資料夾,在該資料夾中建立一個index.js檔案
app.js檔案,它用require呼叫這個模組
在這個例子中值得注意的是:
var logger = require("./logger/index.js")
該內容完全正確,但如果改成一下內容:
var logger = require("./logger")
因為專案中沒有logger.js,所以在有一個logger目錄時,預設情況下會載入index.js作為logger的起點。這就是我們命名index.js的原因,這段程式碼的結果:
看到這裡,你可能會疑惑為什麼還要費心去完成建立資料夾和inex.js的額外步驟呢?
原因是,我們可能正在組合一個複雜的依賴項,這個依賴項可能還有其他依賴項。而記錄器的呼叫者不需要知道還有很多其他依賴項存在。
這是一種封裝形式,當我們構建更復雜的內容時,我們可以用多個檔案構建它們,而在使用者端使用單個檔案。資料夾是一種管理這些依賴關係的好方法。
Node Package Manager (NPM)
再次要介紹的另一個內容是NPM,你一定了解它的功能,帶來了很多便利。使用的方法也很簡單。
我們可以使用npm安裝依賴項
npm install underscore;
然後可以在app.js中簡單地require
我們可以看到標紅位置如何使用下劃線包提供的功能。除此之外,當我們需要使用這個模組時,並不指定檔案路徑,只需要使用它的名稱,Node.js將從應用程式中的node\u modules資料夾載入這個模組
下面是它的輸出
總結
本文介紹了Nodejs如何管理它的依賴關係,並且在我們的應用程式中看到了一些可以使用的模式。希望可以對各位的開發學習帶來幫助。