Node.js 中兩種模塊導出方式區別

兩種模塊到處方式

  • exports.xxx = ...

  • module.exports = ...

1. exports.xxx = ...

  • exportsmodule.exports 的一個引用(快捷方式)。

  • 當你寫 exports.foo = function() {},實際上就是給 module.exports 對象添加了一個 foo 屬性。

  • 這種方式適合導出多個屬性或方法,類似給模塊導出一個對象,里面包含多個鍵值對。

// example.js
exports.sayHello = () => {console.log('Hello');
};
exports.value = 123;

使用時:

const example = require('./example');
example.sayHello();  // Hello
console.log(example.value);  // 123

2. module.exports = ...

  • module.exports 是最終模塊的導出對象,Node.js 會返回它給 require 調用方。

  • 你可以直接把它賦值為任意值(對象、函數、類等),覆蓋默認的空對象。

  • 當你需要導出一個整體,比如一個函數或者一個類,通常用這種方式。

// example2.js
module.exports = function() {console.log('I am a function');
};

使用時:

const example2 = require('./example2');
example2();  // I am a function

關鍵區別點

方面exports.xxx = ...module.exports = ...
導出內容給導出對象添加屬性,保持默認對象結構直接替換導出對象
使用場景導出多個方法/屬性組成的對象導出單個函數、類或自定義對象
賦值操作影響修改 exports 的屬性,不影響引用直接賦值替換 module.exports
注意事項不能直接給 exports 賦值,否則斷開引用賦值給 module.exports 是推薦方式


常見錯誤示范

// 錯誤寫法 - 斷開 exports 與 module.exports 引用
exports = function() {console.log('hello');
};
// 這樣 require 時拿到的其實是 module.exports 的默認空對象 {}

總結

  • exportsmodule.exports 的快捷方式,不要直接給 exports 重新賦值。

  • 推薦直接用 module.exports = xxx,尤其是導出單一對象、函數或類時。

  • exports.xxx = ... 來給導出對象添加多個屬性和方法。


需要我幫你寫幾個例子來演示,或者幫你講解它們內部的引用機制嗎?

二、推薦統一只使用一個用法,例如module.exports

module.exports 是 Node.js 模塊導出的根本對象,直接操作它可以讓代碼更清晰和一致。

確實,推薦大家**統一使用 module.exports**來導出模塊內容,這樣:

  • 只需記住一種導出方式,避免混淆

  • 可以隨時導出整個對象、函數或類

  • 避免誤用 exports 斷開引用導致導出失效的問題

比如你可以直接這樣寫:

module.exports = {foo: () => { console.log('foo'); },bar: 123,
};

或者導出單個函數:

module.exports = function() {console.log('hello');
};

這樣更直觀,也避免了用 exports 時容易犯的坑。

總結:
統一使用 module.exports,簡單明了,避免不必要的坑,推薦!

三、module.exports本質是一個對象

1. module.exports 本質是一個對象

在 Node.js 中,module.exports 默認是一個空對象 {},你可以像操作普通對象那樣給它添加屬性(鍵值對):

module.exports.foo = () => console.log('foo');
module.exports.bar = 123;

這就是“直接把鍵寫上去”的意思:給 module.exports 對象上直接賦屬性。

使用時:

const myModule = require('./myModule');
myModule.foo();  // 輸出 'foo'
console.log(myModule.bar);  // 輸出 123

2. 也可以直接整體賦值(替換)

你也可以直接給 module.exports 賦一個新對象(或者函數、類),而不是在它上面添加屬性:

module.exports = {foo: () => console.log('foo'),bar: 123,
};

這樣寫和上面效果是一樣的,但一次性把導出內容整體替換了。


3. 不能直接給 exports 賦值(避免斷開引用)

很多人誤會以為直接給 exports = {...} 也能導出,但這是錯的,會導致導出失敗。


總結

  • “直接把鍵寫上去”,是指給 module.exports 對象直接添加屬性,比如 module.exports.foo = ...

  • 也可以一次性替換成一個新對象,比如 module.exports = { foo: ..., bar: ... }

  • 推薦統一用 module.exports 來避免混淆。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83924.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83924.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83924.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦出問題了,無網絡環境下一鍵快速重裝系統

在電腦使用過程中,系統故障、卡頓、崩潰等問題屢見不鮮。面對這些情況,重裝系統往往是解決問題的最有效手段之一。然而對于剛接觸計算機操作的新用戶來說,如何安全、穩定地完成系統重裝,仍是一個頗具挑戰的任務。 這一款專為新手…

基于區塊鏈的去中心化身份驗證系統:原理、實現與應用

前言 在數字化時代,身份驗證是網絡安全和隱私保護的核心環節。傳統的身份驗證系統依賴于中心化的機構,如政府、銀行或互聯網服務提供商,這些機構存儲和管理用戶的個人信息。然而,中心化系統存在諸多問題,如數據泄露風險…

React forwardRef 與 useImperativeHandle 深度解析

在React開發中,組件間的通信是一個核心話題。雖然props和state能夠處理大部分場景,但有時我們需要更直接的方式來操作子組件。今天我們來深入探討兩個強大的React Hook:forwardRef和useImperativeHandle。 forwardRef:傳遞引用的…

KingbaseES在線體驗平臺深度測評:基于MCP接口管理的Oracle風格SQL實戰

文章目錄 一、平臺環境與準備二、引導體驗1.檢查數據庫版本及服務狀態 三、建庫與建表1. 建庫(KingbaseES中通常無需顯式建庫,此處以創建schema模擬)2. 建表 四、查庫與數據操作測試1. 查庫(確認表結構)2. 新增數據3. …

echarts開發 | 數據可視化 -- 第三篇 echart進階配置項 數據集

