关于exports、module.exports和export、export default

使用范围

  • 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的区别:
    1. export与export default均可用于导出常量、函数、文件、模块等
    2. 在一个文件或模块中,export、import可以有多个,export default仅有一个
    3. 通过export方式导出,在导入时要加{ },export default则不需要
    4. export能直接导出变量表达式,export default不行。

参考

exports、module.exports和export、export default到底是咋回事

ECMAScript 6 入门 阮一峰 export命令

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>