javascriptexportsmodule.exports和exportexportdefault到底是咋回事JS那些事儿

头大完了,那我们坐下先理理他们的使用范围。

require:node和es6都支持的引入export/import:只有es6支持的导出引入module.exports/exports:只有node支持的导出

这一刻起,我觉得是时候要把它们之间的关系都给捋清楚了,不然我得混乱死。话不多少,咱们开干!!

Node里面的模块系统遵循的是CommonJS规范。那问题又来了,什么是CommonJS规范呢?由于js以前比较混乱,各写各的代码,没有一个模块的概念,而这个规范出来其实就是对模块的一个定义。

CommonJS定义的模块分为:模块标识(module)、模块定义(exports)、模块引用(require)

先解释exports和module.exports在一个node执行一个文件时,会给这个文件内生成一个exports和module对象,而module又有一个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操作内存中的数据,辛辛苦苦各种操作数据完,累得要死,结果到最后真正被require出去的内容还是module.exports的,真是好苦逼啊。

其实大家用内存块的概念去理解,就会很清楚了。

然后呢,为了避免糊涂,尽量都用module.exports导出,然后用require导入。

说实话,在es中的模块,就非常清晰了。不过也有一些细节的东西需要搞清楚。比如export和exportdefault,还有导入的时候,importafrom..,import{a}from..,总之也有点乱,那么下面我们就开始把它们捋清楚吧。

首先我们讲这两个导出,下面我们讲讲它们的区别

下面咱们看看代码去验证一下

'usestrict'//导出变量exportconsta='100';//导出方法exportconstdogSay=function(){console.log('wangwang');}//导出方法第二种functioncatSay(){console.log('miaomiao');}export{catSay};//exportdefault导出constm=100;exportdefaultm;//exportdefultconstm=100;//这里不能写这种格式。index.js//index.js'usestrict'varexpress=require('express');varrouter=express.Router();import{dogSay,catSay}from'./testEs6Export';//导出了export方法importmfrom'./testEs6Export';//导出了exportdefaultimport*astestModulefrom'./testEs6Export';//as集合成对象导出/*GEThomepage.*/router.get('/',function(req,res,next){dogSay();catSay();console.log(m);testModule.dogSay();console.log(testModule.m);//undefined,因为as导出是把零散的export聚集在一起作为一个对象,而exportdefault是导出为default属性。console.log(testModule.default);//100res.send('恭喜你,成功验证');});module.exports=router;

THE END
1.AI区分猫和狗fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(test_cats_dir, fname) shutil.copyfile(src, dst) ? fnames = ['dog.{}.jpg'.format(i) for i in range(1000)] ...https://www.jianshu.com/p/3a2f346156a1
2.dog怎么读(cat怎么读)2、猫的基本解释:猫;猫科动物;恶毒的女人;爵士乐爱好者;把(锚)挂在锚架上;寻欢作乐,苟且偷生...https://edu.iask.sina.com.cn/jy/jm77F5UjCB.html
1.小学英语外研新标准三年级上册Moduleitisablackdog.docxIt is a black dog课型:新授三维目标知识与技能:用its加颜色描述特征,its a xx描述物体。过程与方法:通过颜色的表达,用同样句型描述物品。情感态度价值观:用英语描述各类颜色的物品,体会英语学习的乐趣。教学难点:描述身边颜色,cat cap要正确区分,正确发音。教学难点:its a xx和its an xx的灵活运用。教学资源开...https://m.renrendoc.com/paper/223992770.html
2.英语教案Hello2、 DOG 和小朋友说HAI、 CAT和小朋友说HELLO、RABBIT和小朋友说I’m glad to meet you。 三、出示会走路的蜡笔小新。 1、T:今天我还请了一位神秘的小客人,你们看看是谁来了? S: 蜡笔小新 T:今天小新来到杨山幼儿园小班,它非常高兴,它现在要来找朋友打招呼咯。 https://www.ruiwen.com/yingyujiaoan/5359324.html
3.定义一个基类动物类(animal),并定义三个子类:猫类(cat),狗类(dog...cat = Cat("小猫") dog = Dog("小狗") sheep = Sheep("小羊") cat.eat() dog.eat() sheep.eat() 回答2: 动物类作为基类,是猫类、狗类和羊类的父类,可以在基类上定义共同的属性和方法。这样做可以简化子类的定义,提高代码的重用性。 首先定义基类动物类(animal): ...https://wenku.csdn.net/answer/cdd06bd45542a943cfc9a2ee2861ac42
4.Hello教案2、 DOG 和小朋友说HAI、 CAT和小朋友说HELLO、RABBIT和小朋友说I’m glad to meet you. 三、出示会走路的蜡笔小新。 1、T:今天我还请了一位神秘的`小客人,你们看看是谁来了? S: 蜡笔小新 T:今天小新来到杨山幼儿园小班,它非常高兴,它现在要来找朋友打招呼咯。 https://mip.jy135.com/jiaoan/806546.html
5.springmysql自动装配依赖spring自动装配和依赖注入假如有一个“动物”的接口 IAnimal, DogImpl类实现了接口 IAnimal, 且该接口只有 DogImpl这一个实现类,那么在引用实现类的时候,我们使用的是实现类的接口(像上面程序展示的那样)。Spring会按 byType的方式寻找接口的实现类,将其注入。 假如有另一个实现类 CatImpl 也实现了接口 IAnimal, 这时候再按上面的方式...https://blog.51cto.com/u_16099326/11361165
6.最新英语词汇1.chickenduckpigcowcatdoggoatsheeprabbitdonkey 鸡鸭子猪奶牛猫狗山羊绵羊兔子驴 horsemouse 马老鼠 2.pandamonkeygiraffedeertigerelephantkangaroocamel 熊猫猴子长颈鹿鹿老虎大象袋鼠骆驼wolf(wolves)hippobearostrichlionsnakezebra 狼河马熊鸵鸟狮子蛇斑马 3.beakwingfeathersfurpawtailstripetrunkpouchhump ...https://www.360wenmi.com/f/filetevxxptb.html
7.区分JS中的cat和dog是Animal构造出的实例 cat的__proto__属性指向一个对象,此对象是Animal改变prototype之前的指向。 dog的__proto__属性指向一个对象,此对象是Animal改变prototype之后的指向。和Animal.prototype的指向一致。 通过cat或者dog的__proto__属性,经过层层查找,最终的都会指向同一个对象,即Object.prototype,而Object...https://www.w3cschool.cn/kesyi/kesyi-thfx24rr.html
8.小班学习计划(锦集13篇)2、在教师的带领下,让幼儿了解动物cat 和dog 的英语名称 3、通过活动促进幼儿交往能力与初步的合作能力 二、活动内容 听懂、会说单词cat 和dog 三、活动准备 猫和狗的的卡片、猫与狗的头饰、黑板、录音机等。 四、活动过程 1、用英语问候师:Hello!引导幼儿模仿说“Hello” 师:Ok, I’m Jojo,When I say ...https://www.liuxue86.com/a/4928675.html