ts 动态加载import()

2023-05-16

import()函数 

简介

import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适)。所以,下面的代码会报错。

  1. // 报错
  2. if (x === 2) {
  3. import MyModual from './myModual';
  4. }

上面代码中,引擎处理import语句是在编译时,这时不会去分析或执行if语句,所以import语句放在if代码块之中毫无意义,因此会报句法错误,而不是执行时错误。也就是说,importexport命令只能在模块的顶层,不能在代码块之中(比如,在if代码块之中,或在函数之中)。

这样的设计,固然有利于编译器提高效率,但也导致无法在运行时加载模块。在语法上,条件加载就不可能实现。如果import命令要取代 Node 的require方法,这就形成了一个障碍。因为require是运行时加载模块,import命令无法取代require的动态加载功能。

  1. const path = './' + fileName;
  2. const myModual = require(path);

上面的语句就是动态加载,require到底加载哪一个模块,只有运行时才知道。import语句做不到这一点。

因此,有一个提案,建议引入import()函数,完成动态加载。

  1. import(specifier)

上面代码中,import函数的参数specifier,指定所要加载的模块的位置。import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载。

ES6 import()返回一个 Promise 对象。下面是一个例子。

  1. const main = document.querySelector('main');
  2. import(`./section-modules/${someVariable}.js`)
  3. .then(module => {
  4. module.loadPageInto(main);
  5. })
  6. .catch(err => {
  7. main.textContent = err.message;
  8. });

import()函数可以用在任何地方,不仅仅是模块,非模块的脚本也可以使用。它是运行时执行,也就是说,什么时候运行到这一句,也会加载指定的模块。另外,import()函数与所加载的模块没有静态连接关系,这点也是与import语句不相同。

import()类似于 Node 的require方法,区别主要是前者是异步加载,后者是同步加载。

适用场合

下面是import()的一些适用场合。

(1)按需加载。

import()可以在需要的时候,再加载某个模块。

  1. button.addEventListener('click', event => {
  2. import('./dialogBox.js')
  3. .then(dialogBox => {
  4. dialogBox.open();
  5. })
  6. .catch(error => {
  7. /* Error handling */
  8. })
  9. });

上面代码中,import()方法放在click事件的监听函数之中,只有用户点击了按钮,才会加载这个模块。

(2)条件加载

import()可以放在if代码块,根据不同的情况,加载不同的模块。

  1. if (condition) {
  2. import('moduleA').then(...);
  3. } else {
  4. import('moduleB').then(...);
  5. }

上面代码中,如果满足条件,就加载模块 A,否则加载模块 B。

(3)动态的模块路径

import()允许模块路径动态生成。

  1. import(f())
  2. .then(...);

上面代码中,根据函数f的返回结果,加载不同的模块。

注意点

import()加载模块成功以后,这个模块会作为一个对象,当作then方法的参数。因此,可以使用对象解构赋值的语法,获取输出接口。

  1. import('./myModule.js')
  2. .then(({export1, export2}) => {
  3. // ...·
  4. });

上面代码中,export1export2都是myModule.js的输出接口,可以解构获得。

如果模块有default输出接口,可以用参数直接获得。

  1. import('./myModule.js')
  2. .then(myModule => {
  3. console.log(myModule.default);
  4. });

上面的代码也可以使用具名输入的形式。

  1. import('./myModule.js')
  2. .then(({default: theDefault}) => {
  3. console.log(theDefault);
  4. });

如果想同时加载多个模块,可以采用下面的写法。

  1. Promise.all([
  2. import('./module1.js'),
  3. import('./module2.js'),
  4. import('./module3.js'),
  5. ])
  6. .then(([module1, module2, module3]) => {
  7. ···
  8. });

