主流模块规范
在es6以前,还没有提出一套官方的规范,从社区和框架推广程度而言,目前通行的javascript模块规范有两种:CommonJS 和 AMD
2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。
这标志”Javascript模块化编程”正式诞生。前端的复杂程度有限,没有模块也是可以的,但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。
node编程中最重要的思想之一就是模块,而正是这个思想,让JavaScript的大规模工程成为可能。模块化编程在js界流行,也是基于此,随后在浏览器端,requirejs和seajs之类的工具包也出现了,可以说在对应规范下,require统治了ES6之前的所有模块化编程,即使现在,在ES6 module被完全实现之前,还是这样。
在CommonJS中,暴露模块使用module.exports和exports
在CommonJS中,有一个全局性方法require(),用于加载模块。
ES6 标准后,module成为标准,标准使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们依然采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口。
根据规范:
CommonJS规范:使用的是require和exports/module.exports
ES6规范:import 和 export
在node开发中使用require引入,exports/module.exports导出,
在使用es6规范中还是使用import引入 使用export导出
export导出模块 / import引入模块 -- es6规范
export语法声明用于导出函数、对象、指定文件(或模块)的原始值。 规定的是对外的接口,必须与模块内部的变量建立一一对应关系;
注意:在node中使用的是exports,不要混淆了
export和export default命令 -- ES6规范
export规定的是对外的接口,必须与模块内部的变量建立一一对应关系;
export default 为模块指定默认输出。
在node中使用require、exports 和 module.exports
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
var exports = module.exports
于是我们可以直接在 exports 对象上添加方法,表示对外输出的接口,如同在module.exports上添加一样。注意,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
require/exports 的只有以下三种简单的写法:
const fs = require('fs')
exports.fs = fs
module.exports = fs