美文网首页
认清module.exports与exports、export与

认清module.exports与exports、export与

作者: Jinxhao18 | 来源:发表于2018-12-12 17:25 被阅读0次

    写在前面
    先分清CommonJs模块规范和ES6模块规范是两码事,module.exports和exports属于commonjs规范,es6使用import和export来导入导出模块。

    CommonJS ES6
    module.exports --- exports export---export default

    module.exports && exports

    Node由模块组成,采用CommonJS模块规范。

    根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。
    CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

    //导出
      module.exports.path=something;
      module.exports=something;
    //导入
      const path = require('path');//加载node的path模块
    

    为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令:

      let exports = module.exports;
    

    所以在node.js中,如果引入模块直接通过require方式引入,问题是这种方式其实是在运行时加载相应模块整体,哪怕前面只引用了其中一个方法

      const {join,basename} = require ('path');  
    /*require后的路径如果为/开头,为绝对路径 ./为相对路径
     字符串表示为node核心模块,已经局部安装或者全局安装*/
    //运行时相当于
    const _path = require('path');  //将整个path模块赋给_path对象
    const join = _path.join;
    const basename = _path.basename;
    

    因为这个对象只在程序运行时才加载生成新对象,这种加载被称为“运行时加载”,没办法再编译时做静态优化。

    export && export default

    import导入模块,export导出模块,export default默认输出
    export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系,不能直接输出常量

    • export与export default均可用于导出常量、函数、文件、模块等
    • 你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用
    • 在一个文件或模块中,export、import可以有多个,export default仅有一个
    • 通过export方式导出,在导入时要加{ },export default则不需要

    值得一提的是ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。所以import在编译时就已经运行,它也就具有了声明提升效果。
    export写法

      export let a=1;
      //或者
      let a=1;
      export {a}
      export{a as b}
    

    另外,export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。

    import写法

     //export输出
      import {a,b,c} from './a.js';
      //export default输出
      import a from './a.js
    

    总结:引用Node模块时一般require方式,如果是导入本地文件的输出模块,推荐使用import

    参考博客

    Module的语法
    Fayin
    commonJS详解


    写在后面:这次只是为了能分清各种export下的不同导入方式,更多细节的学习日后加油,向大佬看齐!

    相关文章

      网友评论

          本文标题:认清module.exports与exports、export与

          本文链接:https://www.haomeiwen.com/subject/vhqphqtx.html