`

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添加`module.exports`编译代码-JavaScript开发

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

    详解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笔记第一天

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

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

    因为是做前端的,对node的生态一直也比较关注,对于node中对commonJS模块化的实现给了我们很大的方便,之前对于导出的module.exports和exports一直模模糊糊,今天做一个整理 先来个js基础部分的复习 let obj1 = {} let...

    斗鱼制动发言的

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

    commonjs-to-es-module-codemod:Codemod将CommonJS(requireexports)转换为JavaScriptTypeScript的ES Modules(importexport)

    commonjs-to-es-module-codemod jscodeshift codemod将CommonJS(require / exports)转换为ES Modules(import / export)用于JavaScript / TypeScript 支持 出口产品 命名为export: module.exports.foo = foo以...

    NodeJS模块与ES6模块系统语法及注意点详解

    社区模块规范: 1.CommonJS规范 规范实现者: NodeJS 服务端 Browserify 浏览器 2.AMD规范 全称 异步模块定义 ...1.module.exports实质上是一个对象,最后模块导出的对象就是这个引用指向的对象 module

    ES6与CommonJS中的模块处理的区别

    ES6和CommonJS都有自己的一套处理模块化代码的措施,即JS文件之间的相互引用。 为了方便两种方式的测试,使用nodejs的环境进行测试 CommonJS的模块处理 使用require来引入其他模块的代码,使用module.exports来引出 ...

    node-modules-commonjs-08

    ### module.exports最初,你的模块将有一个对象两个名字: module.exports和exports 。 按照惯例,出于实际原因,导出是通过以下两种方式之一完成的: 为exports分配属性: exports.property = value; 覆盖module...

    webpack-custom-water:自来水项目的webpack

    webpack custom babelrc .babelrc配置 主要有 对 预设presets 和插件 plugins 进行配置 presets 创建预设 早起有很多插件 check-es2015-...modules 默认false commonjs规范 就是 module.exports targets 内 bor

    commonjs.html

    common 中 export module.exports import export default的用法

    mt-module:基本的 requiremodule.exports 风格的模块加载器

    它允许您使用 Commonjs/NodeJS 风格的“require()”来处理客户端项目中的依赖项,而无需编译任何东西。 用法非常简单:只需将其包含在您的 HTML 文件中,并将其指向您的 Entry-JS 文件,如下所示: [removed]...

    commonjs-vs-module:两种导入类型的比较

    CommonJS vs模块比较该存储库显示CommonJS( require , module.exports )和Module( import , export )节点实现之间的区别。 普通JS 模块观察与恢复即使代码是相同的,唯一的不同是导入,代码执行的顺序也大不...

    ish:将脚本注入节点 REPL

    是的 全局安装 npm i -g ish选择一些文件,运行它们,并将它们的module.exports属性注入到新 REPL 的全局范围中。 根据调用者是bin/ish还是其他脚本,在正确解析文件路径方面可能存在一些挥之不去的边缘情况。 给定...

    spark-md5.js

    module.exports = factory(); } else if (typeof define === 'function' && define.amd) { // AMD define(factory); } else { // Browser globals (with support for web workers) var glob; try { glob =...

    详谈js模块化规范

    1. CommonJS 用于服务端模块化编程,比如nodejs就采用此规范; 一个文件就是一个模块,require方法用来加载模块,该方法读取一个文件并执行,最后返回文件内部的module.exports对象; require是默认读取.js文件的,...

    js.rar(react初学者简单测试用babel.js,react-development.js,react-dom.js)

    function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Babel=t():e.Babel=t()}(this,...

    Twlig#issuesBlog#87_require和import的区别1

    require和import的区别require和import的区别导入require 导出 exports/module.exports 是 CommonJS

    joye61#typescript-tutorial#CommonJS兼容模块1

    语法扩展在 Nodejs(CommonJS)中导出模块,只需要将导出对象赋值给 module.exports 即可,而 TypeScript 的模块系统采用的是

Global site tag (gtag.js) - Google Analytics