Node.js中module.exports 和exports使用误区

目录
  • 一、module,module.exports ,exports含义
  • 二.案例
    • 案例一:
    • 案例二
    • 案例三
    • 案例四

一、module,module.exports ,exports含义

  • module对象:在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息
  • module.exports 对象:在node里自定义的模块中,可以使用 module.exports 对象,将自定义的模块内部分的成员共享出去被使用。
  • 当外界(其他js文件)用require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象
  • exports对象:由于 module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了 exports 对象。默认情况下,exports 和 module.exports 指向同一个对象

注意:使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准
换句话说最终共享的结果,还是以 module.exports 指向的对象为准

二.案例

通过案例来理解二者的关系

案例一:

定义代码

//文件名:01.module.exports和exports误区
exports.name="小吴"
module.exports ={
    性别:"男",
    age:18

}

输出代码

//文件名:01-test
//为了测试module.exports ,exports指向结果 案例二三四的输出代码都是此js代码文件
const obj=require("./01.module.exports和exports误区")
console.log(obj);

输出结果

案例一解释:因为默认情况下,exports 和 module.exports 指向同一个对象,所以开始二者都是指向一个空对象,当export指向新对象name="小吴"后,此时二者都指向这个对象,但是执行后面代码则是在内存中新开辟一个空间存储新对象 {性别:“男”,age:18} ,且把这个新对象的引用交给了module.exports,则module.exports就指向新的对象,不指向之前的空对象了,而且由于最终共享的结果,以module.exports 指向的对象为准,所以案例输出如上图所示

案例二

定义代码

module.exports.name="小吴"
exports ={
    性别:"男",
    age:18

}

输出结果

案例二解释:同理当module.exports指向对象name="小吴"后,执行后面代码,,exports指向新对象{性别:“男”,age:18},由于最终共享的结果,还是以 module.exports 指向的对象为准
所以案例输出如上图所示

案例三

定义代码

exports.name="小吴"
module.exports.age=18

输出结果

案例三解释:同理二者开始指向空对象,第一行代码通过exports引用关系挂载了一个name属性,第二行又通过module.exports引用关系挂载了一个属性age 这里不存在新对象 都是挂载属性 这些属性都被放在了开始二者指向的空对象中,则最终两个属性都在此对象中,且module.exports指向这个对象,所以最终结果输出如上图所示

案例四

定义代码

exports={
    性别:"男",
    name:"小吴",

}
module.exports=exports//把export的引用关系通过等号赋值给了module.exports
module.exports.age=18

输出结果

案例四解释:同理二者开始指向同一空对象,执行代码,在内存中定义了一个新对象,且把新对象挂载在exports上,此时exports就不指向之前的空对象而指向新定义的对象,module.exports=exports这行代码把export的引用关系通过等号赋值给了module.exports,则module.exports也不指向之前的空对象了,也指向新对象了,最后给module.exports指向的新对象又继续挂载了一个age属性,所以里面的所有属性都被module.exports指向到的,所以最终结果输出如图所示

重要注意:为了防止二者指向混乱,建议不要在同一个模块中同时使用 exports 和 module.exports

