JS ES6中export和import详解

1.Export

模块是独立的文件,该文件内部的所有的变量外部都无法获取。如果希望获取某个变量,必须通过export输出,

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

或者用更好的方式:用大括号指定要输出的一组变量

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};

除了输出变量,还可以输出函数或者类(class),

export function multiply(x, y) {return x * y;
};

还可以批量输出,同样是要包含在大括号里,也可以用as重命名:

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

JS ES6中export和import详解

1.Export

模块是独立的文件,该文件内部的所有的变量外部都无法获取。如果希望获取某个变量,必须通过export输出,

// profile.js
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;

或者用更好的方式:用大括号指定要输出的一组变量

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export {firstName, lastName, year};

除了输出变量,还可以输出函数或者类(class),


export function multiply(x, y) {return x * y;
};

还可以批量输出,同样是要包含在大括号里,也可以用as重命名:

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

Attention:

export 命令规定的是对外接口,必须与模块内部变量建立一一对应的关系

// 写法一
export var m = 1;// 写法二
var m = 1;
export {m};// 写法三
var n = 1;
export {n as m};// 报错
export 1;// 报错
var m = 1;
export m;

报错的写法原因是:没有提供对外的接口,第一种直接输出1,第二种虽然有变量m,但还是直接输出1,导致无法解构。

同样的,function和class的输出,也必须遵守这样的写法。

// 报错
function f() {}
export f;// 正确
export function f() {};// 正确
function f() {}
export {f};

And:export语句输出的接口,都是和其对应的值是动态绑定的关系,即通过该接口取到的都是模块内部实时的值。

位置:export模块可以位于模块中的任何位置,但是必须是在模块顶层,如果在其他作用域内,会报错。

function foo() {export default 'bar' // SyntaxError
}
foo()

2.Import命令

export定义了模块的对外接口后,其他JS文件就可以通过import来加载这个模块,

// main.js
import {firstName, lastName, year} from './profile';function setName(element) {element.textContent = firstName + ' ' + lastName;
}

import命令接受一对大括号,里面指定要从其他模块导入的变量名,必须与被导入模块(profile.js)对外接口的名称相同。

如果想重新给导入的变量一个名字,可以用as关键字,

import { lastName as surname } from './profile';

import后的from 可以指定需要导入模块的路径名,可以是绝对路径,也可以是相对路径, .js路径可以省略,如果只有模块名,不带有路径,需要有配置文件指定。

注意,import命令具有提升效果,会提升到整个模块的头部,首先执行。(是在编译阶段执行的)

因为import是静态执行的,不能使用表达式和变量,即在运行时才能拿到结果的语法结构(e.g. if…else…)

3.module的整体加载

除了指定加载某个输出值,还可以用(*)指定一个对象,所有的变量都会加载在这个对象上。

// circle.js。输出两个函数export function area(radius) {return Math.PI * radius * radius;
}export function circumference(radius) {return 2 * Math.PI * radius;
}// main.js 加载在个模块import { area, circumference } from './circle';console.log('圆面积:' + area(4));
console.log('圆周长:' + circumference(14));//上面写法是逐一指定要加载的方法,整体加载的写法如下。
import * as circle from './circle';console.log('圆面积:' + circle.area(4));
console.log('圆周长:' + circle.circumference(14));

注意,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变。

import * as circle from './circle';// 下面两行都是不允许的
circle.foo = 'hello';
circle.area = function () {};

4.export default

之前的例子中,使用import导入时,都需要知道模块中所要加载的变量名或函数名,用户可能不想阅读源码,只想直接使用接口,就可以用export default命令,为模块指定输出

// export-default.js
export default function () {console.log('foo');
}

其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。

// import-default.js
import customName from './export-default';
customName(); // 'foo'

export default也可以用于非匿名函数前。

下面比较一下默认输出和正常输出。

// 第一组
export default function crc32() { // 输出// ...
}import crc32 from 'crc32'; // 输入// 第二组
export function crc32() { // 输出// ...
};import {crc32} from 'crc32'; // 输入

可以看出,使用export default时,import语句不用使用大括号。

*******import和export命令只能在模块的顶层,不能在代码块之中。否则会语法报错。

这样的设计,可以提高编译器效率,但是没有办法实现运行时加载。

因为require是运行时加载,所以import命令没有办法代替require的动态加载功能。

所以引入了import()函数。完成动态加载。

import(specifier)

specifier用来指定所要加载的模块的位置。import能接受什么参数,import()可以接受同样的参数。

import()返回一个Promise对象。

const main = document.querySelector('main');import(`./section-modules/${someVariable}.js`).then(module => {module.loadPageInto(main);}).catch(err => {main.textContent = err.message;});

5.import()函数适用场合

1)按需加载:

button.addEventListener('click', event => {import('./dialogBox.js').then(dialogBox => {dialogBox.open();}).catch(error => {/* Error handling */})
});

above: import模块在事件监听函数中,只有用户点击了按钮,才会加载这个模块。

2)条件加载:

import()可以放在if…else语句中,实现条件加载。

