module.exports 和 exports的区别

112 阅读1分钟

简而言之require只能看到module.exports这个对象,它是看不到exports对象的,而我们在编写模块时用到的exports对象实际上只是对module.exports的引用

    console.log(exports === module.exports); // 结果为 true。这说明二者是一样的,指向同一个空对象 {}。

不具名数据

假设我作为模块使用者,要在我的代码中引入入一个函数:

    const func = require('./module');

则编写者只能使用 module.exports 来定义:

    module.exports = function () {}

如果编写者使用 exports 来定义:

    exports.func = function () {}

则使用者必须知道该函数的名称才能使用:

    const { func } = require('./module');

注意

module.exports 与 exports 指向同一个空对象 {} => 暂时叫他 X 也就是说,不管是 exports.name = '小明' 还是 module.exports.name = '小明',都是在操作 X 对象,对象是可变的,可以任意修改(比如基本类型)

因此我们可以直接给 exports 赋值:

    exports = '小明';

但这时,exports 就失去存在意义了。因为赋值以后,它不再指向对象 X,require只能看到 X 这个对象,上面写法也就无法操作 X 对象了,给 module.exports 赋值对象以外的值呢?

    module.exports = '小明';

这是没问题的,这说明模块默认导出一个基本类型,而不是 M 对象。

在 Node.js 模块里,真正控制模块导出的是 module.exports,exports 只是 module.exports 决定导出一个对象时的一个快捷方式