带你了解ES6 Module

2023-11-17

1.commonJS
在说 es6 模块以前,我们先来看一下后端普遍使用的打包方式,commonJS的一些特性。

  • 同步加载:也就是串行执行,后面的任务要等到前面任务执行完才能继续执行。
  • 语法:commonJS中使用 require 引入,module.exports 输出。
  • 执行顺序:commonJS输出的是一个值得拷贝。也就是说,一旦输出一个值(该值会被缓存起来),模块内部的变化就不会影响到这个值。过程大概是,先将引入模块执行一遍,再执行后面的方法,等到内容执行完,生成一个变量存储需要输出的内容。

仔细阅读以下代码

// module.js
let a = 1;
function foo(){
    a++;
}
module.exports = {foo, a};

// index.js
let {foo, a} = require('./module.js');
console.log(a); // 1
foo();
console.log(a); // 1

  • 意义:commonJS的意义在于将聚类的方法和变量等限定的私有域中,同时支持导入和导出,将上下游模块无缝衔接,每个模块具有独立的空间,互不干扰。

2.import、export
ES6以后出现的import、export很好的实现了模块功能。核心思想是尽量静态化,使得编译时就能确定依赖关系,以及输出和输入的变量。而commonJS是在运行时确定这些东西。

  • 因为这个原因,有产生了以下两个问题:
    1.import、export都必须写在模块顶层 2.引入的模块应该是可以静态分析的,所以不允许运行时改变。也就是路径中不能使用变量。即无法实现如下代码中展示的require的功能
// commonJS require
let path = './module'
let module = require(path);
  • 异步加载:也就是并发执行,模块几乎同时导入,后面模块不需要等待前面模块导入完成。
  • 语法:ES6 Module中使用import引入,export输出。
  • 执行顺序:ES6 Module 输出的是值的动态引用,不会缓存。还是相同的代码,对比commonJS
// module.js
let a = 1;
function foo(){
    a++;
}
export {foo, a};

// index.js
let {foo, a} = require('./module.js');
console.log(a); // 1
foo();
console.log(a); // 2
  • import 可以执行模块,多次import只会执行一次,import在静态解析阶段执行
import foo from './module';
import foo from './module';

以上代码中foo只会被导入一次

  • import * as module from './module’引入module.js中所有的方法并存放到变量module中。
  • 为模块指定默认输出,一个文件中只能有一个export default,且后面不能跟变量声明的语句
// 与普通输出的区别
export default function add(){}
import add from './add'

export function add(){}
import {add} from './add'

本质上,export default 就是输出一个叫 default 的变量或者方法,然后系统允许你为它重命名。所以下面写法也是等效的

function add(){}

export {add as default}; // 等同于export default add

import {default as foo} from './module'; // 等同于import foo from './module'

3.export 与 import 的复合写法

export {foo,bar} from 'module';
// 等同于
import {foo,bar} from 'module;
export {foo,bar}

上面代码中,export和import语句可以结合为一行代码。但是,写成一行以后,foo和bar实际上没有被导入当前模块,只是相当于当前对外转发了这两个接口,导致当前模块不能直接使用foo,bar。

4.跨模块常量

  • const声明的常量只能在当前代码块中有效。如果想设置跨模块的常量,可以采用以下写法:
export const db = {
    a: '1',
    b: '2',
    ...
}

import {db} from './module';
vue项目中props应用,这样子组件就可以自己修改props中的属性,而不需要通过调用父组件的方法了。
// 父组件
<Child :userInfo="userIinfo"/>
data(){
    return{
        userInfo:{
            name: '小明',
            age:18
        }
    }
}
// 子组件
props:{
    value(){
        type: Object
    }
},
created(){
    this.value.name = '小红';
}

5.import()函数

  • 上文我们说过,import的模块需要静态分析,所以不能用于动态加载。也就不能完成required同样的功能
const path = './' + fileName;
const myModule = required(path);
因此,引入了import()函数,返回一个Promise对象

import (path).then(res=>{
    console.log(res)
}).catch(err=>{
    console.log(res)
})

 - 这个函数的引入起到的很好的作用,比如我们在做多语言加载的时候,我们需要引入语言包,但是我们又不想一次性将所有语言包全部引入,我们只需要引入需要的语言包就可以了,那么就用到了import()函数,下面是一个按需加载语言包的例子
