import、export使用介绍

ES6提供的import、export方法, 使组件化开发模式迈向新高度。本文来介绍import、export的语法及使用方法。

根据 export 的导出方式,可以概括为命名导出、默认导出两种方式。

命名导出常用语法:

export { name1, name2, ..., nameN };
export { variable as name1, variable as name2, ..., nameN };
export const name1 = ..., name2 = ..., nameN; // also var, let
export * from ...;
export { name1, name2, ..., nameN } from ...;
export { import1 as name1, import2 as name2, ..., nameN } from ...;

默认导出:

export default expression;
export default function() { ... }; // also class, function*
export default function name1() { ... }; // also class, function*
export { name1 as default, ... };

对应 export 的多种导出方式,import 也有多种倒入方式,使调用方式更加灵活多变。

import 使用语法如下:

import defaultExport from 'module-name';
import * as name from 'module-name';
import { exportName1, exportName2, ... } from 'module-name';
import { exportName1, exportName2 as alias, ... } from 'module-name';
import defaultExport, * as name from 'module-name';
import 'module-name';

接下来,我们将根据常见使用场景来举例说明使用方法。

导出已声明的变量或函数:

util.js

const aaa = 'aaa';

function cube(x) {
return x * x * x;
} // 导出已声明的变量时,只能用这种方式,否则会报错
export { aaa, cube };

上述导出的引用方式如下:

index.js

import { aaa, cube } from './util';

console.log(aaa, cube);  //  'aaa' 8

考虑到导出变量名 aaa 的语义化辨识度低,可考虑如下引入方式:

import { aaa as baseStr, cube } from './util';

console.log(baseStr, cube(2)); // 'aaa', 8

此时,若在index.js文件中调用变量aaa,会提示" aaa is not defined " 。

变量命名费时费心还怕冲突吗?直接导入整个模块也不错:

import * as util from './util';

console.log(util.aaa, util.cube(2)); // 'aaa' 8

若只需引入 cube 方法,引用方式如下:

import { cube } from './util';

console.log(cube(2)); // 8

也可以直接导出声明的变量或函数,如下:

export const aaa = 'aaa';

export function cube(x) {
return x * x * x;
}

使用方式与先声明再导入的使用方式一致,不在赘述。


export 方式决定了 import 方式。上述的多种引入方式中,引入的变量名都是固定的,即引入的变量名必须与导出的变量名保持一致。而 export 的默认导出却能打破这个限制。

可以被设置为默认导出的,有以下几种情况:

默认导出函数:

util.js

export default function cube(x) {
return x * x * x;
}

index.js

import math from './util';

console.log( math(2)); // 8

默认导出类:

util.js

export default class {
constructor (name, age) {
this.name = name;
this.age = age;
}
}

index.js

import Person from './util';

const obj =  new Person('xiaoming', 24);

console.log( obj ) ;  //  { name: 'xiaoming', age: 24 }

默认导出表达式:

util.js

export default 1 + 2;

index.js

import result from './util';

console.log( result ) ; // 3

注:不能使用var、let、const语句直接作为默认导出,可以声明变量后再作为导出

错误示例:

export default const aaa = 'aaa';

正确示例:

const aaa = 'aaa';

export default aaa;

默认导出的其他尝试:

1,每个组件只能有一个默认导出语句,否则会报错 "Duplicate export 'default'"

2,一个组件包含默认导出与命名导出,如下:

util.js

const aaa = 'aaa';

export { aaa };
export default 1 + 2;

index.js

import result, { aaa } from './util’;  // 默认导出命名在前,否则会报错

console.log( result, aaa ) ; // 3 'aaa'

兼容性

截止目前,有些浏览器并不支持 import 与 export 方法,在实际项目中多使用转换器做转换来实现,常用转换器有:Babel、Webpack、Rollup等。

import、export使用介绍的更多相关文章

  1. require/exports 和 import/export 区别

    零.区别 1.require/exports 是 CommonJS 的标准,适用范围如 Node.js 2.import/export 是 ES6 的标准,适用范围如 React 一.间接获取对象 ( ...

  2. ES6常用语法简介import export

    ES6常用语法简介import export let与var用法区别 //var var a = []; for (var i = 0; i < 10; i++) { a[i] = functi ...

  3. Salesforce LWC学习(三) import & export / api & track

    我们使用vs code创建lwc 时,文件会默认生成包含 template作为头的html文件,包含了 import LightningElement的 js文件以及对应的.js-meta.xml文件 ...

  4. Data import/export of Netezza using external table

    Introduction External table is a special table in Netezza system, which could be  used to import/exp ...

  5. [Hive - LanguageManual] Import/Export

    LanguageManual ImportExport     Skip to end of metadata   Added by Carl Steinbach, last edited by Le ...

  6. 前端 高级 (二十五)vue2.0项目实战一 配置简要说明、代码简要说明、Import/Export、轮播和列表例子

    一.启动服务自动打开浏览器运行 二.配置简要说明 1.node_modules 安装好的依赖文件,中间件等,所在位置 2.package.jason 配置当前项目要安装的中间件和依赖文件 { &quo ...

  7. require/exports 与 import/export 的区别?

    文章作者:寸志链接:https://www.zhihu.com/question/56820346/answer/150724784来源:知乎 遵循的模块化规范不一样 模块化规范:即为 JavaScr ...

  8. gulp 配置达到实现import export支持

    gulp.task('tojs', () => { return gulp.src('./es/**/*.js') .pipe(babel({ babelrc: false, plugins: ...

  9. 探讨ES6的import export default 和CommonJS的require module.exports

    今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...

随机推荐

  1. Elasticsearch集群搭建及使用Java客户端对数据存储和查询

    本次博文发两块,前部分是怎样搭建一个Elastic集群,后半部分是基于Java对数据进行写入和聚合统计. 一.Elastic集群搭建 1. 环境准备. 该集群环境基于VMware虚拟机.CentOS ...

  2. 07-01 Java 封装

    1:成员变量和局部变量的区别 /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量 ...

  3. ASP.NET 上传大文件(原创)

    问题描述 需要在网站中上传文件,但是当文件大小太大的时候IIS会拒绝连接,导致用户看到不友好的错误界面. 解决方法 1.服务器端处理 在globle.asax中的protected void Appl ...

  4. 线程中的同步辅助类Semaphore

    同步辅助类  线程池  并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已. 多线程并不是很难 需要你把代码写出来...然后分析运 ...

  5. linux下的进程(孤儿进程、僵尸进程)

    linux提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到.这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开文件,占用的内存等.但是仍然为其保留一定的信息 ...

  6. 安装python-devel开发包

    1.概述 有时在安装某些软件的时候,会报错: Error: must have python development packages -devel, python2.-devel, python2. ...

  7. JS中this的那些事儿

    this是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中. 一.this到底指向什么? this既不指向函数自身,也不指向函数的词法作用域,具体指向什么 ...

  8. 代理模式——java设计模式

    代理模式(Proxy Pattern) GoF中给出的代理模式的定义为: 代理模式给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 代理模式的英文叫做Proxy或Surrogate ...

  9. Java配置分离之Spring远程配置

    访问我的博客 前言 集群应用的配置文件如果写在项目的 resources 目录下面,当遇到需要修改某一个配置值时,需要将集群的所有应用的配置信息进行修改,并且将机密的配置信息比如数据库账号密码如果不进 ...

  10. BackgroundWorker简单实用(简便的异步操作)

    微软提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度,暂停,以及在线程完成后处理别的任务. 1.BackgroundWorker类介绍 1.1. ...