前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >module.exports、exports、export、export default之间的关系和区别

module.exports、exports、export、export default之间的关系和区别

作者头像
stys35
发布2019-11-04 16:22:23
8310
发布2019-11-04 16:22:23
举报
文章被收录于专栏:工作笔记精华工作笔记精华
代码语言:javascript
复制
对于module.exports、exports和export、export default之间的关系以及他们的区别一直处于懵逼状态的小伙伴,本篇文章带你走进新大陆。

首先我们要明白一个前提,CommonJS模块规范和ES6模块规范完全是两种不同的概念。此处会产生一个疑问,为什么会出现模块化这种东西,模块化规范又是指的什么?

:很久以前,开发网页要通过命名空间的方式来组织代码,例如 jQuery 库将它的 API 都放在了 window.$ 下,在加载完 jQuery 后,其他模块再通过 window.$ 去使用 jQuery。这样做有很多问题,其中包括:

1、命名空间冲突,两个库可能会使用同一个名称,例如 Zepto(http://zepto.com) 也是放在 window.$ 下
2、无法合理地管理项目的依赖和版本
3、无法方便地控制依赖的加载顺序

当项目变大,这种方式将变得难以维护,需要用模块化的思想来组织代码。

模块化的特点:

1、提升开发效率:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发法类似的功能。
2、方便后期维护:代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发法类似的功能。

模块化的规范:

 服务器端规范主要是CommonJS,node.js用的就是CommonJS规范。

 客户端规范主要有:AMD(异步模块定义,推崇依赖前置)、CMD(通用模块定义,推崇依赖就近)。AMD规范的实现主要有RequireJS,CMD规范的主要实现有SeaJS。但是SeaJS已经停止维护了,因为在ES6中已经有了模块化的实现,随着ES6的普及,第三方的模块化实现将会慢慢的淘汰。

本文主要介绍的也是CommonJS和ES6,所以其他的规范请允许我无耻的忽略了,下面进入正题:

一、CommonJS模块规范
CommonJS的核心思想是通过require方法来同步加载依赖的其他模块,通过module.exports到处需要暴露的接口。根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

module.exports:

// utils.js
let appid = '123456'
let bar = function (id) {
    return `编号:${id}` 
}
// 通过module.exports将appid与bar暴露出去
module.exports = {
    appid , bar
}

----------------------------------------------------

 let utils = require('./utils') // 通过require引入utils
 console.log(utils.appid) // 12345
 console.log(utils.bar(2)) // 编号:2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
exports:

为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。

let exports = module.exports;

!!! 这里要注意:

不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。

let exports = module.exports
let appid = '123456'
// 错误写法
exports = {
    appid
}
// 正确写法
exports.appid = appid
1
2
3
4
5
6
7
8
二、ES6模块规范
不同于CommonJS,ES6使用 export 和 import 来导出、导入模块。

export:

// utils.js
export const appid = '123234'
export function getAppid() {
  return '123456'
}

-------------------------------------------------
// 导出的几种方式:
import { appid , getAppid } from './utils' // 导入多个导出
import * as utils from 'utils' // 作为命名空间导入整个模块
console.log(appid) // 123234
console.log(getAppid ()) // 123456
1
2
3
4
5
6
7
8
9
10
11
12
export default:

使用export default命令,为模块指定默认输出,这里要注意错误的一种写法:

// 错误写法
export default const appid = '123456'
// 正确写法
const appid = '123456'
export default appid

----------------------------------------------------

import utils from './utils' // 导入默认值
console.log(utils) // 123456
1
2
3
4
5
6
7
8
9
10
顺便介绍一下import常用的几种写法:

import { foo, bar } from ‘./utils’ // 导入多个导出
import * as utils from ‘utils’ // 作为命名空间导入整个模块
import utils from ‘utils’ // 导入默认值
import utils , { foo , bar } from ‘./utils’ // 导入多个导出与默认导出
import { foo , bar } , * as utils from ‘utils’ // 导入命名空间整个模块与多个导出
import(’./utils’).then (res) => { // do something} // import动态导入函数,当使用它的时候,会返回一个promise。
let module = await import(’./utils’) // 支持await关键字

三、相关文档
CommonJS规范,http://javascript.ruanyifeng.com/nodejs/module.html
ES6 Module 的语法,http://es6.ruanyifeng.com/#docs/module
Import用法介绍,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/import

本月开始学习小程序,会总结小程序专栏文章
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档