ES6模块之import export详解

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

1、模块导出(export)

你可以 导出 所有的最外层 函数 以及 var let const 声明的变量。
ES6模块只支持静态导入和导出,你只可以在模块的最外层作用域使用importexport,不可在条件语句中使用,也不能在函数作用域中使用import所有导出的标识符一定要在源代码中明确地导出它们的名称,你不能通过编写代码遍历一个数组然后用数据驱动的方式导出一堆名称。如下导出是错误的。
[javascript]  view plain  copy
  1. function squre() {};  
  2. if(true) {  
  3.     export {squre};  
  4. }  

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

1、名字导出(name export)

名字导出可以在模块中导出多个声明。
[javascript]  view plain  copy
  1. //------ lib.js ------  
  2. export const sqrt = Math.sqrt;  
  3. export function square(x) {  
  4.     return x * x;  
  5. }  
  6. export function add (x, y) {  
  7.     return x + y;  
  8. }  
  9.   
  10. //------ main.js ------  
  11. import { square, add } from 'lib';  
  12. console.log(square(10)); //100  
  13. console.log(add(2,4));  //6  
这样导入的变量名必须和导出的名称一致。以上对于每一个要导出的变量都加了export,我们也可以直接导出一个列表,例如上面的lib.js可以改写成:
[javascript]  view plain  copy
  1. //------ lib.js ------  
  2. const sqrt = Math.sqrt;  
  3. function square(x) {  
  4.     return x * x;  
  5. }  
  6. function add (x, y) {  
  7.     return x + y;  
  8. }  
  9. export {sqrt, square, add}  
export 列表可以在模块文件最外层作用域的每一处声明,不一定非要把它放在模块文件的末尾。

也可以直接导入整个模块,此时的main.js模块将变成这样。
[javascript]  view plain  copy
  1. //------ main.js ------  
  2. import * as lib from 'lib';  
  3. console.log(lib.square(10)); //100  
  4. console.log(lib.add(2,4));  //6  

2、默认导出(default export)

一个模块只能有一个默认导出,对于默认导出,导入的名称可以和导出的名称不一致,这对于导出匿名函数或类非常有用。
[javascript]  view plain  copy
  1. //------ myFunc.js ------  
  2. export default function() {...};  
  3.   
  4. //------ main.js ------  
  5. import myFunc from 'myFunc';  
  6. myFunc();  
注意这里默认导出不需要用{}。
当然也可以使用混合的导出。
[javascript]  view plain  copy
  1. //------ lib.js ------  
  2. export default function() {...};  
  3. export function each() {...};  
  4.   
  5. //------ main.js ------  
  6. import _,{ each } from 'lib';  

2、重命名export和import

为了解决导出命名冲突的问题,ES6为你提供了重命名的方法解决这个问题,当你在导入名称时可以这样做:
[javascript]  view plain  copy
  1. // 这两个模块都会导出以`flip`命名的东西。  
  2. // 要同时导入两者,我们至少要将其中一个的名称改掉。  
  3. import {flip as flipOmelet} from "eggs.js";  
  4. import {flip as flipHouse} from "real-estate.js";  
同样,当你在导出的时候也可以重命名。你可能会想用两个不同的名称导出相同的值,这样的情况偶尔也会遇到:
[javascript]  view plain  copy
  1. function v1() { ... }  
  2. function v2() { ... }  
  3.   
  4. export {  
  5.   v1 as streamV1,  
  6.   v2 as streamV2,  
  7.   v2 as streamLatestVersion  
  8. };  
对于默认导出,只是导出了一个特殊的名字叫 default,你也可以就直接用他的名字,把它当做命名导出来用,下面两种写法是等价的:
[javascript]  view plain  copy
  1. import { default as foo } from 'lib';  
  2. import foo from 'lib';  
也可以把名称as为default来默认导出:
[javascript]  view plain  copy
  1.  //------ module1.js ------  
  2. export default 123;  
  3.   
  4. //------ module2.js ------  
  5. const D = 123;  
  6. export { D as default };  

3、作为中转模块导出

有时候为了避免上层模块导入太多的模块,我们可能使用底层模块作为中转,直接导出另一个模块的内容如下:
[javascript]  view plain  copy
  1. //------ myFunc.js ------  
  2. export default function() {...};  
  3.   
  4. //------ lib.js ------  
  5. export * from 'myFunc';  
  6. export function each() {...};  
  7.   
  8. //------ main.js ------  
  9. import myFunc,{ each } from 'lib';  

这样main.js只需导入lib模块即可,虽然myFunc模块从lib模块导出,但是lib却不能使用myFunc模块的内容。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值