你真的搞懂ES6模块的导入导出规则了吗
前言
模块作为ES6规范的核心部分之一,在实际项目开发中经常会看到它的身影,那么我们是否真正了解它的相关规则呢,今天就带大家一起了解一下模块的导入导出规则
导入
ES6模块的导入(即import)大致分为:命名导入、命名空间导入、默认导入、空导入;那怎么知道用哪种方式来导入源模块呢?下面我们通过几个具体的场景看看
场景1:只想导入源模块的部分内容
假设a.js是以如下方式导出的
// a.js
export var num = 100
export var name = '王小明'
那么如果我们只需要a模块的num,就应该按下面的方式导入它
// b.js
import {num} from './a.js' console.log(num) //
此处的模块导入利用了ES6的解构方式,相关知识大家如果感兴趣可以参考阮一峰老师的《变量的解构赋值》一章
场景2:不满意源模块所导出的变量或方法的名称,想要为它们另起名称
假设a.js中有一个名称如此晦涩的变量gddhauabsg
// a.js
export var gddhauabsg = 100
忍不住想要重命名这个变量的名称,但是又无权或不想修改源模块的话,那么不妨这么做
// b.js
// 如此,我们就可以在b.js中愉快的使用num了
import {gddhauabsg as num} from './a.js' console.log(num) //
场景3:想要把源模块的所有导出都导入进来,但偏偏源模块不是以export default方式导出的
假设a模块将每个变量都单独,且声明时立即导出
// a.js
export var num = 100
export var name = '王小明'
那么我们就要这样导入a的所有导出
// b.js
import * as moduleA from './a.js' console.log(moduleA.num) //
console.log(moduleA.name) // '王小明'
解释一哈:*代表源模块(除去export default)的所有导出的集合,该集合类似Object类型,*就相当于{num: 100, name: '王小明'},所以在源模块没有使用export default导出时,我们就可以使用上面的方式导入源模块的所有导出
场景4:源模块并没有对外暴露任何导出
a模块没有导出任何内容
// a.js
var arr = [1, 2, 3]
for (var i = 0;i < arr.length;i++) {
console.log(arr[i])
}
那么b文件将a.js文件整个引入就好了
// b.js
// 此处会执行a.js的所有代码逻辑
import './a.js'
那么有些童鞋可能会有个疑问“这种导入方式的应用场景在哪?”,不知道大家是否听过'腻子脚本'这一概念,就是一些第三方脚本或工具,作用类似于补丁,用于兼容一些新特性或功能,在一般情况下,这些脚本或工具只需要自执行,并且通常都是在我们的业务代码之前引入
导出
ES6模块的导出方式大致有两种:命名导出、默认导出;对比模块的导入规则,导出要简单一些,下面我们还是通过场景来介绍
场景1:源模块怎样才能支持命名导入和命名空间导入?
// a.js
// 方式1:在源模块末尾集中导出(当导出较多时,推荐此方式,方便管理导出)
var num = 100
var name = '王小明'
var flag = true export {
num,
name,
flag
} // 方式2:声明时立即导出(当导出较少时,推荐此方式)
export var num = 100
export var name = '王小明'
export var flag = true
场景2:导出的内容前后名称需要不一致,那么我们可以尝试重命名
什么意思呢?如果源模块的开发者有下面这种想法时,就应该使用重命名导出:‘我想要提高代码的可读性且有较好的语义化,此时变量或方法的名称长度一定不会太短,类似getOrderInfoFromDatabaseByHttp这种命名,但又不想让使用我的模块的人觉得我的导出名称过长’,示例如下:
// a.js
// 名称真的好长
var getOrderInfoFromDatabaseByHttp = function () {
// ...
} export {
// 如果没有重命名,机会导出下面这一大串
// getOrderInfoFromDatabaseByHttp
// 但如果使用了重命名,方法的名称就会变得很简洁,即getOrderInfo
getOrderInfoFromDatabaseByHttp as getOrderInfo
}
场景3:模块功能单一,并且只需要导出值,不需要具名
// version.js
export default 'v1.0.0' // index.js
import version from './version.js'
上面的代码功能很简单,只是导出项目的版本号,所以我们应该使用默认导出,而没有必要像下面这样写:
// version.js
export var version = 'v1.0.0' // index.js
import {version} from './version.js'
结语
以上就是ES6模块的一些导入导出场景的整理,内容不多,但却很实用,希望能够对大家有所帮助~
你真的搞懂ES6模块的导入导出规则了吗的更多相关文章
- 你真的搞懂了Java中的<<、>>、>>>运算符嘛?
在搞懂<<.>>.>>>之前,我们需要先了解二进制中的源码.反码.补码... 二进制中的原码.反码.补码 有符号数: 对于有符号数而言,符号的正.负机器是无法 ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- 搞懂ES6的import export
引言 说来惭愧,这两个关键字几乎天天在写,但是自己写的模块export出去的对象,import居然拿不到,也是没谁了
- 别再人云亦云了!!!你真的搞懂了RDD、DF、DS的区别吗?
几年前,包括最近,我看了各种书籍.教程.官网.但是真正能够把RDD.DataFrame.DataSet解释得清楚一点的.论据多一点少之又少,甚至有的人号称Spark专家,但在这一块根本说不清楚.还有国 ...
- 小伙子,你真的搞懂 transient 关键字了吗?
先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将 ...
- 一篇文章彻底搞懂es6 Promise
前言 Promise,用于解决回调地狱带来的问题,将异步操作以同步的操作编程表达出来,避免了层层嵌套的回调函数. 既然是用来解决回调地狱的问题,那首先来看下什么是回调地狱 var sayhello = ...
- 3分钟带你搞懂ES6 import 和 export
如下语句是 default import: // B.js import A from './A' 且只在A存在 default export 时生效: // A.js export default ...
- 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?
晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...
- flex布局你真的搞懂了吗?通俗简洁,小白勿入~
flex布局 用以代替浮动的布局手段: 必须先把一个元素设置为弹性容器://display:flex: 一个元素可以同时是弹性容器和弹性元素; 设为flex布局以后,子元素的float.clear和v ...
随机推荐
- Eclipse在线安装hibernate tools插件
今天在看hibernate的视频,当讲到eclipse安装hibernate插件时,视频中的方法是安装本地的一个文件,可我电脑里并没有,于是找网上的在线安装方法,发现有两种,下面介绍这两种——> ...
- iOS开发-应用之间的跳转及通信
Update 2016-08-12: 在Github的Demo上增加Mac自定义Url Scheme,可以在Safari上输入特定协议头打开应用,并传递参数) 简介 我们接下来将要实现应用程序之间的跳 ...
- sqlserver学习笔记(二)—— 创建登录名、用户名
(重要参考:51自学网——SQL Server数据库教程) 登录名与用户名的区别: 1.登录名是指可以使用新建的登录名和密码登录数据库这个程序软件,但不能打开或展开用户自己创建的数据库: 2.用户名是 ...
- Linux命令-目录处理命令:cp
cp /etc/grub.conf /tmp 复制一个文件 cp -r /tmp/beijing/dongchengqu /root 复制dongchengqu目录到root目录 cp /root/i ...
- Redis总结(三)Redis 的主从复制(转载)
接着上一篇,前面两篇我总结了<Redis总结(一)Redis安装>和<Redis总结(二)C#中如何使用redis> 所以这一篇,会讲讲Redis 的主从复制以及C#中如何调用 ...
- 剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
一.移除性算法 (remove) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- https://download.csdn.net/download/qq_33200967/10679367
convert_variables_to_constants 模型 https://download.csdn.net/download/qq_33200967/10679367
- Tomcat7中开启gzip压缩功能的配置方法
使用gzip压缩可以减少数据传输大小,加快网页加载速度.很多大站都开启了gzip压缩,不过也有很多网站并没有开启gzip压缩,上次看了一篇文章说开启gzip压缩后对搜索引擎不友好,但从带宽和流量的角度 ...
- html5 indexDB的使用
angular.module('indexdb', []) .factory('indexDbJs', [function() { const CurDBVersion = 10000; window ...
- jvm垃圾收集器之Throughput GC
呃.HotSpot VM的GC组老人之一Jon Masamitsu很久之前就写过blog讲解这个:https://blogs.oracle.com/jonthecollector/entry/our_ ...