Vite项目中的懒加载介绍

news2024/11/19 20:43:57

概述

import.meta 元属性将特定上下文的元数据暴露给 JavaScript 模块。它包含了这个模块的信息,例如这个模块的 URL。在vue3项目中,用的比较多的是通过import.meta.env来获取环境变量。而本文将要介绍的import.meta.globimport.meta.env都是vite提供的功能。

import.meta.glob 允许动态地加载多个模块而不需要显式地列出每个模块地路径。如果需要根据目录结构自动导入文件时,import.meta.glob会非常有帮助。

为什么要用import.meta.glob

这里以实际工作中的一个功能需求为例。

需求:通过后端返回的type去加载不同的表单form,

文件目录结构如下
在这里插入图片描述

  • 不用import.meta.glob
<script setup>
import { ref, watch, computed } from "vue";
import { storeToRefs } from "pinia";
import { SYMBOL_TYPES } from "../../../const/const.map";
import Point from "./forms/Point.vue";
import Polygon from "./forms/Polygon.vue";
import Line from "./forms/Line.vue";
import Model from "./forms/Model.vue";
import Billboard from "./forms/Billboard.vue";
import Billboard_HLJB from "./forms/Billboard_HLJB.vue";
import Label from "./forms/Label.vue";
import LabelExt from "./forms/LabelExt.vue";
import { useMapMarkStore } from "../../../store/useMapMarkStore";

const mapMarkerStore = useMapMarkStore();

const { currentSymbol } = storeToRefs(mapMarkerStore);

const symbolInfo = ref({ ...currentSymbol.value });

watch(currentSymbol, (newValue) => {
  symbolInfo.value = newValue;
});

const currentComponent = computed(() => {
  const { type } = symbolInfo.value;
  switch (type) {
    case SYMBOL_TYPES.Polyline:
      return Line;
    case SYMBOL_TYPES.Point:
      return Point;
    case SYMBOL_TYPES.Polygon:
      return Polygon;
    case SYMBOL_TYPES.Model:
      return Model;
    case SYMBOL_TYPES.Label:
      return Label;
    case SYMBOL_TYPES.Billboard:
      return Billboard;
    case SYMBOL_TYPES.Billboard_HLJB:
      return Billboard_HLJB;
    default:
      return null;
  }
});
</script>
<template>
  <div class="styleManageContent">
    <component :is="currentComponent" />
  </div>
</template>

上面的代码主要是通过watchcomputed去监听type,再通过switch去匹配type返回不同的form组件。

  • 使用import.meta.glob
<script setup>
import { ref, watch, onMounted } from "vue";
import { storeToRefs } from "pinia";
import { SYMBOL_TYPES } from "../../../const/const.map";
import LabelExt from "./forms/LabelExt.vue";
import { useMapMarkStore } from "../../../store/useMapMarkStore";

const mapMarkerStore = useMapMarkStore();

const { currentSymbol } = storeToRefs(mapMarkerStore);

const symbolInfo = ref({ ...currentSymbol.value });

watch(currentSymbol, (newValue) => {
  symbolInfo.value = newValue;
  getCurrentComponent();
});

const currentComponent = ref({});

const getCurrentComponent = async () => {
  const { type } = symbolInfo.value;
  const modules = import.meta.glob(`./forms/*.vue`);
  for (let path in modules) {
    const componentName = path.split("/").pop().split(".").shift();
    if (componentName == type) {
      modules[path]().then((module) => {
        currentComponent.value = module.default;
      });
      break;
    }
  }
};

onMounted(() => {
  getCurrentComponent();
});
</script>
<template>
  <div class="styleManageContent">
    <component :is="currentComponent" />
    <LabelExt v-if="symbolInfo.type != SYMBOL_TYPES.Label" />
  </div>
</template>

使用import.meta.glob,代码就简化了很多,不用导入所有的表单组件,也不用额外去定义常量SYMBOL_TYPES。而且由于import.meta.glob是动态导入,懒加载的方式会提高性能。

  • 这里需要注意的一点就是type值需要和组件名对应上,或者有一个对应关系。

import.meta.glob介绍

基本用法

import.meta.glob接收一个字符串参数,且该参数不能是一个变量,因为import.meta.glob的参数在构建时会被静态分析,用于生成构建时的文件列表,使用变量会导致这些路径在构建时无法明确具体的路径,导致Vite无法解析和生成响应的模块导入代码。

关键点

  • 路径匹配:支持路径通配符

  • 返回值:返回值是一个对象,键是匹配的文件路径,值是动态导入函数

  • 动态导入:返回的值可以动态导入,是一个异步操作

用途

  • 动态加载路由组件、插件、视图等

  • 实现懒加载以优化应用性能

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

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

相关文章

【零基础学习CAPL】——CRC值监控测试

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载车身 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.概述2.需求介绍3.算法4.逻辑判断5.测…

VS2022中文字符输出为乱码的解决

一、问题 vs2022输出中文时&#xff0c;出现乱码现象 二、解决方案 把文件的字符编码格式改为utf-8格式 选择工具&#xff0c;点击自定义 选择命令&#xff0c;点击添加命令 选择文件&#xff0c;点击高级保存选项&#xff0c;然后点击确定 点击高级保存选项 选择utf-8编…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

QLExpress规则引擎简述;字符串公式/脚本运算

