使用范围
- require: node 和 es6 都支持的引入
-
export/import : 只有es6 支持的导出引入
-
module.exports/exports: 只有 node 支持的导出
node 模块
Node里面的模块系统遵循的是CommonJS规范。
CommonJS定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require)
每个模块内部,都有一个module对象,代表当前模块。它有以下属性:
<code class="language-null">module.id 模块的识别符,通常是带有绝对路径的模块文件名。 module.filename 模块的文件名,带有绝对路径。 module.loaded 返回一个布尔值,表示模块是否已经完成加载。 module.parent 返回一个对象,表示调用该模块的模块。 module.children 返回一个数组,表示该模块要用到的其他模块。 module.exports 表示模块对外输出的值。 </code>
为了方便,Node为每个模块提供一个exports变量,指向module.exports。
node中exports和module.exports区别
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports
因此当直接重新给exports赋值时,外部并不会获取exports的值,而应该使用module.exports
<code class="language-null">//错误写法 exports = {aa: 11} //正确写法 module.exports = {aa: 11} </code>
ES中的模块导出导入
export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。
<code class="language-null">// 写法一 export var m = 1; // 写法二 var m = 1; export {m}; // 写法三 var n = 1; export {n as m}; </code>
使用export default命令,为模块指定默认输出。
<code class="language-null">// export-default.js export default function () { console.log('foo'); } </code>
- export 和 export default的区别:
- export与export default均可用于导出常量、函数、文件、模块等
- 在一个文件或模块中,export、import可以有多个,export default仅有一个
- 通过export方式导出,在导入时要加{ },export default则不需要
- export能直接导出变量表达式,export default不行。