首頁>技術>

Node應用是由模組組成的,每個檔案都被視為一個獨立的模組。Node將每個模組封裝在一個函式中,使得模組內的變數和方法都成為私有的(其他模組不可見)。模組中可以根據需求定義各種屬性和功能,比如處理Http業務我們可以使用http模組,該模組封裝了構建http伺服器相關的API,可以幫助我們快速實現Http伺服器的構建和相關功能的應用。想要模組對外提供相應的變數和方法使用我們就需要藉助 exports 或 module.exports 將其暴露出去,這樣其他模組透過require引入模組時才能呼叫相應的變數和方法。

什麼是模組化

模組化可以理解為將一個複雜的專案進行功能拆分,將相似的功能進行整合分配到指定團隊負責。團隊在根據功能自頂向下逐層把系統劃分成若干模組分配到指定小組,小組在遵循CommonJS規範的基礎上對相應功能進行封裝的過程。當需要某個功能時就可以根據分配找到指定的團隊及小組來完成該業務的處理。而程式碼中這個依賴關係則會在專案打包的時候會根據模組的引入給每個模組標識id,當專案執行後將模組引用指向該id就可以找到對應的模組了。

模組化的好處模組化最明顯的好處就是方便了檔案的組織(規劃、設計和協調)、管理(分配、協同、開發、維護)及使用(載入、複用),模組化讓思路更為清晰可以降低了溝通的成本和維護成本,模組的複用特點提高了專案的開發效率。模組化一般都有快取機制,二次呼叫時無需再解析直接獲取到快取模組內容可以加快響應速度。也可以實現按需載入提升使用者體驗(快速響應),減少伺服器資源的浪費同時降低了指令碼加載出錯的風險。可以規避名稱空間的問題,減少了變數名衝突問題。模組內命名不會與外界發生衝突,也不會汙染全域性變數。想要使用模組中的功能就必須透過module.exports匯出對外的變數或函式,這樣其他模組在透過require()引入該模組時才能讀取到其相應的變數或函式。模組化 “分工明細,職責單一“,需要時直接呼叫即可(複用)。模組化不僅提升了程式碼質量,還可以縮短開發週期。CommonJS規範確保了模組化的一致性和相容性,提高了專案的可擴充套件性。Node模組分類

Node根據模組來源的不同將模組分為了 3 大類,分別是系統模組(由 Node.js 官方提供的內建模組)、自定義模組(使用者根據業務需求建立的js檔案都是自定義模組)及第三方模組(由第三方開發的模組,使用前需要先下載引用)。Node強大不僅是因為官方提供了很多實用的功能模組,還有npm提供了大量的第三方擴充套件模組。使用者不僅可以透過NPM下載別人開發模組來提高專案的開發效率,也可以透過NPM釋出自己的模組貢獻給他人使用(深受廣大JavaScript 開發者的青睞)。

Node模組載入機制

在Node中引入模組需要經歷3個步驟分別是路徑分析 、檔案定位和編譯執行,同時Node會對引入過的模組也會進行快取。當然這裡Node快取的是編譯執行之後的物件而不是靜態檔案,快取是資料交換的緩衝區,快取的執行速度比記憶體快得多,可以幫助硬體更快地執行程式。當要讀取資料時會首先從快取中查詢需要的資料,如果找到了就直接執行沒有再去記憶體中找。Node為了擁有更高的效率將標準的系統模組編譯成了二進位制程式碼並在Node執行的時候部分模組就被直接載入進記憶體中,因此這部分模組就不需要再進行檔案定位和編譯執行就可以直接透過require獲取核心模組。核心模組優先順序高於檔案模組(第三方模組和自定義模組統稱檔案模組),當require引入相同名稱的系統模組和檔案模組時會優先載入系統模組。檔案模組的載入有兩種方式分別是按路徑載入和node_modules資料夾查詢,當require指定路徑時Node會對路徑進行分析查詢指定模組再進行編譯執行,當require沒有指定路徑時Node會透過node_module來載入檔案模組。

Node系統模組

Node官方提供了大量的系統模組,這些模組被定義在Node原始碼中。當Node執行時會自動載入相應的模組以提供系統功能,這類模組提供的API不需要透過外部下載就可以直接透過require引入使用。當沒有指定路徑時require首先會在系統模組查詢有沒有要引入的模組,如果沒有則會尋找當前目錄的node_modules 目錄,如果還沒有再去尋找父級目錄的 node_modules 目錄。

var http = require('http') // 引入系統模組 http 建立伺服器var urls =require('url')   // 引入系統模組 url 解析 url 地址var server=http.createServer()server.on('request',(req,res)=>{    if(req.url.indexOf('?')!=-1){    //做一個判斷跳過/favicon.icon請求,如果請求有 ? 在執行裡面的語句        var obj=urls.parse(req.url,true);// url 模組的 parse 方法幫我們解析Url地址,回得到一個 obj 的物件        var url=obj.pathname; // 獲取請求地址        var params=obj.query;    //提取請求引數        //根據引數做處理.....        res.end();  //結束請求    }})server.listen(8080,()=>{    console.log('伺服器啟動成功了,透過 http://127.0.0.1:8080/ 來進行訪問')})
總結:

Node中的所有功能都是透過模組來劃分的,模組可以讓函式和變數私有化從而避免函式名衝突。模組是構建應用程式的基礎,我們可以透過載入不同的模組來實現專案的功能開發。以上內容是小編給大家分享的【Node實戰007:模組系統入門及使用】。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • PC如何設定兩個IP,三層交換如何設定?