import()也可以用在 async 函数之中。

  1. async function main() {
  2. const myModule = await import('./myModule.js');
  3. const {export1, export2} = await import('./myModule.js');
  4. const [module1, module2, module3] =
  5. await Promise.all([
  6. import('./module1.js'),
  7. import('./module2.js'),
  8. import('./module3.js'),
  9. ]);
  10. }
  11. main();

       import("../script/XMDefine").then(
            (moudle) => {
                console.log(moudle);
                moudle.XMDefine.ActicitiesID;
                console.log(moudle.XMDefine.ActicitiesID);
            });

        let ts = import("../script/XMDefine");
        console.log((await ts).XMDefine.ActicitiesID);

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

ts 动态加载import() 的相关文章

  • 集成Python和QML

    Qt包括QML作为一种声明性地描述用户界面并使用JavaScript作为其中的脚本语言的手段 可以编写完整的独立QML应用程 序 xff0c 或将它们与C 43 43 结合使用 PyQt5允许QML以完全相同的方式与Python集成 特别是
  • 个人小型管理服务器 SVN的安装和使用方法

    1 下载TortoiseSVN客户端 官网下载地址 Downloads TortoiseSVN 注意下载跟你电脑位数匹配 64位 32位 的安装包 在页面的下面你还可以找到语言包 如图 下载完成后 应该有这些安装包 如图 接下来我们安装To
  • Ubuntu20.04下安装QtCreator 5.14.2(安装/卸载/创建快捷键/添加收藏)

    原文链接 xff1a https www dianyuan com eestar article 2864 html 都是自己原创 xff0c 发这里提高下知名度 xff0c 也帮助需要的人 一 Qt和Qt Creator的区别 Qt是C
  • WPF中自定义双滑块Slider

    项目中遇到需要双滑块的情况 xff0c 可以网上的基本都是单滑块的样式和例子 xff0c 但是双滑块的很少 xff0c 后来终于在网上找到一个大神的帖子 xff0c 通过修改和完善终于符合自己的需求 xff0c 可后来再查看代码的时候好像又
  • C#通过API对硬件进行禁用和启用

    慢慢的随着年龄的增长 xff0c 脑子越来越不够用 xff0c 而自己的收藏栏也越来越杂乱 xff0c 虽然现在的网上要啥都有 xff0c 但是没有经过自己亲手实验和整理总结 xff0c 下次需要的时候一切又要从头开始 xff0c 而电子星
  • Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

    项目需求控制和打开两个USB摄像头 xff0c 并且根据相机的PID和VID来打开指定的相机 xff0c 来区分主副相机 xff0c 在Windows下可以通过AForge Video DirectShow库来实现 xff0c 但是Ubun
  • ubuntu在arm平台下编译安装opencv(亲测可用)

    X86平台安装很多软件一句话就可以搞定 xff0c 非常方便 xff0c 但是在arm平台一个简单的软件安装起来都非常费尽 xff0c 一个软件安装就要折腾好几天 下面就把安装opencv的过程记录下来 一 通过pip安装opencv xf
  • ubuntu在arm平台下编译安装Qt5.15.2和PySide2(亲测可用)

    一 安装Qt5 15 2 1 下载源码首先在官网下载Qt5 15 2的源码 xff1a https download qt io archive qt 5 15 5 15 2 single 2 先安装编译qt的环境 sudo apt get
  • ubuntu20.04安装cmake详细教程

    一 命令行安装 xff08 这种直接安装cmake xff0c 其实安装的版本都太老了 xff0c 这种方式不推荐 xff09 sudo apt install cmake 二 Cmake源码编译安装 1 更新一下g 43 43 已经安装请
  • ubuntu20.04编译安装qt5.14.2和qtcreator4.12.0

    编译qt5 14 2 本来编译安装的是qt5 15 2 xff0c 编译安装ok xff0c 一切就绪 xff0c 安装qtcreator安装后一直报错 xff0c 以下插件有错误 xff0c 无法载入 xff1a QmlDesigner
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • WPF DocumentViewer控件如何隐藏搜索栏/工具栏/部分按钮

    WPF DocumentViewer中默认是显示工具栏和搜索栏的 xff0c 如果想隐藏工具栏和搜索栏 xff0c 可以通过以下代码实现 lt DocumentViewer gt lt DocumentViewer Resources gt
  • 什么是stl? 如何使用stl?

    1 什么是STL xff1f STL Standard Template Library 是C 43 43 的标准模板类库 STL是一个功能强大的基于模板的容器库 xff0c 通过直接使用这些现成的标准化组件可以大大提高算法设计的效率和可靠
  • STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

    一 目标实现 通过网络通信的方式 xff0c 当上位机发出对应指令给STM32 xff0c STM32根据收到的指令来执行对应的操作 xff08 例如 xff1a 亮灯 灭灯 闪灯等 xff09 还有可以将STM32连上路由器 xff0c
  • STM32: ADC采样频率及相应时间的确定

    转载自 xff1a http m elecfans com article 594153 html 一 STM32 ADC 介绍 STM32 ADC 是一个12 位精度 一种逐次逼近型模拟数字转换器 它有多达18个通道 xff0c 可测量1
  • Windows中使用GCC编译STM32CubeMx生成的Makefile文件

    1 下载ARM官方对应Cortex M内核的GCC编译器 xff1a https developer arm com tools and software open source software developer tools gnu t
  • STM32-USB学习系列(四):USB-HID模拟鼠标功能

    一 整体步骤 使用STM32CubeMX 生成 HID 模版自己定义mouseHID 结构体 xff0c 然后通过发送鼠标报文控制鼠标的移动 二 STM32CubeMX 配置 芯片 xff1a STM32F407VG 使用USB的时候 xf
  • STM32实用应用系列:串口接收不定长数据(HAL库 UART + DMA)

    目录 一 串口接收不定长数据的实现思路 二 具体实现代码 1 USART 的配置 2 DMA的配置 xff08 放在 HAL UART MspInit 中 xff09 3 USART 中断处理函数 一 串口接收不定长数据的实现思路 在串口通
  • 使用Ventoy制作启动盘

    目录 一 Ventoy介绍 二 Ventoy的使用 三 Ventoy中MBR分区形式与GPT分区形式对比 四 使用自定义的EFI的步骤 Ventoy下载地址 xff1a https www ventoy net cn index html
  • DRAM知识整理系列(三):部分时序参数整理

    目录 一 时序参数整理 第一时序 xff1a 1 tCL CAS Lantency Control 2 tRCD RAS to CAS Delay 3 tRP Row Precharge Timing 4 tRAS RAS Active T

