exports、module.exports 和 export 、 export default的差异

    科技2025-06-09  25

    一、使用范围

    require  : node支持引入

    export/import : 只有es6支持的导出/引入

    module.export / exports : 只有node支持的导出

     

    二、node模块

    Node 里面的模块系统遵循的是CommonJs规范,commonJs定义的模块分为:模块标识(module)、模块定义(exports)、模块引用(require)

    exports和module.exports在一个node执行一个文件时,会给这个文件生成一个exports和module对象,而module又有一个exports属性。他们之间的关系如下图,都指向一个块{}内存区域。

    exports = module.exports = {};

    //utils.js let a = 100; console.log(module.exports); //能打印出结果为:{} console.log(exports); //能打印出结果为:{} exports.a = 200; //这里辛苦劳作帮 module.exports 的内容给改成 {a : 200} exports = '指向其他内存区'; //这里把exports的指向指走 //test.js var a = require('/utils'); console.log(a) // 打印为 {a : 200}

    从上面可以看出,其实require导出的内容是module.exports的指向的内存块内容,并不是exports的。 简而言之,区分他们之间的区别就是 exports 只是 module.exports的引用,辅助后者添加内容用的。

     

    三、es6 export和export default的区别

    1.export和export default 都可以导出 常量、函数、模块、文件。

    2.export default在一个模块中只能有一个,export可以有多个

    3.export 导出的内容需要包再{}中接收,export default则不需要

    4.模块中通过export 导出的(属性或者方法)可以修改,但是通过export default导出的不可以修改。

    //model.js let e1='export 1'; let e2='export 2'; export {e2}; export default e1; e1='export 1 modified'; e2='export 2 modified'; //index.js import e1, {e2}from "./model"; console.log(e1); console.log(e2); #index.js执行结果 export 1 export 2 modified

    tips:

    a.es6中模块通过export 和 export default 暴露出来的属性或者方式并不是普通的赋值或者引用,他们是对模块内部定义的标识符类似指针的绑定。

    b.对于一个导出的属性或者方法,在什么地方导出不重要,在什么时候导入也不重要,重要的是:访问这个绑定的时候的当前值。

     

    Processed: 0.009, SQL: 8