本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规。大家都是程序员,不要闹得不开心。

commonjs这种模块化编程方案实际存在着一些困惑,苏南大叔在本文中说说第一个困惑,那就是:在commonjs模块的代码里面,用什么语句导出呢?答案是module.exportsexports,为啥有两个答案,哪一个更好呢?这个就是本文要讨论的方案。

苏南大叔:Commonjs困惑一:使用module.exports还是exports? - module-exports
Commonjs困惑一:使用module.exports还是exports?(图4-1)

本文测试环境:node@14.16.0。本文的结论是,使用module.exports,而不要使用exports。如果你想知道理由,就继续往下听苏南大叔的描述。

基本姿势

从上一篇文章可以看出,commonjs模块化方案中,存在着如下两种写法:

exports.name = "sunan";
exports.getAge = function(){
    return 18;
}

苏南大叔:Commonjs困惑一:使用module.exports还是exports? - commonjs-exports
Commonjs困惑一:使用module.exports还是exports?(图4-2)

module.exports={
    name:"sunan",
    getAge:function(){
        return 18;
    }
}

苏南大叔:Commonjs困惑一:使用module.exports还是exports? - commonjs-module-exports
Commonjs困惑一:使用module.exports还是exports?(图4-3)

在理解上, 就可以认为有一句隐藏的语句,将module.exportsexports画上等号。

exports = module.exports = {};

在最终的导出生效上,还是认定为module.exports有效,exports只是一个更加简单的写法,一个快捷方式罢了。

问题来了

既然,有了隐藏语句exports = module.exports = {};。但是下面的写法,导出是失效的:

exports = {
    name: "sunan",
    getAge: function () {
        return 18;
    }
}

同样是exports,可见:用exports去“点.”操作,在对象上挂个新属性,是可以的。但是用“等号=”操作是不行的,因为这个是赋予新的值了。(自己脑补好了...)

苏南大叔:Commonjs困惑一:使用module.exports还是exports? - commonjs-exports-fail
Commonjs困惑一:使用module.exports还是exports?(图4-4)

所以,本篇文章的最终结论是:使用module.exports可以一了百了,简单粗暴有效果。如果使用exports的话,就存在着写错的可能性。至于两者混合使用的话,苏南大叔觉得,还是别给自己找麻烦了。用个module.exports就最好了。

相关链接

总结

一句话总结,commonjs使用module.exports导出,尽量不要使用exports导出!
更多commonjs文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。