export function loadLanguageAsync(lang){
  if (i18n.locale !== lang){
    if (!loadedLanguages.includes(lang)){
      return import(/* webpackChunkName: "lang-[request]" */ '@/lang/' + lang).then(msgs=>{
        i18n.setLocaleMessage(lang, msgs.default);
        loadedLanguages.push(lang);
        return setI18nLanguage(lang);
      })
    }
    return Promise.resolve(setI18nLanguage(lang));
  }
  return Promise.resolve(lang);
}

6.浏览器加载
传统方法

  • script标签默认是同步加载的,加上defer和async就会开启异步加载。区别:
    defer要等到整个页面在内存中正常渲染结束,才会执行;async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。另外,如果有多个defer脚本,会按照他们在页面中出现的顺序加载,而多个async脚本,是不能保证按顺序加载

es6模块加载

  • 浏览器加载 es6 模块,也是用
<script type="module">
    import {add, redis} from './module';
</script>

node.js加载
node中原本存在的commonJS与es6的模块加载并不兼容。因此node中做了限制
.mjs 文件总是以es6模块加载; .cjs 文件总是以commonJS加载, .js 文件的加载取决于 package.json 中type字段,若 type=“module” 则以es6模块加载,默认commonJS

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带你了解ES6 Module 的相关文章

  • JS 阻止事件冒泡

    冒泡事件就是 你给父元素绑定了一个事件 你点击子元素也会触发这个事件 因为事件是向上冒泡的 阻止冒泡的方法最常见的方法有两种 1 if event target this 使用这个判断就可以确定你点击的元素是否是事件触发的来源 这样就会阻止
  • Web Socket简介

    1 Web Socket 是 HTML5 的新协议 允许服务器端向客户端发送数据 是一种全双工 双向的通信方式 并且它可以保持长时间通信 概念理解 1 全双工 意思就是服务器向浏览器发送数据的同时 浏览器也可以向服务器传递数据 即同时进行信
  • 腾讯智影+IDM进行数字人制作(无限使用)

    腾讯智影 IDM进行数字人制作 无限使用 首先确保您电脑上有windows自带的Edge浏览器 安装IDM下载工具 IDM 安装到浏览器扩展 下载IDM使用工具 链接 https pan baidu com s 1iARibnICpbnOR
  • python监听、操作键盘鼠标库pynput详细教程

    0 0 0 前言 监听 操作鼠标 键盘是实现自动化的捷径 比如我实现自动化签到用到了模拟键盘操作 pynput是监听 操控鼠标和键盘的跨平台第三方python库 你可以通过pip insnall pynput来安装 安装时会自动下载依赖库
  • 北京五棵松:你记忆中的后备箱夜市,来了!

    每个人 可能都有这么一段记忆 到了晚上的时候 我们约好了 来到了老地方 逛夜市 这是我们一贯的小爱好 同样是逛 但不同于逛商场 这里的人 这里的物 这里的景 都是生活的一部分 这里有熟悉的脸 也有陌生的脸 他们有的坐在小凳上 有的倚在墙上或
  • windows net user 添加用户

    文章目录 问题 net user 解决 问题 使用控制面板 设置 添加用户时 显示成这样 可能是因为 win10 家庭版的原因 net user 解决 以管理员身份运行 cmd 执行 net user user name password
  • ​微调神器 Finetuner,提升 CLIP 模型性能

    经证实 在海量的数据集上训练的大型神经网络模型可以完成一些之前被认为是AI领域亟待攻克的问题 例如 正确识别猫和袋鼠的图像一直都被看作非常困难的问题 但现在通过使用大型的神经网络模型已经可以很好地解决 然而 这些模型都是在类别广泛的数据集上
  • 基于Matlab的差分算法优化ANN数据预测

    基于Matlab的差分算法优化ANN数据预测 概述 人工神经网络 Artificial Neural Network ANN 是一种模拟生物神经系统工作机制的计算模型 具有强大的非线性建模和预测能力 然而 在ANN应用于数据预测问题时 常常
  • 负载平衡策略

    负载平衡软件解决方案有LVS HAProxy Nginx等 以Nginx为例负载均衡有以下几种策略 1 轮询 Round Robin 根据Nginx配置文件中的顺序 依次把客户端的web请求分发到不同的后端服务器 如果后端服务器down掉
  • 文件上传能通过ajax上传吗,通过ajax上传文件

    我使用2个文件index js upload php尝试通过ajax上传文件 img 如果成功追加到div uploadfile show 但是它不起作用 有几个问题 下面我的代码有什么建议吗 谢谢 upload php 1 form en
  • Vue脚手架的创建以及Eslint的解决

    1 创建脚手架 win R cmd 打开命令行窗口 运行下面代码 npm i g vue cli 2 cd Desktop 转到桌面 创建项目 vue create 项目名字 例如 vue create test 3 在自己写的项目中 出现
  • MD5加密及随机数生成

    今天贴两个简单的方法 需要的时候不用自己再写 public static String md5 String plaintext MessageDigest m try m MessageDigest getInstance MD5 m r
  • grafana 表格自动刷新

  • POSIX线程:API

    一 线程创建与取消 1 线程创建 1 1 线程与进程 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是为了提高程序的并发度 从而提高
  • [数学]齐次线性方程组的解、SVD、最小二乘法

    AX 0 这是一个齐次线性方程组 一般的非齐次线性方程组AX b其实也都可以化为齐次方程组的形式 所以比较普遍 先要说明在非齐次方程组中 A到底有没有解析解 可以由增广矩阵来判断 r A
  • 颠覆人才市场?区块链凭什么?

    原创 点宽学园 作者 王启瑞 全文字数2509字 建议阅读时长 8 分钟 数字化平台包括 ABCD 四大核心技术 分别是人工智能 A Artificial Intelligence 区块链 B BlockChain 云计算 C Cloud
  • 我的学习体验是这样的,关于

    话说 完全没有想到 自己在知乎发布的第一篇文章 我在知乎学写作 竟然收获到还不错的互动 坦率地说 已经比我的微信公众号推文的效果好太多 我想 这主要是得益于大家对于知乎写作课本身的兴趣吧 到目前为止 虽然还没有修完知乎写作课的全部课程 但是
  • 浮点数在计算机中存储方式、十六进制(HEX)和浮点类型(float、double)转换

    目录 浮点数在计算机中存储方式 举例 8 25和120 5在内存中真正的存储方式 浮点类型转换为十六进制 方法1 用地址用指针 方法2 用共用体 方法3 使用memcpy 十六进制转换为浮点类型 浮点数在计算机中存储方式 https www
  • 多家支付机构停发代理商分润

    分润是POS代理推广的主要收入来源 一旦分润被掐断 意味着POS代理失去了赚钱的来源 近段时间以来 多家支付公司因停发POS代理分润在支付行业内引起了较大争议 涉及十几家支付公司 近日 多家支付公司代理商在公开投诉平台发帖投诉称 后台分润提
  • 详述Java中的异常

    我是目录 一 异常的解决方案 二 异常的基本用法 三 Java异常体系 四 自定义异常 五 面试阐述 所谓 异常 指的就是程序在 运行时 出现错误时通知调用者的一种机制 我们平时把 System out println 拼写错了 写成了 s

