看一次忘一次,记一次乱一次的exports、module.exports、export和export.default。
require:node和es6都支持的引入;
export/import:仅es6支持的导出引入;
module.exports/exports:仅node支持的导出。
exports和module.exports:
在一个node执行一个文件时,会给这个文件内生成一个 exports和module对象,
而module又有一个exports属性。他们之间的关系都指向一块{}内存区域。
exports = module.exports = {};
exprots.a=200时,module.exports对象内容同步发生改变。而exports=value时,exports变量的引用,并没有改变module.exports的内容
可以看出,require导出的内容是module.exports的指向的内存块内容,并不是exports的。即exports其实是module.exports对象的一个引用。为了避免糊涂,尽量都用 module.exports 导出,然后用require导入。(用内存块概念理解)
export 和 export default区别:
1、export与export default均可用于导出常量、函数、文件、模块等
2、在一个文件或模块中,export、import可以有多个,export default仅有一个
3、通过export方式导出,在导入时要加{ },export default则不需要
4、export能直接导出变量表达式,export default不行。
str变量无法被外部识别,其本质相当于为变量str起了一个系统默认的变量名default,自然default只能有一个值,所以一个文件内不能有多个export default。
使用export default命令,为模块指定默认输出,这样就不需要知道所要加载模块的变量名。
本质上,a.js文件的exportdefault输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含。