详解Node.js中exports和module.exports的区别

当我们编写 Node.js 代码时,经常会遇到 exports 和 module.exports,它们都是用来导出模块的。但它们之间有什么区别呢?

1. exports 和 module.exports 区别

在 Node.js 中,每个模块都有一个 module 对象。在 module 对象中,有一个 exports 对象,而且 exports 对象也是 module.exports 对象的一个引用。因此,对于一般情况,我们可以使用 exports 和 module.exports 两者来导出模块。

不过,需要注意的是,exports 只能使用点语法来添加属性或方法,而不能直接覆盖它的引用,因为这样会失去它与 module.exports 的联系。而对于 module.exports,它可以直接赋值为一个新对象,或者一个函数,直接覆盖掉原来的值。

让我们通过两个示例来更加详细地了解这种区别。

2. 示例一

假设我们有一个 hello.js 文件,代码如下:

exports = {
  sayHello: function() {
    console.log('Hello!');
  },
  sayHi: function() {
    console.log('Hi!');
  }
};

我们在另一个文件中导入该模块并调用:

const hello = require('./hello');
hello.sayHello();

这时我们会发现在控制台输出了一个错误信息:

TypeError: hello.sayHello is not a function

这是因为我们使用了 exports 来导出模块,但是在导入 hello 模块的时候,我们使用了 module.exports。

解决方法有两种:

  • 修改导入模块的代码,使用 exports:
const { sayHello } = require('./hello');
sayHello();
  • 把 exports 的引用指向 module.exports:
module.exports = {
  sayHello: function() {
    console.log('Hello!');
  },
  sayHi: function() {
    console.log('Hi!');
  }
};

// 或者这样写
// exports = module.exports;

3. 示例二

让我们再来看一个例子。

假设我们有一个 utils.js 文件,代码如下:

exports = {
  add: function(a, b) {
    return a + b;
  },
  sub: function(a, b) {
    return a - b;
  }
};

我们在另一个文件中导入该模块并调用:

const utils = require('./utils');
const sum = utils.add(1, 2);
console.log(sum);

这时我们发现什么也没有输出,这是因为我们使用了 exports 来导出模块,但是它无法覆盖掉原先的 module.exports 值,因此最终导出的是空对象 {}。

解决方法有两种:

  • 把 add 和 sub 方法添加到 module.exports 中:
module.exports.add = function(a, b) {
  return a + b;
};
module.exports.sub = function(a, b) {
  return a - b;
};
  • 直接覆盖掉 module.exports:
module.exports = {
  add: function(a, b) {
    return a + b;
  },
  sub: function(a, b) {
    return a - b;
  }
};

4. 总结

虽然 exports 和 module.exports 都能用于导出模块,但是它们之间的区别是:

  • exports 是 module.exports 的一个引用,不能直接赋值覆盖。
  • module.exports 可以直接赋值为一个新对象或一个函数,用于覆盖原来的值。

这是 Node.js 中非常重要的一点,需要注意。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Node.js中exports和module.exports的区别 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 解决vue cli4升级sass-loader(v8)后报错问题

    针对“解决vue cli4升级sass-loader(v8)后报错问题”,我会提供以下完整攻略: 问题背景 在升级 sass-loader 到 v8 版本之后,如果项目依赖了 node-sass,就会在启动 npm run serve 命令时遇到下面的错误: Module build failed (from ./node_modules/sass-load…

    node js 2023年6月8日
    00
  • NodeJS使用formidable实现文件上传

    下面是详细讲解“NodeJS使用formidable实现文件上传”的完整攻略: 什么是formidable? formidable是NodeJS的一个表单数据处理库,包括以下功能: 把上传的文件保存到本地文件系统中 转换HTTP请求中的表单数据为可读取的对象 限制上传文件的大小 安装formidable 安装formidable非常简单,只要在项目目录执行以…

    node js 2023年6月8日
    00
  • 解决await在forEach中不起作用的问题

    当使用 forEach 循环异步操作时,很容易遇到异步操作不按照我们期望的方式工作的情况。这是由于 forEach 无法处理异步操作的返回值或者 Promise,在这种情况下,使用 for…of 循环或者 Promise.all 可能是更好的选择。不过,如果你真的需要使用 forEach 并且希望异步操作顺利工作,有一些调整你可以尝试。 下面是一些在 f…

    node js 2023年6月8日
    00
  • node.js中的console.log方法使用说明

    下面是关于node.js中的console.log方法使用的详细攻略。 介绍 在node.js中,console是一个全局模块,提供了一系列与控制台交互的API,其中最常用的便是console.log方法。console.log方法可以将输出的信息打印到控制台上,帮助我们进行控制台调试、日志输出等操作。 使用方法 console.log的使用方法非常简单,只…

    node js 2023年6月8日
    00
  • Nest.js参数校验和自定义返回数据格式详解

    下面给你分享关于“Nest.js参数校验和自定义返回数据格式详解”的完整攻略。 一、参数校验 在Nest.js中,我们可以使用class-validator实现参数校验。需要在controller中使用Dto来对每个请求进行参数校验。具体流程如下: 安装class-validator和class-transformer模块,执行如下命令: npm insta…

    node js 2023年6月8日
    00
  • 详解Node.js access_token的获取、存储及更新

    详解Node.js access_token的获取、存储及更新 在开发微信公众号等基于微信平台的应用时,我们通常需要使用access_token进行接口调用。本文将详细介绍Node.js获取、存储和更新access_token的完整攻略。 获取access_token 获取access_token需要向微信服务器发送GET请求,具体的接口地址为: https…

    node js 2023年6月8日
    00
  • 如何解决sass-loader和node-sass版本冲突的问题

    要解决 sass-loader 和 node-sass 版本冲突的问题,需要进行以下步骤: 确认项目中的依赖 首先要确定项目中已经安装的 sass-loader 和 node-sass 版本。可以通过运行下面的命令来查看当前项目中安装的版本号: npm ls sass-loader node-sass 该命令将会输出当前项目中 sass-loader 和 n…

    node js 2023年6月8日
    00
  • 提升node.js中使用redis的性能遇到的问题及解决方法

    下面就是 “提升node.js中使用redis的性能遇到的问题及解决方法”的完整攻略。 问题分析 当我们使用 Node.js 与 Redis 一起开发时,我们可能会遇到性能问题,原因是 Node.js 是基于事件循环的,而 Redis 是基于阻塞 I/O 的。这意味着 Node.js 在等待 Redis 服务器响应时,会一直停在那里,等待响应结果,而这可能会…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部