ES6中 import和export的用法

1. export与模块导出

export语法声明用于导出函数、对象、指定文件(或模块)的原始值。export有两种模块导出方式:

  • 命名式导出(名称导出),导出每个模块可以多个
  • 定义式导出(默认导出),默认导出每个模块仅一个。

export可能会有以下几种形式的导出语法:

export { name1, name2, …, nameN };
export { variable1 as name1, variable2 as name2, …, nameN };
export let name1, name2, …, nameN; // 也可以是 var
export let name1 = …, name2 = …, …, nameN; // 也可以是 var, const

export default expression;
export default function (…) { … } // 也可以是 class, function*
export default function name1(…) { … } // 也可以是 class, function*
export { name1 as default, … };

export * from …;
export { name1, name2, …, nameN } from …;
export { import1 as name1, import2 as name2, …, nameN } from …;
  • name1… nameN—— 导出的“标识符”。导出后,可以通过这个“标识符”在另一个模块中使用import引用
  • default—— 设置模块的默认导出。设置后import不通过“标识符”而直接引用默认导入
  • * —— 继承模块并导出继承模块所有的方法和属性
  • as —— 重命名导出“标识符”
  • from—— 从已经存在的模块、脚本文件…导出
命名式导出

模块可以通过export前缀关键词声明导出对象,导出对象可以是多个。这些导出对象用名称进行区分,称之为命名式导出。

export { myFunction }; // 导出一个已定义的函数
export const foo = Math.sqrt(2); // 导出一个常量
var name = '菜鸟教程';
var domain = 'http://www.runoob.com/';
export {name, domain};

模块导出时,我们可以使用as关键字对导出成员进行重命名:

var name = '菜鸟教程';
var domain = 'http://www.runoob.com/';
export {name as siteName, domain};

使用示例:

// "my-module.js" 模块
export function cube(x) {
  return x * x * x;
}
const foo = Math.PI + Math.SQRT2;
export { foo };

在另一个模块(脚本文件)中,我们可以像下面这样引用:

import { cube, foo } from 'my-module';
console.log(cube(3)); // 27
console.log(foo);    // 4.555806215962888

注意:在import引用时,也要使用相同的名称来引用相应的值

定义式导出

默认导出也被称做定义式导出。默认导出每个导出只有一个单一值,这个输出可以是一个函数、类或其它类型的值,这样在模块import导入时也会很容易引用。

export default function() {}; // 可以导出一个函数
export default class(){}; // 也可以出一个类

用法示例:

 // "my-module.js"模块
export default function (x) {
  return x * x * x;
}

在另一个模块(脚本文件)中,我们可以像下面这样引用,相对名称导出来说使用更为简单:

// 引用 "my-module.js"模块
import cube from 'my-module';
console.log(cube(3)); // 27
命名式导出与默认导出

默认导出可以理解为另一种形式的命名导出,默认导出可以认为是使用了default名称的命名导出。

下面两种导出方式是等价的:

const D = 123;

export default D;
export { D as default };

注意:export defaultexport输出时候,使用import的区别

  • export default对应的import语句不需要使用大括号,而export对应的import需要大括号
  • export default 对应的import不需要知道加载的模块里的变量名。而export对应的import必须和export的变量一样。

2. import

import语法声明用于从已导出的模块、脚本中导入函数、对象、指定文件(或模块)的原始值。import模块导入与export模块导出功能相对应,也存在两种模块导入方式:命名式导入(名称导入)和定义式导入(默认导入)。

import可能会有以下几种形式的导入语法:

import defaultMember from "module-name";
import * as name from "module-name";
import { member } from "module-name";
import { member as alias } from "module-name";
import { member1 , member2 } from "module-name";
import { member1 , member2 as alias2 , [...] } from "module-name";
import defaultMember, { member [ , [...] ] } from "module-name";
import defaultMember, * as name from "module-name";
import "module-name";
  • name —— 从将要导入模块中收到的导出值的名称
  • member, memberN —— 从导出模块,导入指定名称的多个成员
  • defaultMember —— 从导出模块,导入默认导出成员
  • alias, aliasN—— 别名,对指定导入成员进行的重命名
  • module-name —— 要导入的模块。是一个文件名
  • as —— 重命名导入成员名称(“标识符”)
  • from —— 从已经存在的模块、脚本文件等导入

用法示例:

// --file.js--
function getJSON(url, callback) {
  let xhr = new XMLHttpRequest();
  xhr.onload = function () { 
    callback(this.responseText) 
  };
  xhr.open("GET", url, true);
  xhr.send();
}

export function getUsefulContents(url, callback) {
  getJSON(url, data => callback(JSON.parse(data)));
}

// --main.js--
import { getUsefulContents } from "file";
getUsefulContents("http://itbilu.com", data => {
  doSomethingUseful(data);
});

在一个文件或模块中,export、import可以有多个,export default仅有一个


参考资料:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容