到此这篇关于Node.js中module.exports 和exports使用误区的文章就介绍到这了,更多相关Node.js module.exports和exports内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • node.js中module.exports与exports用法上的区别

    Node.js 引入了模块(Module)概念,一个模块可以通过module.exports 或 exports 将函数.变量等导出,以使其它 JavaScript 脚本通过require() 函数引入并使用. module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {},exports 是指向的 module.exports 的引用,在模块内部大概是这样: exports = module.exports = {}; 举个栗子,在node.js中创建模块非常简

  • node.js的exports、module.exports与ES6的export、export default深入详解

    前言 最近难得有空,决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那我们坐下先理理他们的使用范围. require: node 和 es6 都支持的引入 export / import : 只有es6 支持的导出引入 module.exports / exports: 只有 node 支持的导出 这一刻起,我觉得是时候要把它们之间的关系都给捋清楚了,不

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

    今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了. 我们知道,node.js的模块暴露有两种方法. 1. 方式一:用exports //a.js exports.log =function (str) { console.log(str); } //b.js var s = require("./a"); s.log("哈哈哈哈"); 2. 方式二:用module.exports //a.js mod

  • Node.js 中exports 和 module.exports 的区别

    Node.js 中exports 和 module.exports 的区别 require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 exports 和 module.exports 的关系,我们先来巩固下 js 的基础.示例: test.js var a = {name: 1}; var b = a; console.log(a); console.log

  • Node.js中module.exports 和exports使用误区

    目录 一.module,module.exports ,exports含义 二.案例 案例一: 案例二 案例三 案例四 一.module,module.exports ,exports含义 module对象:在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息 module.exports 对象:在node里自定义的模块中,可以使用 module.exports 对象,将自定义的模块内部分的成员共享出去被使用. 当外界(其他js文件)用require() 方

  • node.js中module模块的功能理解与用法实例分析

    本文实例讲述了node.js中module模块的功能理解与用法.分享给大家供大家参考,具体如下: node.js中使用CommonJS规范实现模块功能,一个单独的文件就是一个单独的模块.通过require方法实现模块间的依赖管理. 通过require加载模块,是同步操作. 加载流程如下: 1.找到需要加载的模块文件. 2.判断是否缓存过,如果没有,则读取模块文件的内容. 3.把读取到的内容,封装在一个函数里运行. (function (exports, require, module, __fi

  • Node.js中对通用模块的封装方法

    在Node.js中对模块载入和执行进行了包装,使得模块文件中的变量在一个闭包中,不会污染全局变量,和他人冲突. 前端模块通常是我们开发人员为了避免和他人冲突才把模块代码放置在一个闭包中. 如何封装Node.js和前端通用的模块,我们可以参考Underscore.js 实现,他就是一个Node.js和前端通用的功能函数模块,查看代码: 复制代码 代码如下: // Create a safe reference to the Underscore object for use below.  var

  • Node.js中路径处理模块path详解

    前言 在node.js中,提供了一个path某块,在这个模块中,提供了许多使用的,可被用来处理与转换路径的方法与属性,将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了.下面我们就来详细介绍下关于Node.js中的路径处理模块path. 获取路径/文件名/扩展名 获取路径:path.dirname(filepath) 获取文件名:path.basename(filepath) 获取扩展名:path.extname(filepath) 获取所在路径 例子如下: var path = re

  • 深入理解Node.js中通用基础设计模式

    谈到设计模式,你可能会想到 singletons, observers(观察者) 或 factories(工厂方法).本文不并专门探讨他们.只是探讨Node.JS一些基础模式的实现,像依赖注入或中间件. 什么是设计模式? 设计模式是用来解决一般的,普遍发生的问题,且可重复使用的解决方案. Singletons (单例) Singletons模式限制了"类",只有一个实例.在Node.js的创建单例是非常简单的,比如下面这个require. //area.js var PI = Math

  • 在 Node.js 中使用原生 ES 模块方法解析

    从版本 8.5.0 开始,Node.js 开始支持原生 ES 模块,可以通过命令行选项打开该功能.新功能很大程度上得归功于 Bradley Farias. 1.演示 这个示例的代码目录结构如下: esm-demo/ lib.mjs main.mjs lib.mjs: export function add(x, y) { return x + y; } main.mjs: import {add} from './lib.mjs'; console.log('Result: '+add(2, 3

  • 浅析Node.js中使用依赖注入的相关问题及解决方法

    最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试.然而,Node.js中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使用.一般的依赖注入很难在这种情况下使用,但现在不要放弃希望. requireCauses 问题 Node.js很容易依照需求导入依赖.它运行的很好,并且比AMD模式加载器例如RequireJS要简单.当我们模拟那些依赖的时候问题就来了.如果Node.js中模型的加载是受控的,我们怎么做才能控制让伪对象在测试期间被使用到?我们可以使用Node的vm

  • node.js中的require使用详解

    代码注释里已经描述的非常的清晰,这里就不多废话了,直接奉上代码: 复制代码 代码如下: /*在node中,可以使用require()函数来加载模块.  * require函数使用一个参数,参数值可以带有完整路径的模块的文件名,也可以为模块名.当使用node中提供的模块时,在require函数中只需要指定模块名即可.  * */ //建立一个页面2.js;代码如下 var name="思思博士"; exports.name=name; //建立一个页面1.js;代码如下 var two=

随机推荐