当前位置: 首页 > news >正文

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 来避免混淆。

相关文章:

  • 数据质量-如何构建高质量的大模型数据集
  • .net6接口多个实现类使用特性标记并解析
  • JavaScript 与 Vue 键盘事件全面指南(Composition API + <script setup>)
  • [AAAI Oral] 简单通用的公平分类方法
  • WebRTC(四):STUN协议
  • Redis全面深入学习目录
  • 02-D3.js 控制横向柱图切换数据带动画效果
  • 微信小程序使用computed
  • Python文件与目录操作管理详解
  • 【系统分析师】2011年真题:综合知识-答案及详解
  • 条件收敛的级数中项必须趋于 0,正负项抵消,但趋于 0 的速度不需要“足够快”
  • 《仿盒马》app开发技术分享-- 回收金提现安全锁校验(端云一体)
  • Java基础复习之继承
  • 【鸿蒙初级】
  • EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
  • Flutter包管理与插件开发完全指南
  • flutter 项目配置Gradle下载代理
  • 算法题(力扣每日一题)—改变一个整数能得到的最大差值
  • 性能优化 - 高级进阶: Spring Boot服务性能优化
  • 强化学习-UCB示例
  • 如何用wp做企业网站/品牌运营管理公司
  • 沧州网站排名优化/友情链接怎么连
  • 做PS的赚钱的网站/百度收录查询接口
  • 浙江省建设职业注册中心网站/网络培训心得体会5篇
  • 网站建设网店名字/北京口碑最好的it培训机构
  • wordpress4.8优化/seo和sem的区别是什么