ES6模块之export和import详解

ES6中的模块即使一个包含JS代码的文件,在这个模块中所有的变量都是对其他模块不可见的,除非我们导出它。ES6的模块系统大致分为导出(export)和导入(import)两个模块。

模块导出(export)

你可以导出所有的最外层函数以及varletconst声明的变量。

ES6模块只支持静态导入和导出,你只可以在模块的最外层作用域使用importexport,不可在条件语句中使用,也不能在函数作用域中使用import。所有导出的标识符一定要在源代码中明确地导出它们的名称,你不能通过编写代码遍历一个数组然后用数据驱动的方式导出一堆名称。如下导出是错误的。

//错误示例
function squre() {};if(true) {export {squre};
}

ES6的导出分为名字导出和默认导出

名字导出(name export)

名字导出可以在模块中导出多个声明。

//------ lib.js ------
export const sqrt = Math.sqrt;export function square(x) {return x * x;
}export function add (x, y) {return x + y;
}//------ main.js ------
import { square, add } from 'lib';console.log(square(10)); //100
console.log(add(2,4)); //6

这样导入的变量名必须和导出的名称一致。以上对于每一个要导出的变量都加了export,我们也可以直接导出一个列表,例如上面的lib.js可以改写成:

//------ lib.js ------
const sqrt = Math.sqrt;function square(x) {return x * x;
}function add (x, y) {return x + y;
}export {sqrt, square, add}

export列表可以在模块文件最外层作用域的每一处声明,不一定非要把它放在模块文件的末尾。

也可以直接导入整个模块,此时的main.js模块将变成这样。

//------ main.js ------
import * as lib from 'lib';console.log(lib.square(10)); //100
console.log(lib.add(2,4)); //6

默认导出(default export)

一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称不一致,这对于导出匿名函数或类非常有用。

//------ myFunc.js ------
export default function() {...};//------ main.js ------
import myFunc from 'myFunc';myFunc();

注意这里默认导出不需要用{}。

当然也可以使用混合的导出。

//------ lib.js ------
export default function() {...};
export function each() {...};//------ main.js ------
import _,{ each } from 'lib';

重命名export和import

为了解决导出命名冲突的问题,ES6为你提供了重命名的方法解决这个问题,当你在导入名称时可以这样做:

// 这两个模块都会导出以`flip`命名的东西。
// 要同时导入两者,我们至少要将其中一个的名称改掉。
import {flip as flipOmelet} from "eggs.js";
import {flip as flipHouse} from "real-estate.js";

同样,当你在导出的时候也可以重命名。你可能会想用两个不同的名称导出相同的值,这样的情况偶尔也会遇到:

function v1() { ... }
function v2() { ... }export {v1 as streamV1,v2 as streamV2,v2 as streamLatestVersion};

对于默认导出,只是导出了一个特殊的名字叫 default,你也可以就直接用他的名字,把它当做命名导出来用,下面两种写法是等价的:

import { default as foo } from 'lib';
import foo from 'lib';

也可以把名称as为default来默认导出:

//------ module1.js ------
export default 123;//------ module2.js ------
const D = 123;
export { D as default };

作为中转模块导出

有时候为了避免上层模块导入太多的模块,我们可能使用底层模块作为中转,直接导出另一个模块的内容如下:

//------ myFunc.js ------
export default function() {...};//------ lib.js ------
export * from 'myFunc';
export function each() {...};//------ main.js ------
import myFunc,{ each } from 'lib';

这样main.js只需导入lib模块即可,虽然myFunc模块从lib模块导出,但是lib却不能使用myFunc模块的内容。

参考链接:

http://www.infoq.com/cn/articles/es6-in-depth-modules

http://2ality.com/2014/09/es6-modules-final.html

http://blog.csdn.net/lihongxun945/article/details/49031383

ES6模块之export和import详解相关推荐

  1. JS ES6中export和import详解

    1.Export 模块是独立的文件,该文件内部的所有的变量外部都无法获取.如果希望获取某个变量,必须通过export输出, // profile.js export var firstName = ' ...

  2. python的shutil模块是内置的_Python之shutil模块11个常用函数详解,python内置函数是什么...

    Python之shutil模块11个常用函数详解,python内置函数是什么 shutil 是 Python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查 ...

  3. 【java】JDK安全模块JCE核心Cipher使用详解

    1.概述 转载:JDK安全模块JCE核心Cipher使用详解 2.前提 javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适.Cipher是JCA(Java Cryptograp ...

  4. 【 数据集加载 DatasetDataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)】

    数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10) 模块介绍 在本节中没有关于数学原理的相关介绍,使用的数据集和类型 ...

  5. 【 线性回归 Linear-Regression torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人(4/10)】

    torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 深度学习 Pytorch笔记 B站刘二大人(4/10) 介绍 至此开始,深度学习模型构建的预备知识已经完全准备完毕. 从本章开 ...

  6. python调用包的路径_Python3 模块、包调用路径详解

    如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Pyth ...

  7. python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...

  8. python中paste函数的作用_PIL图像处理模块paste方法简单使用详解

    python2中提供了PIL基础的图像数据出来模块,在python3中更名为了pillow模块,名字虽然发生了改变,但是提供的方法和功能都是一样的,对于日常基础的图像数据处理分析来说是足够用了的,现在 ...

  9. 如何用树莓派连接语音模块,红外模块来控制红外设备详解

    如何用树莓派连接语音模块,红外模块来控制红外设备详解 1.硬件设备 2.软件准备 3.解码 1.红外解码流程 1.连接红外设备(与TTL串口相连) 2.获取开关红外电器的码 4.我们使用树莓派如何和W ...

最新文章

  1. android 双时区,理查德米勒推出RM 11-02自动机芯双时区飞返计时码表
  2. 3检测人头_基于人头检测技术客流统计摄像头及管理平台
  3. Pandas简明教程:四、Pandas数据索引方式
  4. 99.99%安卓手机存在系统安全漏洞
  5. 语法推导树之短语,直接短语,句柄
  6. 【matplotlib】远程服务器使用报错 $DISPLAY
  7. (非)对称加密算法在https中的应用(加密过程以及CA颁发、验证)
  8. ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters
  9. cmd中编译、执行Java文件
  10. “才子进销存”新一代真正基于互联网(Internet)的进销存分销管理软件
  11. windows7环境下 硬盘安装ubuntu 12.04 server版
  12. vscode如何快捷键一键生成vue模板
  13. 小程序提示:downloadFile:fail 发生了 SSL 错误,无法建立与该服务器的安全连接
  14. Java知识点的总结(一)
  15. Jenkins——Jenkins介绍+基于云平台的Jenkins安装和持续集成环境配置(插件+用户权限+凭据+Maven打包)
  16. 解决yay官方源下载慢问题
  17. 安卓开发基础知识-补习9
  18. AutoCAD制作自定义填充图案
  19. 趣味算法:国王和100个囚犯
  20. kafka(15) Kafka Connect

热门文章

  1. .Net 4.0并行库实用性演练[1]
  2. BugTracker.NET安装指南
  3. c#中的socket(tcp)
  4. linux 命令行工具无敌斩
  5. 数据挖掘-分类与预测-神经网络算法
  6. LeetCode 463. Island Perimeter
  7. 设计模式——单例模式详解
  8. shell脚本if和switch语句编写案例
  9. 多表关系介绍 mysql
  10. 爬早-精典小结-0226