if (condition) {import('moduleA').then(...);
} else {import('moduleB').then(...);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巧用地图

L1-1 天梯赛座位分配(20 分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支…

Mac系统中MongoChef链接MongoDB集群的方法

第一步:启动Mongochef,点击链接按钮;第二步:打开连接配置面板,填写数据库名;第三步:选择链接类型Connection Type,一般分为直接连接和集群链接,这里选择集群链接 Replica…

nginx配置文件nginx.conf

user www www;#指定nginx运行的用户及用户组,默认为nobodyworker_processes 8;#开启的线程数,一般跟逻辑CPU核数一致error_log /alidata/log/nginx/error.log crit; #定位全局错误日志文件,级别以notice显示,还有debug,info,warn,error,crit模…

js 中async

一、终极解决 异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。 从最早的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人觉得不彻底。…

Python查找指定文件

在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径: import os testfiles [] testfilepaths [] L len(os.path.abspath(.))def searchfile(path):for item in os.listdir(path):if os.path.isdir(os.path.join(p…

搭建Mock Server

搭建Mock Server 1.为什么要搭建mock-server? 为了更好的分工合作,让前端能在不依赖后端环境的情况下进行开发,其中一种手段就是为前端开发者提供一个 web 容器,这个本地环境就是 mock-server。 目前很多前端 mock 数据的方案的…

请问1到10000之前,有多少升数字?(华图教育面试题)

升数字就是从左向右读,数值是依次上升的即可,比如123,1256,1389,但是1123,165就不是。以下是我的思路 public static void main(String[] args) {/*** 【请问1到10000之前,有多少升数字&#xf…

crm 一级菜单排序,二级菜单选中并且展开,非菜单权限的归属,权限粒度控制到按钮级别...

排序 /rbac/templatetags/rbac.py from django import template from django.conf import settings import re from collections import OrderedDict register template.Library()register.inclusion_tag(rbac/menu.html) def menu(request):ordered_dictOrderedDict()menu_d…

Maven工程的多模块

一个大项目需要一个团队来完成,然后一个大型项目就拆分成几块来同时开发,节省时间,提高效率. 大致分为以下几个模块(仅是自身经历): 依赖管理工程模块:一般现在开发都是以maven来管理jar包,方便.所以整个工程的依赖统一放在一个单独工程中,一般叫做父工程xxx-parent. 注意事项…

《浅谈架构之路:前后端分离模式》

前言:分离模式 对前后端分离研究了一段时间,恰逢公司有一个大项目决定尝试使用前后端分离模式进行,便参与其中。该项目从2016年初立项至今,平平稳稳得度过,但也涌现出越来越多的问题,绝对不是说前后端分离模…

查询语句

1.基本查询语句 1.1 语法: SELECT 属性列表 FROM 表名或视图列表 WHERE 条件表达式1 GROUP BY 属性名1 | HAVING 条件表达式2 ORDER BY 属性名2 ASC DESC 2.单表查询 1.应用:查询表中所有的记录 2.查询指定字段:查询表中所有name字段的记录 …

Nodejs+Koa2+云服务ECS 开发微信公众号(一)之环境配置

硬件准备工作 1. 本人采用阿里云的云服务器,购买了入门级云服务ECS(293元每年); 2.针对服务器进行认证,设置个人服务器密码; 3.购买数据盘,并将其挂载于云服务器之上(建议挂载在/…

中文词频统计与词云生成

本次作业来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2822 中文词频统计 1. 下载一长篇中文小说。 下载长篇小说《西游记》 本次作业小说保存在txt文档:xyj.txt 2. 从文件读取待分析文本。 xyj open(rF:/xyj.txt,r,encodingutf-8)…

java SWT Browser实现浏览器功能并运行JavaScript代码

一、创建简单的浏览器 import org.eclipse.swt.*; import org.eclipse.swt.browser.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*;public class Myswt3 {public static void main(String [] args) {Display display new Display();final Shell she…

[JZOJ5866]【NOIP2018模拟9.13】指引

Description Input Output Sample Input 6 3 2 0 3 1 1 3 4 2 0 4 5 5 Sample Output 2 Data Constraint Hint 贪心,把旅行者和出口的x坐标降序排序。 然后从前往后扫,如果是出口,就把y坐标插进set里,如果是旅行者,就查…

scrapy框架之递归解析和post请求

今日概要 递归爬取解析多页页面数据scrapy核心组件工作流程scrapy的post请求发送今日详情 1.递归爬取解析多页页面数据 - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储 - 需求分析:每一个页面对应一个url,则scrapy工程需…

SmartGit 过期解决方案之 非商业版本安装使用

作为前端开发的小伙伴一定有这样的困惑,自己在日常的团队协作配合时,提交代码和解决冲突是我们最头疼的问题,但是又不喜欢使用Eclipse或者IDEA这种超级占内存的编辑器,使用Git命令又是那么捉襟见肘,所以有一个好用的轻…

HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)

写在前面 此题是一个很容易想到的贪心题目,但是正确性的证明是非常复杂的。然而,目前网上所有题解并未给出本题贪心算法的任何正确性证明,全部仅停留在描述出一个贪心算法。本着对算法与计算机科学的热爱(逃)&#xff…

Webpack不生成index.html

没有导出你的最后2个插件,并且没有指定html文件名dist,因为HtmlWebpackPlugin应该生成相对于path,下面是固定配置: var path require(path)var webpack require(webpack)var HtmlWebpackPlugin require(html-webpack-plugin);m…

CSS3笔记之定位篇(一)relative

知识点1:relative和absolute relative: 相对自身,并会限制内部absolute元素层叠 absolute: 相对容器,并受到父类容器relative的影响,比如:overflow:hidden/scroll fixed: 不受relative限制,只受z-index的…