概念:module.exports和exports是属于commonJs规范,export和export default是ES6模块规范。
exports 等于 module.exports,相当于在js文高枯件头部,有一个module对象,module.exports = exports;
exports是一个对象,所以可以exports多个值
1、对于要导出的属性,可以简单直接挂到exports对象上
2、对于类,为了直接使导出的内容作为类的构造器可以让调用者使用new *** 作符创建实例对象,应该把构造函数挂到module.exports对象上,不要和导出属性值混在一起
module.exports 初始值为一个空对象 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是戚哪洞 exports
也就是: exports = module.exports = {}, exports和module.exports都指向一个引用地址{},如果exports.name = 'xxx',那module.exports = {name:'xxx'},引用对象改变,两缓祥者又是同时指向一个对象,所以都改变了。
在 import 的时候可以使用 通配符 * 导入外部的模块:
import * as xxx from ‘xxx’: 会将若干export导出的内容组合成一个对象返回;
import xxx from ‘xxx’:(export default Din)只会导出这个默认的对象作为一个对象
以上。
exports和module.exports 都是对外暴露对象接口的,但是使用需要注意以下细节:例如:这是rocker.js文件
在另一个文件中你这样引用
其实, Module.exports 才是真正的接口, exports 只不过是它的一个辅助工具。最终返回给调用的兄团是 Module.exports 而不是 exports 。
注意:
所有的清薯exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。
例如:
会以对象(也可叫字典)输出羡正橘
如果你想在module.js中使用outputA或outputB函数,就得
上面的写法也等同于
exports收集到的属性和方法,并未都赋值给了Module.exports,因为Module.exports已经具备一些属性和方法,因此exports收集来的信息将 被忽略
再次引用执行rocker.js
下面例子中,你的模块是一个类: 想导出的模块为特定的数组类型
可以这样应用它:
下面例子中,你的模块是一个数组: 想导出的模块为特定的数组类型
可以这样应用它
结论: 现在你明白了,如果你 想你的模块是一个特定的类型 就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。
javascript没有模块体系,无法将大程序分拆成互相依赖的小文件,再用简单的方法将它们拼装起来.为了解迹雀空决这个问题,ES6推出了export和export default.
export和export default是es6提出来的,它在编译时就完成模块加载,export命令可以出现在模块的任何位置,只要处于模块顶层即可,如果处于块级作用域就会报错,import也是如此.
从上面图片我们可以看出export后面必须跟变量名和值,可以直接声明或写在一个对象中,都会以键值对的形式导出数据.
以上五种写法都可以,export default后面只能跟值.
总结:export后面必须有变量名和值,导出的数据是键值对形式,而export default后面只能是值,因为它岁核已经有变量名default
require和module.exports是CommonJS规范,它是在运行时加载,就是说运行时才能得到这个对象,module.exports后面跟的值和export default一样
以上五种写法都可以
module.export可以用import来引入,后面可以跟大括号或不跟,跟的话相当于解构赋值,不跟就是整体引入,export也可以用require来引入.require('path.js')或import('path.js')都表示执行这个模块,不会返回值.
export一般导出方法,引入的时候使用大括号按需引入你需要的方法,export default导出对象或数组,比如接口api对象,routes路由数组,但是引入的时候会整体引入,module.exports一般导出对象,可以用import或require整体引入或按需引入,这样子比较灵活,所以姿瞎module.exports和import使用的场景也挺多的,import只能写在js文件顶部,但是require可以写在任何地方,所以要根据场景不同使用不同方法.
总结:export后面跟变量名和值,import后面是{}或* as 变量名,export default后面跟值,import后面没有{},module.exports后面和export default一样都是值,require后面有{}表示解构赋值,没有表示整体引入,import和require都可以引入export和module.exports,import只能写在js文件顶部,但是require可以写在任何地方.CommonJS模块输出是一个值的拷贝,ES6模块输出是值的引用.CommonJS模块是运行时加载,ES6模块是编译时输出接口.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)