当前位置: 首页 > 后端技术 > Node.js

需要-导出和导入-导出之间有什么区别??

时间:2023-04-03 22:59:06 Node.js

历史背景require/exports来自野外规范,即这些规范是JavaScript社区的开发者起草的规则,已经被大家认可并广泛使用,如CommonJS、AMD、CMD等。Node遵循CommonJS规范,requireJS遵循AMD,seaJS遵循CMD。因为Node并不能直接兼容ES6语法,所以现阶段require/exports还是很有必要和必要的。import/export来源于ES6的新规范,即TC39制定的新ECMAScript版本。babel诞生后,可以将宿主环境(各大浏览器,Node)还没有直接支持的ES6语法编译成ES5,也就是可以将ES6Module的import/export编译成require/exports通用JS。写法上的差异require/exports/*export*/exports.fs=fs;//单个特征导出,可以导出多个模块。exports=fs;//整个模块导出,每个模块只包含一个/*import*/constfs=require('fs');//导入整个模块import/export/*export*/exportdefaultfs;//默认导出每个模块包含一个,每次导出都会覆盖之前的导出exportconstfs;//导出单个特征每个模块包含多个导出函数readFile;//导出单个特征每个模块包含多个export{readFile,read};//导出列表export*from'fs';//导出模块集合/*import*/importfsfrom'fs';//导入整个模块的内容import'/fs.js';//只为副作用导入模块,不导入模块中的任何接口import*asfsfrom'fs';//引入整个模块的内容import{readFile}from'fs';//引入单个readFile接口import{readFileasread}from'fs';//在模块中引入读取接口,重命名为readFileimportfs,{readFile}from'fs';//导入整个模块的内容和readFile接口输出的区别require/exportsrequire/exports输出的是一个值的副本,即当你导入一个值时,模块内部的变化不会影响这个价值。//test.jsletnum=0;functionaddNum(){num++;};module.exports={num:num,addNum:addNum}//main.jsconsttest=require('./test.js');console.log(测试.num);//输出:0test.addNum();console.log(test.num);//output:0import/exportimport/export输出值的索引,也就是说引用其实是动态引用,不缓存值。当模块更改时,您导入的值也会相应更新。//test.jsexportletnum=0;exportfunctionaddNum(){num++;};//main.jsimport{num,addNum}from'./test.js';控制台日志(数量);//输出:0addNum();console.log(num);//output:1加载差异require/exportsCommonJS模块在运行时加载。因为CommonJS模块加载了一个对象,也就是module.exports属性,这个对象是在脚本运行后才生成的,所以在编译的时候没办法做“静态优化”。const{test1,test2,test3}=require('test');/*等同于*/const_test=require('test');//本质上是加载整个模块,然后从中读取三个方法consttest1=_test.test1;consttest2=_test.test2;consttest3=_test.test3;import/exportES6模块是编译时的输出接口。ES6模块不是对象。它的对外接口只是一个静态定义,会在静态代码解析阶段生成,因此比CommonJS模块加载效率更高。从“测试”导入{测试1、测试2、测试3};//只从模块中加载这三个方法,其他不加载异步差异。require/exportsCommonJS模块中的require是同步加载模块。import/exportES6模块的导入命令是异步加载的,模块依赖有一个独立的解析阶段。