module.exports和exports使用误区

本文解析了在Node.js中使用module.exports和exports时常见的四个误区,包括不同情况下的对象指向及属性挂载问题,并强调require获取的是module.exports指向的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

module.exports和exports使用误区

使用require()模块时,得到的永远都是module.exports指向的对象

1.误区一
exports.username = 'zs'
exports.sayHello = function() {
    console.log('Hello!');
}

module.exports = {
    gender: '男',
    age: 20
}

在这里插入图片描述
在这里插入图片描述
因为默认情况下,exports 和 module.exports 指向同一个对象,二者开始都是指向一个空对象,当export指向新对象username="zs"后,此时二者都指向这个对象,但是执行后面代码则是在内存中新开辟一个空间存储新对象 {gender:“男”,age:20} ,且把这个新对象的引用交给了module.exports,则module.exports就指向新的对象,不指向之前的对象了
所以这时候,如果使用require()模块,得到的就是module.exports此时指向的对象

2.误区二
module.exports.username = 'zs'

exports = {
    gender:'男',
    age:22
}

在这里插入图片描述
在这里插入图片描述
exports 和 module.exports 开始指向一个空对象,当module.export指向新对象username="zs"后,此时二者都指向这个对象,但是执行后面代码则是在内存中新开辟一个空间存储新对象 {gender:“男”,age:20} ,且把这个新对象的引用交给了exports,但是module.exports指向对象没有变,还是指向之前的对象
所以使用require()模块时,module.exports指向的对象还是原来的对象

3.误区三
exports.username = 'zs'

module.exports.gender = '男'

在这里插入图片描述
在这里插入图片描述
二者开始指向空对象,第一行代码通过exports引用关系挂载了一个name属性,第二行又通过module.exports引用关系挂载了一个属性age 这里不存在新对象 都是挂载属性 这些属性都被放在了开始二者指向的对象中,最终两个属性都在此对象中
此时使用require()模块时,module.exports指向的对象没有变,但是此时指向对象上有两个属性

4.误区四
exports = {
    uesrname: 'zs',
    gender: '男'
}

module.exports = exports
module.exports.age = 22

在这里插入图片描述
在这里插入图片描述

同理二者开始指向同一空对象,执行代码,在内存中定义了一个新对象,且把新对象挂载在exports上,此时exports就不指向之前的空对象而指向新定义的对象,module.exports=exports这行代码把export的引用关系通过等号赋值给了module.exports,则module.exports也不指向之前的空对象了,也指向新对象了,最后给module.exports指向的新对象又继续挂载了一个age属性
此时使用require()模块时,module.exports指向的对象没有变,但是此时指向对象上有两个属性

谨记,使用require()模块时,得到的永远都是module.exports指向的对象
所以,为了防止这种混乱,以后在一个模块中,不要同时使用exports和module.exports

=> ERROR [vue_app build 6/6] RUN npm run build 8.7s ------ > [vue_app build 6/6] RUN npm run build: 0.579 0.579 > vue_learn@0.0.0 build 0.579 > vue-tsc -b && vite build 0.579 8.514 ▲ [WARNING] The CommonJS "module" variable is treated as a global variable in an ECMAScript module and may not work as expected [commonjs-variable-in-esm] 8.514 8.514 vite.config.ts:32:0: 8.514 32 │ module.exports = { 8.514 ╵ ~~~~~~ 8.514 8.514 This file is considered to be an ECMAScript module because of the "export" keyword here: 8.514 8.514 vite.config.ts:6:0: 8.514 6 │ export default defineConfig({ 8.514 ╵ ~~~~~~ 8.514 8.610 failed to load config from /app/vite.config.ts 8.615 error during build: 8.615 ReferenceError: module is not defined in ES module scope 8.615 at file:///app/node_modules/.vite-temp/vite.config.ts.timestamp-1744012997583-aad75c07ea95a.mjs:34:1 8.615 at ModuleJob.run (node:internal/modules/esm/module_job:193:25) 8.615 at async Promise.all (index 0) 8.615 at async ESMLoader.import (node:internal/modules/esm/loader:530:24) 8.615 at async loadConfigFromBundledFile (file:///app/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:54640:15) 8.615 at async bundleAndLoadConfigFile (file:///app/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:54483:22) 8.615 at async loadConfigFromFile (file:///app/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:54445:44) 8.615 at async resolveConfig (file:///app/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:53944:24) 8.615 at async createBuilder (file:///app/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:51949:18) 8.615 at async CAC.<anonymous> (file:///app/node_modules/vite/dist/node/cli.js:859:23) ------ failed to solve: process "/bin/sh -c npm run build" did not complete successfully: exit code: 1
最新发布
04-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

๑Aurora.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值