ES6 Module 模块

2023-10-27

ES6 module模块

概述

ES6中的module指的是JavaScript模块化规范中的一种。它通过export和import语法来导出和导入模块中的变量、函数、类等内容。

使用ES6模块化的好处包括:解决了模块化的问题。消除了全局变量。管理加载顺序。

使用

  • 在ES6模块中,一个文件代表一个模块
  • 当使用script标签加载模块时,需要加type="module"
  • export命令用于导出内容。
  • import命令用于导入内容。

在这里插入图片描述

在这里插入图片描述

export default 和 import

  • 一个模块只能有一个export default
  • 相同内容的import命令只会执行一次。

方式一:导出变量

// module.js

const age = 18;
export default age;
import age from "./module.js";
console.log(age); //18

等价于下面:

// module.js

export default 18;
import age from "./module.js";
console.log(age); //18

方式二:导出方法

// module.js

function sayHello() {
  console.log("hello");
}
export default sayHello;
import sayHello from "./module.js";
sayHello();

等价于下面:

// module.js

export default function () {
  console.log("hello");
}
import sayHello from "./module.js";
sayHello();

方式三:导出对象

// module.js

let user = { name: "小明", age: 18 };
export default user;
import user from "./module.js";
console.log(`${user.name}今年${user.age}`);

等价于下面:

// module.js

export default { name: "小明", age: 18 };
import user from "./module.js";
console.log(`${user.name}今年${user.age}`);

export 和 import

方式一

// module.js

let name = "小明";
let age = 18;
function sayHello() {
  console.log("hello");
}
export { name, age, sayHello };
import { name, age, sayHello } from "./module.js";
console.log(name); //小明
console.log(age); //18
sayHello(); //hello

方式二

// module.js

export let name = "小明";
export let age = 18;
export function sayHello() {
  console.log("hello");
}
import { name, age, sayHello } from "./module.js";
console.log(name); //小明
console.log(age); //18
sayHello(); //hello

别名

导出别名

// module.js

let name = "小明";
let age = 18;
function sayHello() {
  console.log("hello");
}
export { name as name2, age as age2, sayHello as sayHello2 };
import { name2, age2, sayHello2 } from "./module.js";
console.log(name2); //小明
console.log(age2); //18
sayHello2(); //hello

导入别名

// module.js

let name = "小明";
let age = 18;
function sayHello() {
  console.log("hello");
}
export { name, age, sayHello };
import {
    name as name2,
    age as age2,
    sayHello as sayHello2,
} from "./module.js";
console.log(name2); //小明
console.log(age2); //18
sayHello2(); //hello

整体别名

// module.js

let name = "小明";
let age = 18;
function sayHello() {
  console.log("hello");
}
export { name, age, sayHello };
import * as obj from "./module.js";
console.log(obj.name); //小明
console.log(obj.age); //18
obj.sayHello(); //hello

export default 和 export混用

导出

// module.js

let name = "小明";
let age = 18;
function sayHello() {
  console.log("hello");
}
export { name, age, sayHello };
export default "北京市";

导入

import address from "./module.js";
import { name, age, sayHello } from "./module.js";
console.log(address); //北京市
console.log(name); //小明
console.log(age); //18
sayHello(); //hello

等价于下面:

// export default必须放在前面
import address, { name, age, sayHello } from "./module.js";
console.log(address); //北京市
console.log(name); //小明
console.log(age); //18
sayHello(); //hello

this指向问题

  • 在js中,顶层的this指向window对象。
  • 模块中,顶层的this指向undefined。
// module.js

console.log(this);
<script src="./module.js"></script>
<script src="./module.js" type="module"></script>

打印输出:

在这里插入图片描述

import 和 import()

  • import命令具有提升作用,会提升到整个模块的头部,并率先执行。
  • import()是一个函数,可以动态导入,返回一个promise对象。
// mobile.js

export default "这是移动端";
// pc.js

export default "这是PC端";
let isPc = true;
if (isPc) {
    import("./pc.js").then((module) => {
        console.log(module.default);
    });
} else {
    import("./mobile.js").then((module) => {
        console.log(module.default);
    });
}

导入导出复合写法

// module1.js

export const age = 18;
// module2.js

import { age } from "./module1.js";
export { age };
import { age } from "./module2.js";
console.log(age); //18

module2.js可简写为:

// module2.js

export { age } from "./module1.js";

模块的继承

//base.js

let name = "Tom";
let age = 28;
let address = "beijing";

export { name, age, address }
//children.js

export * from "./base.js"
export function sayHello() {
    console.log("sayHello");
};
<script type="module">
    import * as myobj from "./js/children.js";

    console.log(myobj.name, myobj.age, myobj.address);
    myobj.sayHello();
</script>

//Tom 18 beijing
//sayHello

module加载的本质

ES6模块的运行机制是这样的:当遇到import命令时,不会立马去执行模块,而是生成一个动态的模块只读引用,等到需要用到时,才去解析引用对应的值。

由于ES6的模块获取的是实时值,就不存在变量的缓存。

实施性体现

//export1.js
export let count = 1;
export function add() {
	count++;
}
<img id="myImg">
<script type="module">
    import {count,add} from "./js/export1.js";
    console.log(count); //1
    add();
    add();
    console.log(count); //3
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6 Module 模块 的相关文章

