前言难得有时间,今天又要开始学习node编程了。但是看到了使用require导入模块的方式,然后想到了我们ES6的各种exports和exportdefaults。阿喜,脑袋变大了……脑袋完了,我们先坐下来处理一下它们的使用范围。require:importnode和es6都支持export/import:onlyexportes6supportedimportmodule.exports/exports:onlyexportsupportedbynode从这一刻起,我觉得是时候理清它们之间的关系了,不然我就在混乱中死去。话不多说,让我们开始吧!!节点模块Node中的模块系统遵循CommonJS规范。那么问题又来了,CommonJS规范是什么?因为之前js比较混乱,每段代码都是单独写的,没有模块的概念,而这个规范其实就是一个模块的定义。CommonJS定义的模块分为:模块标识(module)、模块定义(exports)、模块引用(require)首先解释一下exports和module.exports当一个节点执行一个文件时,会在其中生成一个exports和module对象file,并且该模块具有exports属性。它们之间的关系如下图所示,它们都指向一个{}内存区域。exports=module.exports={};那我们来看看代码吧。//utils.jsleta=100;console.log(module.exports);//可以打印的结果是:{}console.log(exports);//可以打印的结果是:{}exports.a=200;//这里辛辛苦苦把module.exports的内容改成{a:200}exports='指向其他内存区';//这里指向exports//test.jsvara=require('/utils');console.log(a)//打印为{a:200}从上面我们可以看出require导出的内容是实际上是module.exports指向的内存块的内容,不是exports。简而言之,它们的区别在于exports只是对module.exports的引用,用于辅助后者添加内容。用大白话来说,exports只是辅助module.exports对内存中的数据进行操作。数据上各种辛苦,累死了。最后,真正需要的内容还是module.exports。这真的很辛苦。.其实如果用内存块的概念来理解,就很清楚了。然后,为了避免混淆,尽量使用module.exports导出,再使用require导入。ES中的模块导出和导入说实话,ES中的模块是很清晰的。但是,有一些细节需要澄清。比如export和exportdefault,还有import的时候importafrom..,import{a}from..反正有点乱,下面开始整理。export和exportdefault首先说说这两个export。接下来,我们就来说说它们的区别。export和exportdefault都可以用来导出常量、函数、文件、模块等,在一个文件或模块中,可以有多个导出和导入。exportdefault只能通过export方法导出,导入时要加上{},exportdefault可以不用export直接导出变量表达式,exportdefault不能。下面看代码验证testEs6Export.js'usestrict'//exportvariableexportconsta='100';//导出方法exportconstdogSay=function(){console.log('wangwang');}//导出方法第二个函数catSay(){console.log('miaomiao');}export{catSay};//导出默认值exportconstm=100;exportdefaultm;//exportdefaultconstm=100;//这里不能写这种格式。index.js//index.js'usestrict'varexpress=require('express');varrouter=express.Router();import{dogSay,catSay}from'./testEs6Export';//导出的导出方法importmfrom'./testEs6Export';//exportexportdefaultimport*astestModulefrom'./testEs6Export';//作为对象导出的集合/*获取主页。*/router.get('/',function(req,res,next){dogSay();catSay();console.log(m);testModule.dogSay();console.log(testModule.m);//undefined,因为asexport是将散乱的聚集在一起导出为一个对象,而exportdefault是作为默认属性导出的console.log(testModule.default);//100res.send('恭喜,验证成功');});module.exports=路由器;从上面可以看出,确实感觉ES6的模块体系非常灵活。代码地址GitHub:https://github.com/XuXiaoGH/e...参考资料1.老树萌芽,ES6下使用Express2.exports和module.exports的区别3.module.exports和exports,export和export的默认的关系是得益于这三位前辈的分享。写在最后。如果文章对您有帮助,不妨点赞或收藏。这将是支持我继续写作的动力。感谢你们。