随机推荐

  • ROS移动机器人开发——硬件引脚

    我们使用的32开发板为冰达机器人官方的开发板 xff0c 类型为STM32RCT6 32章节的目的为 xff0c 将官方所给源码转化为 官方标准库函数来进行使用 需求提出 xff1a 电源 1 3 3V 200ma供电 2 输入 9 12
  • UDS知识整理(一):UDS简介与UDS要求规范简介

    本文参考自 xff1a ISO DIS 14229 1 一 汽车诊断与OSI模型对比 注 xff1a OSI全称 xff1a Open System Interconnection Reference Model xff0c 即开放式系统互
  • Renesas:配置中断的常规流程——使用C语言方式配置中断向量表(二)

    Renesas xff1a 配置中断的常规流程 不吃鱼的猫丿的博客 CSDN博客 在前面的文章讲到了Renesas的常规中断配置流程 xff0c 当需要添加新的中断时 xff0c 每次都需要到boot asm中添加中断服务的函数名与中断服务
  • 工作经验总结:MCU寄存器库的开发

    目录 一 寄存器的结构体定义 二 寄存器的地址的宏定义 在进行MCU开发的时候 xff0c 可能会遇到需要自己手写寄存器库的情况 xff0c 以下整理了一些相关的示例以及注意事项 一 寄存器的结构体定义 注意 xff1a 在定义寄存器结构体
  • 汽车标定知识整理(三):CCP报文可选命令介绍

    目录 一 可选命令 CRO命令报文的可选命令表 xff1a 二 可选命令帧格式介绍 1 GET SEED 获取被请求资源的种子 xff08 0x12 xff09 2 UNLOCK 解锁保护 xff08 0x13 xff09 3 SET S
  • LIN资料整理(一):LIN入门简介

    目录 一 LIN是什么 1 LIN简介 2 LIN的适用场景 3 LIN协议版本 4 LIN的主从机节点 主从机任务与LIN总线特点 一 LIN是什么 1 LIN简介 LIN 是Local Interconnect Network 的缩写
  • LIN资料整理(二): LIN协议层

    目录 一 LIN帧的结构 1 帧头的帧结构 xff08 1 xff09 同步间隔段 xff08 2 xff09 同步段 xff08 3 xff09 受保护ID段 2 应答的帧结构 xff08 1 xff09 数据段 xff08 2 xff0
  • Altium designer学习(一)AD画板流程总结

    AD画板 xff0c 初学者总是容易犯上一个手忙脚乱的错误 一会儿去找封装 xff0c 一会儿又去忙原理图 这样都是很影响效率的事情 xff0c 要解决这个问题 xff0c 那就是画板得确定下来一个合理的流程 因此 xff0c 在第一篇就强
  • 网络编程(UDP/TCP)

    1 网络模型 数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序 xff0c 中间需要经历很多过程 xff0c 有多方参与对数据进行层层封装 转发 我们把这个流程在逻辑上进行分层 xff0c 每一层根据本层的规章制度 协议 各司其
  • postman使用教程

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 市场上有很多优秀的 xff0c 完善的接口测试工具 xff0c 比如SoapUI xff0c Postman xff0c JMeter yapi等 xff0c
  • 请求头和请求体

    1 请求行 请求方式 请求url 请求协议 版本 GET login html HTTP 1 1 请求方式 xff1a HTTP协议有7中请求方式 xff0c 常用的有2种 GET xff1a 1 请求参数在请求行中 xff0c 在url后
  • spring security 自定义多种方式登录授权(普通用户、管理员、第三方登录)

    1 自定义token xff0c 继承 AbstractAuthenticationToken 目的 xff1a 主要用于包装区别过滤条件 第2步用到 span class token keyword public span span cl
  • STM32F30X USART串口初始化顺序

    void InitUart void GPIO InitTypeDef GPIO InitStructure if 1 USART USED 61 61 USART1 RCC AHBPeriphClockCmd RCC AHBPeriph
  • java学习记录(一)

    前言 因为在大创项目中要用到一点点java 所以想利用这段时间 快速的入门一下简单的Java 试图在项目中不拖后腿 ps 小白自学 如有错误还请指正 偶然间看到编程的学习要点 在此记录一下 明确学习目标 锁定一门语言版本 努力学习 认真研读
  • C++ 之HTTP post请求

    一 建立会话 xff08 Session xff09 对象 xff1a CInternetSession mysession 二 连接到Http服务器 xff1a CHttpConnection myconn 61 mysession Ge
  • C语言Printf函数深入解析

    Printf这个函数让大家又爱又恨 xff0c 第一次接触c语言编程 xff0c 基本都是调用printf打印 Hellow World xff01 但当真正深入使用编程后 xff0c 才发现printf并不是一个简单的函数 尤其是从事嵌入
  • SQL笔试经典50题及答案解析

    转 SQL笔试经典50题及答案解析 建表语句 create table Student sid varchar 10 sname varchar 10 sage datetime ssex nvarchar 10 insert into S
  • redis高可用集群搭建

    redis高可用集群搭建 恶魔的复活的博客 CSDN博客 redis集群搭建
  • 80027efe

    微软更新了签名算法 xff0c 从 2019 年开始 xff0c 开始弃用SHA 1 xff0c 逐步改为SHA 2加密算法 导致windows upate更新报80072EFE错误 此方法同样适用于Windows 7系统 建议手动下载安装
  • ts 动态加载import()

    import 函数 简介 import命令会被 JavaScript 引擎静态分析 xff0c 先于模块内的其他模块执行 xff08 叫做 连接 更合适 xff09 所以 xff0c 下面的代码会报错 报错if x 61 61 61 2 i