exports、module.exports 和 export、export default 到底是咋回事
前言
难得有空,今天开始重新规范的学习一下node编程。
但是引入模块我看到用 require
的方式,再联想到咱们的ES6
各种export
、export default
。
阿西吧,头都大了....
头大完了,那我们坐下先理理他们的使用范围。
require
: node 和 es6 都支持的引入export / import
: 只有es6 支持的导出引入module.exports / exports
: 只有 node 支持的导出
这一刻起,我觉得是时候要把它们之间的关系都给捋清楚了,不然我得混乱死。话不多少,咱们开干!!
Node使用CommonJS规范,定义每个模块的内部,module变量代表当前模块,exports是module的属性,表示对外的接口。加载某个模块,实际上是加载该模块的module.exports属性。
Node为每隔模块提供了一个exports变量,指向module.exports,这等同于每个模块头部有这样的一行代码:var exports = module.exports
ES6使用export和import来导出/导入模块。
3.1 export与export default均可用于导出常量/函数/文件/模块等;
3.2 在一个文件或模块中,export/import可以有多个,export default只有一个;
3.3 通过export方式导出,在导入时需要加{},export default不需要;
3.4 export能导出变量/表达式,export default不可以。
CommonJS模块输出是一个值的拷贝,ES6模块输出是值的引用。
CommonJS模块是运行时加载,ES6模块是编译时输出接口。
CommonJS模块无论require多少次,都只会在第一次加载时运行一次,然后保存到缓存中,下次在require,只会去从缓存取。
module.exports与exports ,是CommonJS的规范,被使用于Node.js中。export与export default ,是ES6规范,被使用于React或Vue中。