详解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日

相关文章

  • 浅谈node.js中间件有哪些类型

    当我们使用Node.js开发Web应用程序时,中间件是一个非常重要的组件。它们允许我们处理HTTP请求,以便我们可以使用更灵活的代码编写Web应用程序。在Node.js中间件的世界中,有几种不同的类型。 1. 应用程序级别的中间件 应用程序级别的中间件是在应用程序对象上执行的中间件。我们可以通过以下方法来使用它们: const express = requi…

    node js 2023年6月8日
    00
  • Node.js API详解之 string_decoder用法实例分析

    好的。先介绍一下如何组织一篇Markdown格式的文章: 标题用#表示,#越多代表标题级别越高。代码块使用“`包裹,可以指定语言类型,例如javascript。引用内容使用>。*开头表示无序列表,数字开头表示有序列表,-开头表示二级无序列表,以此类推。还有其他格式,可以参考Markdown教程。 下面开始具体介绍“Node.js API详解之 str…

    node js 2023年6月8日
    00
  • webpack打包nodejs项目的方法

    下面是关于“webpack打包nodejs项目的方法”的完整攻略,并提供两个示例说明: 前置知识 在学习本文之前,您需要了解以下基本知识: Node.js基础知识 webpack基础知识 步骤 下面介绍如何使用webpack打包一个nodejs项目,步骤如下: 1. 创建项目 首先,需要创建一个基本的Node.js项目。可以运行以下命令在本地环境中创建一个简…

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

    当需要在文件末尾添加新的内容时,可以使用Node.js内置的fs模块中的appendFile()方法。下面是此方法的使用说明: 使用方法 首先需要引入fs模块,然后使用appendFile()方法。 const fs = require(‘fs’); fs.appendFile(‘文件路径’, ‘要追加的内容’, (error) => { if (er…

    node js 2023年6月8日
    00
  • JS中promise化微信小程序api

    下面是详细讲解 “JS中promise化微信小程序api” 的完整攻略。 什么是Promise Promise是es6中新增加的跟异步有关的特性,用于异步操作的管理。使用Promise后,我们可以像同步代码一样来操作异步代码,从而更好的管理异步代码。 在我们使用异步的时候,通常会遇到一些棘手的问题,例如: 回调地狱 (callback hell) 共享作用域…

    node js 2023年6月8日
    00
  • Nodejs获取网络数据并生成Excel表格

    标题:Nodejs获取网络数据并生成Excel表格 1. 介绍 Nodejs是一门基于JavaScript语法的运行时环境或平台,它可以帮助我们开发高效、可扩展的网络应用程序。在本文中,我们将会学习如何使用Nodejs来获取网络数据,并将数据生成Excel表格。 2. 安装依赖包 使用Nodejs获取网络数据并生成Excel表格,我们需要安装以下依赖包: r…

    node js 2023年6月8日
    00
  • Node.js服务端实战之服务启动过程详解

    当我们启动一个Node.js的服务端应用程序时,其实是在服务器上启动了一个Node.js进程。我们接下来的过程就是对这个进程的启动过程进行详细的分析。 1. Node.js 进程运行环境 在启动 Node.js 进程之前,需要先对运行环境进行设置和检查。Node.js 进程的运行环境主要包括以下几方面: 操作系统版本 CPU 架构 Node.js 版本 可以…

    node js 2023年6月8日
    00
  • JavaScript树结构深度优先算法

    让我来为你详细讲解JavaScript的树结构深度优先算法,树结构深度优先算法又被称为DFS算法。 什么是树结构深度优先算法? 树结构深度优先算法指的是通过优先遍历一棵树或图的深层次节点来查找目标值的一种算法。这种算法主要基于递归的方式,遍历整棵树并递归进入每一个子节点。如果找到目标值,则停止搜索并返回结果,否则递归回溯到上一层节点继续搜索。 实现步骤 创建…

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