文章目錄 一、概念二、回顧在系列(series)中設置數據三、在數據集中設置數據3.1 數據集(dataset) 基礎3.2 二維數組數據(默認) 四、把數據集(dataset) 的行或列 映射為 序列 (series)五、維度(dimension)六、數據到圖形的映射 (series.encode) 一、概念 …

如何科學測算AI業務場景所需算力服務器?——以Qwen3 32B模型與海光K100為例

在人工智能(AI)技術飛速發展的今天,越來越多企業開始部署大模型應用,如智能問答、文本生成、知識圖譜構建等。但如何合理配置硬件資源,既滿足業務需求又避免資源浪費,是每個項目實施前必須解決的問題。 本…

滲透實戰:利用XSS獲取cookie和密碼

操作均來自靶場,切勿用于未授權滲透測試! Lab 21:將反射型 XSS 注入帶有尖括號、單引號、雙引號、反斜杠和反引號的 Unicode 轉義模板文字中 輸入的任何單引號雙引號尖括號都會被 unicode 編碼 直接換另一種代碼執行方式${alert(1)}&#…

Eureka、Nacos、Zookeeper 優雅上下線機制

? 三大注冊中心優雅上下線機制對比 維度EurekaNacosZookeeper注冊方式客戶端注冊 心跳維持客戶端注冊 心跳維持客戶端創建臨時節點服務可用狀態控制STARTING、UP、DOWN、OUT_OF_SERVICEUP、DOWN、STARTING 等無顯式狀態標識,靠節點存在與否判定上線控制方式通過…

Flink與Kubernetes集成

引言 在當今大數據與云計算蓬勃發展的時代,容器編排與流處理技術成為企業數據處理架構的關鍵支柱。Kubernetes作為容器編排系統的行業標準,能夠高效自動化地部署、擴展和管理計算機應用程序;Apache Flink則是流處理和批處理領域的佼佼者&…

第五節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 角色管理模塊(上)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

實施企業預算管理的企微CRM系統技巧:從成本控制到價值創造

一、企微CRM管理系統為何成為預算管理新引擎? 官方數據顯示,接入企微CRM系統的企業平均降低客戶管理成本28%,預算執行效率提升40%。這源于企微CRM管理軟件的三大獨特優勢: 原生集成能力:與企業微信通訊錄、會話存檔無縫對接&…

WebFuture:手機版頁面部分區域報錯:未將對象引用設置到對象的實例

問題描述: 手機版頁面部分區域報錯:未將對象引用設置到對象的實例,PC板訪問正常。 問題分析: 對比PC和手機頁面模板,調用代碼有以下差異,手機版模板沒兼容null值,簡介為空導致報錯。 解決方法…

【Cursor點擊登錄后一直轉圈,無反應】

Cursor點擊登錄后一直轉圈,無反應 一、問題描述二、解決方案 一、問題描述 1、進入Cursor官網(國際版): Cursor國際版地址 2、填入賬號密碼,點擊登錄 3、一直轉圈,無法登錄 二、解決方案 使用梯子&…

【無標題】世界模型

為什么大語言模型,沒有真正推動經濟大幅增長,但世界模型有可能 5月份谷歌IO大會,DeepMind老板(谷歌AI業務負責人,2024Nobel化學獎得主,黛密斯哈薩比斯)提到,谷歌接下來目標是做世界…

Doc2X:?精度、?性價??檔解析 API,助力Arxiv論文智能解讀Agent構建

前言 在AI大模型時代,RAG(Retrieval-Augmented Generation)檢索增強生成技術已經成為構建智能知識庫和問答系統的核心架構。然而,在實際項目實施過程中,開發者們往往會遇到一個關鍵痛點:如何高質量地將各種…

uniapp 對接deepseek

廢話不多說直接上代碼 // 小程序專用流式服務 export const streamChatMiniProgram (messages, options {secret: "" }) > {return new Promise((resolve, reject) > {// 構建請求數據 const requestData {model: deepseek-chat,messages,stream: true,ma…

Softhub軟件下載站實戰開發(四):代碼生成器設計與實現

文章目錄 Softhub軟件下載站實戰開發(四):代碼生成器設計與實現1.前言 📜2.技術選型3.架構概覽 🏗?3.1 架構概覽3.2 工作流程詳解 4.核心功能實現 ?4.1 配置管理系統4.2 數據庫表結構解析4.3 模板渲染引擎4.4 智能類…

鴻蒙組件通用屬性深度解析:從基礎樣式到高級定制的全場景指南

一、引言:通用屬性 —— 構建視覺體驗的核心語言 在鴻蒙應用開發體系中,組件的視覺呈現與交互體驗主要通過通用屬性系統實現。這些屬性構成了從基礎樣式定義(尺寸、顏色)到復雜交互控制(動畫、布局)的完整…

選擇與方法專欄(9) 職場內篇: 是否要跳出舒適圈?如何處理犯錯?

合集文章 一個中科大差生的8年程序員工作總結_8年工作經驗 程序員-CSDN博客 選擇與方法專欄(1)職場外篇:謹慎的選擇城市、行業、崗位-CSDN博客 選擇與方法專欄(2)職場外篇: 每個時代都有自己的機遇-CSDN…

DCM4CHEE ARCHIVE LIGHT 源代碼解析(1)-前言

系列文章目錄 DCM4CHEE ARCHIVE LIGHT 源代碼解析(1)-前言DCM4CHEE ARCHIVE LIGHT 源代碼解析(2)-STOWRS文章目錄 系列文章目錄概述一、項目結構1、下載解壓代碼2、IntelliJ IDEA加載源代碼二、編譯發布1、編譯 dcm4chee-arc-ear 項目2、編譯 dcm4chee-arc-ui2 項目寫在結尾概…