认清module.exports与exports、export与
写在前面
先分清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
参考博客
写在后面:这次只是为了能分清各种export下的不同导入方式,更多细节的学习日后加油,向大佬看齐!