概述 在业务中会遇到一些场景的运算方式不是固定的&#xff0c;而且内容不是有规律的&#xff0c;无法落库到表中&#xff08;强行落库后也需要针对该内容硬编码写一段特殊的查询方式&#xff09;&#xff1b; 这个时候将这部分计算抽取出来&#xff0c;用一个动态的脚本去执…

Spring web mvc入门练习

对于Spring方面的知识重在多练习 目录 一、计算器 1、前端界面 2、约定前后端交互接口 3、服务器代码 二、用户登录 前端代码 服务器代码 三、留言板 后端代码 前端代码 一、计算器 我们需要通过前后端的交互最终完成这样的界面以及完成需求 1、前端界面 因为主要…

windows系统离线搭建darknet

没有网的情况下采用将安装包全部都下载下来&#xff0c;再安装的方式。darknet在windows上编译问题比较多&#xff0c;经历了3天的踩坑&#xff0c;终于搭建好。。。下面简单记录一下安装过程。 1.下载cuda,cudnn,anaconda,opencv,opencv_python&#xff0c;vs。安装顺序&…

[Redis] Redis中的Hash类型和List类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

CISP-PTE CMS sqlgun靶场渗透测试

1.打开靶场 2.在搜索框尝试xss <script>alert(1)</script> 发现此处存在xss漏洞 3.在搜索框尝试sql注入 -1 union select 1,2,3# 发现页面有回显 4.查询数据库名 -1 union select 1,database(),3# 5.查询数据库的所有表 -1 union select 1,(select group_conc…

Matlab做二阶函数

关于解答&#xff1a; >> % Expert PID Control % 二阶传递函数的阶跃响应 % 位置式 clc; clear all; close all;n500; % 设置离散点的个数 Ts0.001; % 设置离散的采样时间 epsilon0.001; …

剪辑视频怎么放慢速度?6种方法可以轻易做到

在这个快节奏的短视频时代&#xff0c;视频编辑中的慢动作效果往往能吸引观众的眼球&#xff0c;赋予画面以独特的艺术感和情感深度。但是很多小伙伴不知道该怎么将视频播放速度放缓&#xff0c;今天&#xff0c;给大家分享6种剪辑视频放慢速度的高效方法&#xff0c;一起来学习…

【物理编程】解决物理压力的正确画法

这里写自定义目录标题 压力的画法 压力的画法 该程序是一个交互式的教育工具&#xff0c;它通过可视化的方式帮助学生和教师理解多边形的几何特性以及力的表示方法。以下是该程序的一些优点和对教师的帮助&#xff0c;用专业的语言进行总结&#xff1a; 增强理解力&#xff1a…

98、RS485全自动收发电路入坑笔记

因为RS485采用叉分信号&#xff0c;只支持半双工。正常的RS485芯片驱动电路是需要GPIO来切换发送和接收模式。如下图所示&#xff0c;一般的RS485电平转换芯片都有RE/DE脚&#xff0c;用来切换收发模式。 例如这篇推荐&#xff1a;芯片RS485自动收发电路常见问题与应对策略 但…

【kubernetes】Ingress和Ingress-Controller介绍,高可用应用案例

一&#xff0c;Ingress介绍 Ingress是k8s中一种重要的资源对象&#xff0c;它主要用于定义从集群外部到集群内部服务的HTTP(S)路由规则。用于管理代理 Ingress-Controller的配置文件。 kubectl explain ingress二&#xff0c;Ingress-Controller介绍 Ingress Controller 是 …

[ESP32]:如何在micropython中添加C库

[ESP32]&#xff1a;如何在micropython中添加C库 本文将描述如何在micropython中添加一个基于c语言的led模块。 1.编写c驱动 选择一个目录&#xff1a;examples/usercmodule&#xff0c;建立对应的驱动文件hw_led&#xff1a; . ├── cexample │ ├── examplemodule…

RAG 在企业应用中落地的难点与创新分享

在2024稀土开发者大会-AI Agent与应用创新分会上&#xff0c;我有幸分享了我们团队在企业应用中实施RAG&#xff08;检索增强生成&#xff09;的难点与创新。希望通过这篇文章&#xff0c;与大家探讨我们在实践中遇到的问题和解决方案&#xff0c;为从事相关工作的朋友提供一些…

Spring2-入门

目录 入门案例 案例分析 Log4j2日志框架 Log4j2日志概述 引入依赖 加入日志配置文件 使用日志 入门案例 1.引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&qu…

技术速递|VS Code Java 8月更新 - 重要 Gradle 更新!用户体验与入门向导增强

作者&#xff1a;Nick Zhu 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Visual Studio Code for Java 八月更新&#xff01;在这篇博客中&#xff0c;我们将涵盖重要 Gradle 更新、更多用户体验改进以及更好的入门体验&#xff0c;马上开始吧&#xff01; Gradle 更…

eclipse配置maven

eclipse配置maven 启动 Eclipse&#xff0c;转到 Window > Preferences 在左侧导航栏中&#xff0c;展开 Maven 节点。 在 User Settings 下&#xff0c;单击 Add。 浏览到 Maven 安装目录中 conf/settings.xml 文件。 在 Global Settings 下&#xff0c;单击 Add。 浏览到…

详解Diffusion扩散模型:理论、架构与实现

本文深入探讨了Diffusion扩散模型的概念、架构设计与算法实现&#xff0c;详细解析了模型的前向与逆向过程、编码器与解码器的设计、网络结构与训练过程&#xff0c;结合PyTorch代码示例&#xff0c;提供全面的技术指导。 关注TechLead&#xff0c;复旦AI博士&#xff0c;分享A…