轉載請注明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
原文參考: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如何管理它的依賴關系,並且在我們的應用程序中看到了一些可以使用的模式。希望可以對各位的開發學習帶來幫助。
了解了Node.js的依賴關系,那你知道在web系統中,讀取文件的極限速度究竟能有多快?而我們在項目中如何對表格性能進行優化?2020中國.net開發者大會講師的分享,你一定不想錯過:Web系統開發中的表格性能優化實踐。
