`

Commonjs规范中module.exports和exports的区别

阅读更多

经常能看到两种导出模块的方式:module.exports和exports。
穿插一个必备小知识:在文件a.js中用exports或module.exports导出的对象(方法、变量),可以在另一个文件b.js中通过require('./a')引用。

module和exports是Node.js给每个js文件内置的两个对象。

在node.js中打印console.log(module)可以看出 module 和 exports 都是node中提供的两个对象,其中module里包裹着exports

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '',
  loaded: false,
  children: [],
  paths:[] 
  }
 

实际上这两个对象指向同一块内存。这也就是说module.exports和exports是等价的。如图示:

 
 


例如:

exports.age = 18;
module.exports.age = 18;
 

这两种写法是一致的(都相当于给最初的空对象{}添加了一个属性,通过require得到的就是{age: 18})。

但是这里有个重点,每个导出模块 node.js 默认会返回 return module.exports;

当直接给module.exports或exports赋值时,就相当于改变了内存,两者指代的就不是同一内存,这样就会导致exports中的内容失效,因为module.exports所指向的内存永远是真正的内存

 
 
  • 直接给module.exports赋值导致内存改变,新生成的内存依然是真正的内存,那exports原先指向的内存就无效了

例如:

//song.js
module.exports = {name: '樱花树下'};
exports = {name: '不吐不快'};
//main.js
let song= require('./song');
console.log(song);//输出:{name: '樱花树下'}
  • 直接给exports赋值导致内存改变,那么exports所指的内存就是无效内存,所以会返回module.exports空对象

例如:

//song.js
exports = {name: '不吐不快'};
//main.js
let song= require('./song');
console.log(song);//输出:{}

有一种赋值特殊就是,exports = module.exports 这个用来重新建立引用关系的

就是重新把无效内存指向真正内存 这样 exports 和 module.exports 就重新建立了联系

 

.

分享到:
评论

相关推荐

    为Babel和TypeScript编译的代码添加moduleexports

    Node.js环境中,我们通常使用`module.exports`或`exports`来导出模块中的功能和变量,以便其他模块可以导入并使用。当使用Babel(一个广泛使用的JavaScript转换工具)和TypeScript(一种静态类型强校验的JavaScript...

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

    在Node.js中,模块的导出和导入是通过CommonJS规范实现的,而exports和module.exports则是实现模块导出的关键概念。虽然在日常开发中经常使用这两个概念,但很多开发者可能会忽视它们之间的区别,这可能会在模块的...

    为Babel和TypeScript添加`module.exports`编译代码-JavaScript开发

    plugin为Babel和TypeScript编译的代码添加module.exports当您将ES2015模块与Babel一起使用或在TypeScript中具有默认导出时,它们会生成代码,要求您使用CommonJS中的require('x')。default而不是require来导入它。...

    微信小程序module.exports模块化操作实例浅析

    微信小程序中,module.exports是JavaScript中CommonJS模块化规范的一种实现方式。模块化是将大块的代码分割成可复用的小模块的过程,模块之间相互独立,便于维护和升级。 在微信小程序中,module.exports通常用于...

    package.json中main,module,exports三种方式的使用,自定义入口文件index.js

    对于Vue.js项目,尤其是由`@vue/cli`生成的Vue3项目,`package.json`中的`main`、`module`和`exports`字段用于指定不同环境下的入口文件,这有助于优化加载和打包过程。本文将深入探讨这三种方式的使用以及如何...

    js代码-for exports & module.exports

    `exports`和`module.exports`都是用来导出模块中的变量、函数或对象的,但它们之间存在一些微妙的区别: 1. **exports**: 这是一个快捷方式,它默认指向`module.exports`对象。当你直接修改`exports`时,实际上是在...

    node中modules.exports与exports导出的区别

    Node.js 中的模块导出机制是基于 CommonJS 规范的,主要通过 `module.exports` 和 `exports` 两个对象来实现的。本文将详细介绍 Node.js 中的模块导出机制,包括 `module.exports` 和 `exports` 的区别、使用场景和...

    浅谈node中的exports与module.exports的关系

    在Node.js环境中,模块系统是基于CommonJS标准构建的,其中`exports`和`module.exports`是两个关键的对象,它们关系密切,用于导出模块中的功能和数据。在这篇文章中,我们将深入探讨这两个对象的区别和如何正确使用...

    详解Sea.js中Module.exports和exports的区别

    因为SeaJs和Nodejs都是基于CommonJS,所以直接看的Node的官方文档解释 Module.exports The module.exports object is created by the Module system. Sometimes this is not acceptable; many want their module to ...

    uncommonjs:Module.exports的最小可行填充程序

    UnCommonJS要求要求出口默认洞穴范围发展兼容性也可以看看版本作者版权和许可 名称UnCommonJS-module.exports的最小可行填充module.exports 特征module.exports exports 可插拔的require 支持实时导出(ESM仿真) ...

    node.js module

    7. **`exports` 与 `module.exports` 的区别**:虽然通常情况下两者可以互换使用,但当需要导出一个完整的对象或函数时,应优先使用 `module.exports`。因为如果 `exports` 被赋值为一个新对象,原来的 `module....

    ES6第四天.xmind

    1.CommonJS 规范:Node.js 遵循 CommonJS 模块规范,该规范定义了如何在服务器环境中实现模块化,包括如何定义模块、如何引入和使用模块。 2.模块的定义:每个文件都是一个模块,模块内部定义的变量和函数默认情况...

    module.js

    `module.js`是Node.js实现这一规范的关键组件,它定义了如何加载、导出和导入模块。 二、模块加载机制 1. 文件查找:Node.js遵循一定的路径规则来查找模块。首先,它会检查当前目录下的`node_modules`文件夹,然后...

    01CommonJS.rar

    CommonJS是Node.js中实现模块化开发的重要规范,它允许我们在JavaScript中导入和导出模块,使得代码结构清晰、可复用性增强。本文将深入探讨CommonJS的基本概念、使用方法以及通过一个模拟扑克牌发牌的小例子来实践...

    node笔记第一天

    nodejs 采用的commonjs模块规范 一个js文件就是一个模块 重点 : 导出 module.exports exports.变量 = 导出的对象 不能让exports直接指向一个对象, 因为,exports 就 不再指向module.exports了, 指向新对象了 ...

    module.zip

    在过去,浏览器环境不直接支持模块化,开发者通常依赖于如AMD(Asynchronous Module Definition)和CommonJS等库,如RequireJS和Browserify。但是随着ES6标准的普及,现代浏览器开始原生支持`import`和`export`,...

    详解Node中导入模块require和import的区别

    在 Node.js 中,我们使用 require 函数和 module.exports 对象来导入和导出模块。在 ES6 中,我们使用 import 语句和 export 语句来导入和导出模块。两种方式有着不同的语法和使用场景,但是它们都可以用来实现模块...

    斗鱼制动发言的

    nodejs 采用的commonjs模块规范 一个js文件就是一个模块 重点 : 导出 module.exports exports.变量 = 导出的对象 不能让exports直接指向一个对象, 因为,exports 就 不再指向module.exports了, 指向新对象了 ...

    Nodejs中的require函数的具体使用方法

    关于模块导出,Node.js 使用两种主要的方法来导出模块功能:module.exports 和 exports。module.exports 对象由每个模块创建,用于定义该模块对外暴露的功能。通过向 module.exports 对象添加属性,可以将函数、对象...

Global site tag (gtag.js) - Google Analytics