Node.js的模塊機制

来源:https://www.cnblogs.com/bykp/archive/2018/01/23/8338245.html
-Advertisement-
Play Games

模塊載入過程: 路徑分析 文件定位 模塊編譯 Node對引入過的模塊都會進行緩存,以減少二次引入時的開銷。緩存的是編譯和執行之後的對象。require時對緩存中的模塊是第一優先順序的 路徑分析 模塊標識符:require的參數,按書寫形式可以分成以下幾類: 核心模塊:如http,fs,path 文件模 ...


模塊載入過程:
路徑分析 -> 文件定位 -> 模塊編譯

Node對引入過的模塊都會進行緩存,以減少二次引入時的開銷。緩存的是編譯和執行之後的對象。require時對緩存中的模塊是第一優先順序的

路徑分析

模塊標識符:require的參數,按書寫形式可以分成以下幾類:

  • 核心模塊:如http,fs,path
  • 文件模塊
    • 路徑模塊
      • 相對路徑模塊:.或..開始
      • 絕對路徑模塊:/開始
    • 非路徑形式的模塊

核心模塊

  • 在Node.js源代碼編譯過程中就已經編譯成二進位代碼,載入速度超快;
  • 優先順序僅次於緩存,因此與核心模塊同標識符的文件模塊都不能載入成功。

路徑形式的文件模塊

  • require時才會進行模塊編譯和執行;
  • 會轉換為真實路徑,並且以真實路徑作為索引,將編譯執行後的對象放到緩存中。

非路徑形式的文件模塊

  • 從當前模塊開始,一直沿路徑向上逐級遞歸,直到根目錄,尋找node_modules目錄進行文件定位;

文件定位

分析標識符的過程中,先分析文件擴展名,沒有查找到對應的文件,但是得到一個目錄,就會將該目錄當成一個包來處理。

文件擴展名分析

require時的標識符不需要包含文件擴展名,Node會按.js,.json,.node的次序同步定位。
判斷文件是否存在是同步進行的,所以.json.node在引入時加上擴展名會加快引入速度

目錄分析和包

模塊編譯

文件模塊在定位成功後,Node會新建一個Module對象,然後根據路徑載入並編譯。根據文件的擴展名不同,其載入的方法也不同。

//Module 對象
function Module(id,parent){
    this.id = id;
    this.exports = {};
    this.parent = parent;
    updateChildren(parent, this, false);
    this.filename = null;
    this.loaded = false;
    this.children = [];
}

可以通過require.extensions知道系統中已有的擴展方式。甚至可以使用require.extensions['.ext']的形式對.ext擴展名進行自定義載入方式,不過官方不鼓勵,建議先編譯成JavaScript文件。

.js 文件

通過fs模塊同步讀取文件後編譯執行;

首先會將文件內容進行頭尾包裝:

(function(exports , require , module , __filename , __dirname){
    **JavaScript content**
});

這樣做可以:

  • 在該文件中引入exports , require , module , __filename , __dirname變數;
  • 每個模塊文件之間都進行了作用域隔離;

包裝之後的模塊就會交給vm.runInThisContext執行得到一個function(註意是function)。最後將module.exports,require,module以及在文件定位中得到的 __filename 和 __dirname作為參數傳遞給這個function執行。

所以嘛,在模塊內對exports進行賦值:

exports = function(){};

是改變了匿名函數的形參的引用,但是實參中無論是module還是module.exports都不能知道被賦值了。

.node

這是用C/C++編寫的擴展文件,通過dlopen()方法載入最後編譯生成的文件。

.json

通過fs模塊同步讀取文件後,用JSON.parse()解析返回結果,然後將它賦給模塊對象的exports。

每一個編譯成功的模塊都會將其文件路徑作為索引緩存在Module._cache對象上,以提高二次引入的性能。

引用:
http://nodejs.cn/
http://www.ituring.com.cn/book/1290


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.創建函數 delimiter // create function function_name(形參名 數據類型) returns 數據類型 #必須指定返回的數據類型。 begin stmt; end // delimiter ; 2.刪除函數 drop function function_na ...
  • 我錄屏的方式是分別錄製音頻和視頻,最後合併成mp4格式,比較麻煩,因為網上完整的教程比較少,所以我打算寫一個完整版的,照著我的代碼寫完之後,至少是能夠實現功能的,而不是簡單的介紹下用法。 1既然是錄製視頻,我們應該有一個按鈕控制開始和結束。 2在錄製之前,需要先判斷一下Android系統的版本是否大 ...
  • 先上效果圖 灑豆子的效果,突發奇想,覺得這個動畫挺有意思的,就抽空寫了一個玩玩 繪製流程: 定義6個‘’豆子‘’,每個豆子有各自的屬性,大小,拋出的速度等,然後控制每個的方向和狀態,回彈效果使用差值器 BounceInterpolator package com.fragmentapp.view.b ...
  • 本文中我們將講解一下App的長連接實現。一般而言長連接已經是App的標配了,推送功能的實現基礎就是長連接,當然了我們也可以通過輪訓操作實現推送功能,但是輪訓一般及時性比較差,而且網路消耗與電量銷毀比較多,因此一般推送功能都是通過長連接實現的。 那麼如何實現長連接呢?現在一般有這麼幾種實現方式: 使用 ...
  • Genymotion是一款非常好用的虛擬機,利用它可以在window、Liunx或MAC系統上實現Android的模似器。對於開發人員來說,有了Android模似器,就可以在電腦上實時調試安卓app,而不用外接手機設置,非常方便。 現在我們開始安裝一個試下。 1.保證CPU是否支持虛擬化技術。 我們 ...
  • 最近發現css遺忘了很多,原因在於平時很少用到一些樣式,現記錄一些平時工作中使用頻率比較少的屬性以備查看。 1.文本屬性 首行文本縮進,針對於塊級元素,text-indent 可以使用所有長度單位,包括百分比值。百分比是相對於父級元素設置的。 文本對齊屬性值中有個justify是兩端對齊,之前用的比 ...
  • 簡介 前面寫了一篇文章講解了position常用的幾個屬性:《CSS 屬性之 position講解》一般都知道下麵幾個常用的: 在https://developer.mozilla.org/zh-CN/docs/Web/CSS/position還說了下麵這三個值: 估計大部分都沒有用過positio ...
  • 1:字元串 JS中的任何數據類型都可以當作對象來看。所以string既是基本數據類型,又是對象。 2:聲明字元串 var sStr = ‘字元串’; var oStr = new String(‘字元串’); 3:字元串屬性 1.length 計算字元串的長度(不區分中英文)。 2.construc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...