认清module.exports与exports、export与export default

写在前面
先分清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与export default)