随机推荐

  • 前缀和与差分(初学推荐)

    前缀和 适用于静态数组区间和 时间复杂度 O n 原理 当两个整数a b对k具体相同余数 a k b k 那么a b一定为k的倍数 a b 一维前缀和 题目一 k倍区间 给定一个长度为N的数列 A1 A2 AN 如果其中一段连续的子序列Ai
  • BI数据分析方法小结

    author skate time 2011 04 06 对于电子商务网站 我们该如何对数据分析呢 当我们拿到数据的时候该做些什么 要回答这几个问题前 先回答如下问题 1 数据是给谁看的 2 看数据的人 想从数据中得到什么 或者用数据证明什
  • java创建类关键字_在Java中,可以使用关键字【】来创建类的实例对象

    摘要 特别叫量呼的海是对 使用关集中用于部过的局负荷控制 向某行试呼的个目特定制用制在某一来限段内的进次数时间g控 学院现重如发患全隐大安 创例对或发故全事生学生安 息 造作被坚决因信杜绝动成工 迅速向分管院告要在第一长报时间 使用关撞击角
  • Spring 如何使用JDK动态代理呢?

    转自 Spring 如何使用JDK动态代理呢 下文是笔者采用示例的方式讲述JDK动态代理的实现方法 如下所示 实现思路 Spring JDK 动态代理需要实现 InvocationHandler 接口 重写 invoke 方法 客户端使用
  • Spring 配置数据库用户名密码加密

    Spring 配置数据库用户名密码加密 传统形式配置数据库用户名密码 对于一般的spring框架 经常要用到数据源配置 如果是用xml配置的话 一般都是如下形式 数据库用户名密码密文配置实现 现在的需求是不能在配置文件里明文配置数据库用户名
  • 30 张快速学习 Java 的思维导图

    前两天一直给大家分享的是我的学习历程还有面试流程 希望能够帮助和鼓励到大家 今天我继续给大家分享我的一下学习的小方法 大家有兴趣的可以多看看 觉得还不错的就给我点点赞 今天给大家分享的是 Java 知识点总结的思维导图 整理成了这篇文章 帮
  • shell脚本练习1 ————10秒钟倒计时脚本

    root 1 cat time sh bin bash for i in 10 1 do clear echo n i echo n 不换行输出 sleep 1 done root 1 cat time sh bin bash for i
  • python print 打印不使用省略号

    import tensorflow as tf import os import numpy as np np set printoptions threshold np inf threshold 指定超过多少使用省略号 np inf代表
  • SQL语句基础介绍

    SQL语句基础介绍 SQL语句主要可以分为以下3个类别 DDL Data Definition Language 语句 数据定义语言 这些语句定义了不同的数据段 数据库 表 列 索引等数据库对象 常用的语句关键字主要包括create dro
  • js 获取url 携带的参数

    window location 对象所包含的属性 hash 从井号 开始的 URL 锚 host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 pathname 当前 URL 的路径部分 href 完整的 URL
  • 【Flutter 1-12】Flutter手把手教程Dart语言——什么是泛型和泛型的使用场景

    作者 弗拉德 来源 弗拉德 公众号 fulade me 泛型 如果你查看数组的API文档 你会发现数组List的实际类型为List
  • java:面向对象(Object类-equals()).

    Obeject 是所有对象的直接后者间接父类 传说中的上帝 该类中定义的肯定是所有对象都具备的功能 我们写这样一个代码 class Demo class ObjectDemo public static void main String a
  • nginx隐藏版本号及nginx

    查看nginx安装了哪些插件 nginx V 停止并卸载老的nginx systemctl stop nginx ps ef grep nginx 备份老的配置 find name nginx mv etc logrotate d ngin
  • Unity Dotween插件的运动曲线(Ease)介绍Ease选项Ease效果示例以及C#修改动画曲线功能

    前言 我们在制作动画时经常使用这个Dotween插件 在移动 旋转 透明度等等参数的控制都可以使用该插件 而且在这个插件上的控制动画可以设置曲线 内置的曲线有这些 内置曲线 以InOutSine的曲线进行往右移动 效果是这样的 能看出开始是
  • 解析Exception和C#处理Exception的常用方法总结

    在 NET中 异常是指成员没有完成它的名称宣称可以完成的行动 在异常的机制中 异常和某件事情的发生频率无关 异常处理四要素包括 一个表示异常详细信息的类类型 一个向调用者引发异常类实例的成员 调用者的一段调用异常成员的代码块 调用者的一段处
  • 综合评价方法

    文章目录 1 综合评价概述 1 1 基本概念 1 2 综合评价问题的五个要素 1 3 综合评价方法的思路 1 4 常用综合评价方法 2 确定权重类 2 1 信息浓缩 因子分析和主成分分析 2 2 数字相对大小 层次分析法 2 3 信息量 熵
  • Linux下查看软件安装路径

    Linux下查看软件安装路径 1 查询软件安装路径 在Linux操作系统中查看软件安装路径是通过whereis 命令 如查看sshd软件的安装路径时输入命令 whereis sshd sshd usr sbin sshd usr share
  • [创业之路-61] :创业者(老板)与职场(经理人)的区别(身份、职责、专业技能、行为模式)

    在职场中 创业者和职场人的行为有重大的区别 职场人从打工到创业 行为方式也需要发生重大的转变 这里以职业经理人泛指所有的职场人 本文就是探讨这个差别和自己的心路感悟 一 身份不同 创业者老板 自己独自成立或者和别人一起成立一家公司 其通过公
  • GAME Kit开发记录

    2D Game Kit开发记录 作为一款经典的2D游戏 seeker的构成用到了很多U3D中常用的手法和操作 其中包括角色移动 攻击 不同地形的材质处理 机关的触发 敌人系统 以及UI设置等 1 建立场景 作为整个游戏的基础 场景是玩家进入
  • ES6 Module 模块

    文章目录 ES6 module模块 概述 使用 export default 和 import 方式一 导出变量 方式二 导出方法 方式三 导出对象 export 和 import 方式一 方式二 别名 导出别名 导入别名 整体别名 exp