系统的总结一下 js 引入模块的方式。
主流模块及规范
在es6以前,还没有提出一套官方的规范,从社区和框架推广程度而言,目前通行的javascript模块规范有两种:CommonJS 和 AMD
CommonJS
在CommonJS中,暴露模块使用module.exports和exports;
在一个node执行一个文件时,会给这个文件内生成一个 exports和module对象,
而module又有一个exports属性。他们之间的关系如下图,都指向一块{}内存区域。1
exports = module.exports = {};
在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个公共方法模块utils.js。
1 | let a = 100; |
从上面可以看出,其实require导出的内容是module.exports的指向的内存块内容,并不是exports的。
简而言之,区分他们之间的区别就是 exports 只是 module.exports的引用,辅助后者添加内容用的。
exports只辅助module.exports操作内存中的数据,辛辛苦苦各种操作数据完,累得要死,结果到最后真正被require出去的内容还是module.exports的。
所以建议大家还是用module.exports 导出;
ES中的模块
在ES中有 export与export default 和 import a from ‘a’ 与 import {a} from ‘a’;
export 和 export default
- export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export、import可以有多个,export default仅有一个
- 通过export方式导出,在导入时要加{ },export default则不需要
- export能直接导出变量表达式,export default不行。
export.js
1 | //导出变量 |
index.js
1 | var express = require('express'); |