随机推荐

  • 第一章 pandas基础-练习题

    第一章 pandas基础 练习题 首先要导入对应的模块 import pandas as pd import numpy as np Ex1 口袋妖怪数据集 现有一份口袋妖怪的数据集 下面进行一些背景说明 代表全国图鉴编号 不同行存在相同数
  • QT基础(三)之添加资源文件及界面美化

    QT基础之添加资源文件及界面美化 QT可以做出非常炫酷的图形界面 通过添加一些资源文件可以对我们的界面进行美化 下面以添加图片资源 美化标签为例 对QT Creator添加资源文件进行学习 一 添加资源文件 1 给工程添加一个新的资源文件
  • C++之标准库(STL)容器List的用法

    文章目录 list说明 list定义 list使用 list赋值操作 list数据元素插入和删除操作 list数据存取 list大小操作 list反转排序 list访问 list说明 链表是一种物理存储单元上非连续 非顺序的存储结构 数据元
  • QtCreator 打不开UI文件

    最近遇到了ubuntu下的QtCreator打开ui 文件时 QT Creator 界面变黑色 程序崩溃 然后自动退出 这儿软件我用了1年了 莫名其妙出现了这个问题 很是费解 重装了QtCreator和QtDesigner 还是不行 在网上
  • Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

    文章目录 一 Endnote文献GBT7714下载 0 起因与发展 1 1进行chinese GBT7714 2015的下载 二 Endnote格式配置及参数的设置 2 1 开始修改配置 重要配置详细分解 英文期刊 中文期刊 三 实战插入文
  • 用matlab进行拉普拉斯滤波,matlab拉普拉斯算子锐化滤波

    一 本文主要是在给出拉普拉斯锐化算子公式的情况下 在matlab上实现代码设计 拉普拉斯算子是最简单的各向同性微分算子 有几种常用的滤波模板 本文使用的是八邻域模板 如下所示 image png 其对应的计算公式为 image png 因此
  • 应用程序,操作系统,驱动程序的关系

    硬件和软件 计算机资源分为硬件资源和软件资源 硬件资源包括cpu 内存 显卡 网卡 声卡 硬盘等等 软件资源包括各种程序 每个硬件完成特定的功能 比如显卡完成在显示设备上显示图形 声卡实现声音的处理 再比如 你用qq发送一段文字给一个同学
  • VUE3使用JSON编辑器

    1 先看看效果图 可以自行选择展示效果 2 这是我在vue3项目中使用的JSON编辑器 首先引入第三方插件 npm install json editor vue3 yarn add json editor vue3 3 引入到项目中 导入
  • 强化学习实践二 :理解gym的建模思想

    David Silver的强化学习公开课有几个特点 个人感觉首要的一个特点是偏重于讲解理论 而且有时候为了讲清楚一个理论的来龙去脉 也顺带讲了很多不常用的理论 还有一个特点是小例子很多 这些例子有时候不仅是为了讲清楚一个复杂的算法 而且通过
  • [Redis] Redis 安装部署

    Redis Redis 安装部署 简介 Redis是一个开源的使用ANSI C语言编写 遵守BSD协议 支持网络 可基于内存亦可持久化的日志型 Key Value 数据库 并提供多种语言的API 它通常被称为数据结构服务器 因为值 valu
  • 查看Postgresql的连接状况

    今天遇到一个问题 就是pg一直报错 说有太多的客户端连接到数据库上面 但现在不知道是什么程序连接 pg默认的max connection是100 我并没有修改过 以为平时公司内部用 应该够了 但现在貌似这100个连接都被消耗掉 在网上goo
  • 【CSS】如何用css做一个爱心

    摘要 HTML的标签都比较简单 入门非常的迅速 但是CSS是一个需要我们深度挖掘的东西 里面的很多样式属性掌握几个常用的便可以实现很好看的效果 下面我便教大家如何用CSS做一个爱心 前期预备知识 明白正方形的画法 明白圆形的画法 明白什么是
  • Android下基于Http协议的网络摄像机开发

    这段时间在做Android平台下的网络摄像机的兼容 摄像机的通讯采用Http1 1协议 现将遇到的问题简单总结一下 1 Http协议中需要用到身份认证部分 不同厂家的摄像机所采取的方案可能有所不同 但是大体无外乎都是将摄像机的用户名和密码简
  • 江科大自化协STM32学习笔记(部分C语言知识、STM32简介和GPIO口的使用)

    本篇文章是根据B站UP主江科大自化协的教学视频STM32入门教程 2023持续更新中 在了解 学习与实操后整理的学习笔记 内容部分来自UP主的课程资料 并包含了一些个人的理解 如有谬误欢迎指正 详细知识点可以观看UP主的视频进行了解 希望大
  • php如何读取解析eml文件以及生成网页的示例分享

    这篇文章主要介绍了PHP读取 解析eml文件及生成网页的方法 结合实例形式分析了PHP操作eml文件的读取 解析 转换等相关实现技巧与注意事项 并附带demo源码供读者下载参考 需要的朋友可以参考下 本文实例讲述了PHP读取 解析eml文件
  • Linux及Windows下编译exosip和osip2源码

    eXosip库及编译流程简介 1 eXosip库的简介 1 1 osip简介 osip2是一个开放源代码的sip协议栈 是开源代码中不多使用C语言写的协议栈之一 它具有短小简洁的特点 专注于sip底层解析使得它的效率比较高 但缺点也很明显
  • 前端通过FormData上传文件到服务器端

    前端代码 html
  • Win 11 打开未知文件/打开方式 该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。

    问题 鼠标右键选中文件 打开方式 或者选择其他应用 弹窗提示 该文件没有与之关联的应用来执行该操作 请安装应用 若已经安装应用 请在 默认应用设置 页面中创建关联 打开注册表 查看是否存在以下路径 HKEY CLASSES ROOT Unk
  • Visual Studio Code如何打开多个tab标签

    原创 Visual Studio Code如何打开多个tab标签 SweetTool的专栏 CSDN博客 在打开文件夹预览的模式下VS Code默认单击打开文件时仅保存一个tab 例如当前window打开一个tabA 然后点击另外一个文件B
  • 带你了解ES6 Module

    1 commonJS 在说 es6 模块以前 我们先来看一下后端普遍使用的打包方式 commonJS的一些特性 同步加载 也就是串行执行 后面的任务要等到前面任务执行完才能继续执行 语法 commonJS中使用 require 引入 mod