首页 > 其他分享 >ES6模块之export和import详解

ES6模块之export和import详解

时间:2022-09-20 19:57:44浏览次数:90  
标签:ES6 lib 导出 js export 模块 ------ import


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

1、模块导出(export)

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

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

1、名字导出(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

 

2、默认导出(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';

 

2、重命名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 };

 

3、作为中转模块导出

有时候为了避免上层模块导入太多的模块,我们可能使用底层模块作为中转,直接导出另一个模块的内容如下:
//------ 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模块的内容。


参考链接: https://blog.csdn.net/qq_28506819/article/details/75733601 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,lib,导出,js,export,模块,------,import
From: https://www.cnblogs.com/emanlee/p/16710305.html

相关文章

  • ES6的H5相关内容
    画图:canvas--签名,刮奖,画布线:坐标,粗细,颜色.lineWidth=6;//线的粗细,单位是px.strokeStyle="css颜色值";.moveTo(x,y),开始落笔位置.lineTo(x,y),结束位置.stroke();绘制线......
  • from pynput.keyboard import Key, Controller k = Controller():在不需要定位元素的
     defcontrol_keyboard(model,content=None,no_wait=False):"""模拟电脑的键盘操作:parammodel:要进行的操作:复制--ctrl_C粘贴--ctrl_V全选--ct......
  • Oracle Db Export and Import in Windows
    1:ExportdbfromoracleserverexpSYSTEM/[email protected]:1521/XEowner=SYSTEMfile=C:\Temp\test.dmpSYSTEMisdbadminusernamepasswordis dbadminuse......
  • ES6-2
    <!--<script>//const声明一个只读的常量,只能读取——基本类型初始化的时候必须给值(另一种是引用类型)栈里constabc=111;//abc=222;//报......
  • ES6-1
    <!--<script>window.onload=function(){vara=10;letb=20;constc=30;//ES5预解析变量提升varfunction......
  • ES6-3
    window.onload=function(){//---------------------------------------数组解构-----------------let[x,y,z]=[true,[1,2,3],{id:......
  • ES6全
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"conten......
  • ES6 对String做的常用升级优化
    ES61.let有什么用,为什么有了var还要使用let在ES6之前,声明变量只能用var,var声明变量有很多不合理的点,准确的说是因为ES5中没有块级作用域是很不合理的,甚至可以说是一门语......
  • Adaptive Importance Sampling to Accelerate Training of a Neural Probabilistic La
    目录概符号说明Motivation本文方法更简洁的形式BengioY.andSen\acute{e}calJ.S.Adaptiveimportancesamplingtoacceleratetrainingofaneuralprobabilistic......
  • nodeJS中module.exports和exports的区别
      简单说就是,module.exprots是堆内存中的对象,而exports是栈内存中指向module.exprots的引用,实际上exports指向的是堆内存中的module.exprots的堆内存空间,所以需要用......