两种模块到处方式

  • 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 项目写在结尾概…