专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员小灰  ·  部署DeepSeek ... ·  11 小时前  
程序员小灰  ·  小灰筹划6年的“仓鼠币系统”,终于上线了! ·  2 天前  
程序员的那些事  ·  北京大学出的第二份 DeepSeek ... ·  昨天  
OSC开源社区  ·  RAG市场的2024:随需而变,从狂热到理性 ·  2 天前  
码农翻身  ·  漫画 | 为什么大家都愿意进入外企? ·  2 天前  
51好读  ›  专栏  ›  SegmentFault思否

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

SegmentFault思否  · 公众号  · 程序员  · 2017-09-12 08:00

正文

前言

难得有空,今天开始重新规范的学习一下node编程。但是引入模块我看到用 require 的方式,再联想到咱们的 ES6 各种 export exportdefault

阿西吧,头都大了....

头大完了,那我们坐下先理理他们的使用范围。

  • require : node 和 es6 都支持的引入

  • export/import : 只有es6 支持的导出引入

  • module.exports/exports : 只有 node 支持的导出

这一刻起,我觉得是时候要把它们之间的关系都给捋清楚了,不然我得混乱死。话不多少,咱们开干!!

node模块

Node 里面的模块系统遵循的是 CommonJS 规范。那问题又来了,什么是 CommonJS 规范呢?由于 js 以前比较混乱,各写各的代码,没有一个模块的概念,而这个规范出来其实就是对模块的一个定义。

CommonJS 定义的模块分为:模块标识( module )、模块定义( exports ) 、模块引用( require )。

先解释 exports module.exports 。在一个node执行一个文件时,会给这个文件内生成一个 exports module 对象,而 module 又有一个 exports 属性。他们之间的关系如下图,都指向一块{}内存区域。

  1. exports = module.exports = {};

那下面我们来看看代码的吧。

  1. //utils.js

  2. let a = 100 ;

  3. console.log(module.exports); //能打印出结果为:{}

  4. console.log(exports); //能打印出结果为:{}

  5. exports.a = 200; //这里辛苦劳作帮 module.exports 的内容给改成 {a : 200}

  6. exports = '指向其他内存区'; //这里把exports的指向指走

  7. //test.js

  8. var a = require('/utils');

  9. console.log(a) // 打印为 {a : 200}

从上面可以看出,其实 require 导出的内容是 module.exports 的指向的内存块内容,并不是 exports 的。 简而言之,区分他们之间的区别就是 exports 只是 module.exports 的引用,辅助后者添加内容用的。

用白话讲就是, exports 只辅助 module.exports 操作内存中的数据,辛辛苦苦各种操作数据完,累得要死,结果到最后真正被 require 出去的内容还是 module.exports 的,真是好苦逼啊。

其实大家用内存块的概念去理解,就会很清楚了。

然后呢,为了避免糊涂,尽量都用 module.exports 导出,然后用 require 导入。

ES中的模块导出导入

说实话,在es中的模块,就非常清晰了。不过也有一些细节的东西需要搞清楚。

比如 export exportdefault ,还有 导入的时候, importafrom.. , import{a}from.. ,总之也有点乱,那么下面我们就开始把它们捋清楚吧。

export 和 export default

首先我们讲这两个导出,下面我们讲讲它们的区别

  1. export与export default均可用于导出常量、函数、文件、模块等

  2. 在一个文件或模块中,export、import可以有多个,export default仅有一个

  3. 通过export方式导出,在导入时要加{ },export default则不需要

  4. export能直接导出变量表达式,export default不行。

下面咱们看看代码去验证一下

testEs6Export.js

  1. 'use strict'

  2. //导出变量

  3. export const a = '100';  

  4. //导出方法

  5. export const dogSay = function(){

  6.    console.log('wang wang');

  7. }

  8. //导出方法第二种

  9. function catSay(){

  10.   console.log('miao miao');

  11. }

  12. export { catSay };

  13. //export default导出

  14. const m = 100;

  15. export default m;

  16. //export defult const m = 100;// 这里不能写这种格式。

index.js

  1. //index.js

  2. 'use strict'

  3. var express = require('express');

  4. var router = express.Router();

  5. import







请到「今天看啥」查看全文