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

require和ES6的区别import

时间:2023-04-03 18:49:53 Node.js

js在模块化的过程中,出现了很多模块化的解决方案,比如commonjs,requirejs(AMD),CMD。随着ES6标准的发布,import/export规范也被广泛使用。只是浏览器支持度不高,需要配合转码工具使用。ES6的模块化和之前社区的commonjs模块化有什么区别?Commonjs的require和module.exportsrequire是函数,动态加载,所以1.require是运行时导入的,理论上在任何地方都可以调用require来导入模块;2.require()路径可以是表达式:require('/app'+'/index');3.require导出module.exports对象4.exports是对module.exports的引用,当module.exports指向变化时,exports导出会出问题require返回对应模块.exports对象的浅拷贝1.如果是module.exports中基本类型的值,会得到一个值2的副本。如果是module.exports中object类型的值,会得到引用ES6import和exportimport决定import在编译时1.路径只能是字符串常量2.import会被提升到文件顶部3.import变量是只读的importimport是值引用,不是值拷贝1.模块内部值的变化会对应到影响引用的地方2.import和export需要有一对一的映射关系,类似于解构赋值。代码解释了两者的区别Commonjs//a.jsleta=0;constcount=()=>{a++;}setTimeout(function(){a++;console.log('inmoduletheais'+a);},500);module.exports={a,count,};//b.jsletfoo=require('a.js');foo.count();setTimeout(function(){console.log('要求a是'+foo.a);},1000);//output//模块中a为2//require中a为0因为foo是浅拷贝,所以a是requireimport时,export中a的值;而count是一个函数,foo.count是这个函数的引用,所以调用的范围和声明的地方是一样的,即它修改的a在exports里,而不是foo里。A。Es6模块//a.jsleta=0;constcount=()=>{a++;}setTimeout(function(){a++;console.log('inmoduletheais'+a);},500);export{a,count,};//b.jsimport{a,count}from'a.js';count();setTimeout(function(){console.log('inrequiretheais'+a);},1000);//Output//在模块中a为2//在require中a为2可以看出一个很重要的区别就是一个基础值是否会同步变化,