10、Node.js模塊系統

来源:https://www.cnblogs.com/-nbloser/archive/2018/06/08/9157336.html
-Advertisement-
Play Games

##################################################################################介紹Node.js模塊系統為了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。 模塊是Node.js 應用程 ...



##################################################################################介紹
Node.js模塊系統
為了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。
模塊是Node.js 應用程式的基本組成部分,文件和模塊是一一對應的。換言之,一個 Node.js 文件就是一個模塊,這個文件可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展。

####################################################################################
創建模塊
######例子:

// 1_xmodule.js
exports.foo = function () {
    console.log('foo in 1_xmodule.js running');
};

//1_main.js
var xmodule = require('./1_xmodule');
xmodule.foo();

執行1_main.js可以調用1_xmodule.js的方法,例子簡單,很容易讀懂
1_xmodule.js中通過exports.foo = ...使得1_main.js中可以調用foo方法。

Node.js 提供了 exports 和 require 兩個對象,其中 exports 是模塊公開的介面,require 用於從外部獲取一個模塊的介面,即所獲取模塊的 exports 對象。
####例如:

//hello.js 
function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello;

//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 


模塊介面的唯一變化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用該模塊時,其介面對象就是要輸出的 Hello 對象本身,而不是原先的 exports。

####################################################################################
服務端的模塊放在哪裡
模塊載入過程


###從文件模塊緩存中載入
儘管原生模塊與文件模塊的優先順序不同,但是都會優先從文件模塊的緩存中載入已經存在的模塊。
###從原生模塊載入
原生模塊的優先順序僅次於文件模塊緩存的優先順序。require 方法在解析文件名之後,優先檢查模塊是否在原生模塊列表中。以http模塊為例,儘管在目錄下存在一個 http/http.js/http.node/http.json 文件,require("http") 都不會從這些文件中載入,而是從原生模塊中載入。
原生模塊也有一個緩存區,同樣也是優先從緩存區載入。如果緩存區沒有被載入過,則調用原生模塊的載入方式進行載入和執行。
###從文件載入
當文件模塊緩存中不存在,而且不是原生模塊的時候,Node.js 會解析 require 方法傳入的參數,並從文件系統中載入實際的文件,載入過程中的包裝和編譯細節在前一節中已經介紹過,這裡我們將詳細描述查找文件模塊的過程,其中,也有一些細節值得知曉。
require方法接受以下幾種參數的傳遞:
    • http、fs、path等,原生模塊。
    • ./mod或../mod,相對路徑的文件模塊。
    • /pathtomodule/mod,絕對路徑的文件模塊。
    • mod,非原生模塊的文件模塊。
在路徑 Y 下執行 require(X) 語句執行順序:
1. 如果 X 是內置模塊
   a. 返回內置模塊
   b. 停止執行
2. 如果 X 以 '/' 開頭
   a. 設置 Y 為文件根路徑
3. 如果 X 以 './' 或 '/' or '../' 開頭
   a. LOAD_AS_FILE(Y + X)
   b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. 拋出異常 "not found"
LOAD_AS_FILE(X)
1. 如果 X 是一個文件, 將 X 作為 JavaScript 文本載入並停止執行。
2. 如果 X.js 是一個文件, 將 X.js 作為 JavaScript 文本載入並停止執行。
3. 如果 X.json 是一個文件, 解析 X.json 為 JavaScript 對象並停止執行。
4. 如果 X.node 是一個文件, 將 X.node 作為二進位插件載入並停止執行。
LOAD_INDEX(X)
1. 如果 X/index.js 是一個文件,  將 X/index.js 作為 JavaScript 文本載入並停止執行。
2. 如果 X/index.json 是一個文件, 解析 X/index.json 為 JavaScript 對象並停止執行。
3. 如果 X/index.node 是一個文件,  將 X/index.node 作為二進位插件載入並停止執行。
LOAD_AS_DIRECTORY(X)
1. 如果 X/package.json 是一個文件,
   a. 解析 X/package.json, 並查找 "main" 欄位。
   b. let M = X + (json main 欄位)
   c. LOAD_AS_FILE(M)
   d. LOAD_INDEX(M)
2. LOAD_INDEX(X)
LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
   a. LOAD_AS_FILE(DIR/X)
   b. LOAD_AS_DIRECTORY(DIR/X)
NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
   a. if PARTS[I] = "node_modules" CONTINUE
   b. DIR = path join(PARTS[0 .. I] + "node_modules")
   c. DIRS = DIRS + DIR
   d. let I = I - 1
5. return DIRS


內容來自:http://www.runoob.com/nodejs/nodejs-module-system.html    + 我的理解

 


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

-Advertisement-
Play Games
更多相關文章
  • Android設備作為一種移動設備,無論是記憶體還是CPU的性能都受到了很大的限制,這導致Android程式的性能問題異常突出,隨著產品的不斷更新迭代,對於性能優化提出了更高的要求。本篇文章從穩定性、流暢性、耗損、安裝包大小四個方面對Android開發提供了一些容易上手、切實有效的性能優化方法,為An ...
  • 一年一度的WWDC於北京時間6月5號凌晨1點在加利福利亞州聖何塞的麥克恩利會議中心召開。這次WWDC給我最深的感受就是: ...
  • 接著上一節 一,在storybord畫布上面,新增加一個場景,即拖動一個View Controller到畫布上面,同時建立一個button,名字為secondButton.如圖所示。 二,點擊第一個按鈕的時候 ,跳到場景所在的界面。選中firstButton,同時按住Control,拖動滑鼠到第二個 ...
  • 如何解決vue-resource中出現的Failed to load http://localhost:8000/index: Request header field content-type is not allowed by Access-Control-Allow-Headers in pr ...
  • 這兩天針對一個Node項目進行了一波代碼層面的優化,從響應時間上看,是一次很顯著的提升。一個純粹給客戶端提供介面的服務,沒有涉及到頁面渲染相關。 背景 首先這個項目是一個幾年前的項目了,期間一直在新增需求,導致代碼邏輯變得也比較複雜,介面響應時長也在跟著上漲。之前有過一次針對伺服器環境方面的優化(n ...
  • CSS就是用來設置樣式的,美化界面的 如何驗證? 打開一個京東首頁 刪除掉css樣式 發現頁面變得非常難看 由此我們驗證了一個說法,css就是用來美化界面的 1.格式: <style type="text/css"> 告訴系統我這對style標簽中存儲的是文本類型的css代碼 標簽名稱{ 屬性名稱: ...
  • Demo完整源碼下載請移步到 Github: https://github.com/imxiaoer/EchartsDemo 先看下效果圖: 就如上圖所示,都是些常用的基本配置。 Legend分頁,X軸設置,Y軸設置,底部縮放條設置, 數值顯示樣式設置,工具箱設置,自定義工具按鈕, 綁定點擊事件等等 ...
  • 我們想做這樣一個樣式,應該怎麼做? 分析: 有一個標題(h1),還有一些段落(p) 標題是居中的,段落也是居中的,所以我們可以設置h標簽和p標簽居的align屬性等於center來實現 標題和段落都有顏色,都有字體,都有大小 所以需要給文字包裹一個font標簽,然後通過font標簽來設置樣式和字體以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...