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

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.xdnf.cn/news/14495.html

相关文章:

  • Vue 组合式 API 与 选项式 API 全面对比教程
  • 期权入门介绍
  • PCB设计教程【大师篇】stm32开发板PCB布线(信号部分)
  • 附录:对于头结点单向链表的优化方法
  • AlibabaCloud+SpringCloud简述
  • 人工智能学习25-BP代价函数
  • RHCE 练习四:编写脚本实现以下功能
  • 10N65-ASEMI电机驱动方面专用10N65
  • 34.树形 DP
  • 【C语言】计算机组成、计算机语言介绍
  • 【Steel Code】8.6~8.7:TENSION MEMBERS, COMPRESSION MEMBERS
  • CountDownLatch入门代码解析
  • DeepSeek介绍
  • 嵌入式学习
  • Linux命令
  • JUC核心解析系列(一)——原子类深度解析
  • python第52天打卡
  • 模型 追蛇效应
  • 理解 C++ 中的特征技术(traits)
  • 基于vue框架的儿童食品营养推荐系统的设计与实现8t2b9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • C++ QT开发学习指南-从入门到实战项目
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑3
  • 强化学习入门:价值、回报、策略概念详解
  • XCTF-misc-base64÷4
  • qt中自定义控件编译成动态库
  • 详解Java的启动参数-Dfile.encoding、System.getProperty(“file.encoding“)、该参数影响哪些行为
  • 如何监控Seata的事务执行状态?
  • 【python】pathlib用法
  • 3.1.2_栈的顺序存储实现
  • JavaScript 将一个带K-V特征的JSON数组转换为JSON对象