js中动态获取页面的script地址,并动态给他添加script标签和地址,解决页面白屏问题

2023-11-10

前言:(业务逻辑)

       在vue中,遇到这样的情况,初始化加载太多js,导致页面白屏,为了解决这个情况,决定使用具体组件具体加载相应的cdn地址。

        为啥不用vue的按需加载呢,是因为我们项目对性能要求很高,但是按需加载后,引入的插件包,打包以后的大小比cdn要大太多了,整体来说是使用他是得不偿失,但是一次性加载太多cdn又会导致白屏,所以在这里我使用的方法:具体某个页面使用第三方插件,就在使用的页面js动态加载scirpt,并给他上标签

具体操作:

1、面临第一个问题,要先获取到当前页面所用到的所有引入 的  <script>,下面的newArr 就是拿到的所有的script地址

 let scriptsArr = document.getElementsByTagName('script')
      let newArr = []
      //获取所有的script地址
      for (var i = 0; i < scriptsArr.length; i++) {
        newArr.push(scriptsArr[i].getAttribute('src', 4))
      }

 

2、给界面加载我们想放进去的cdn地址,因为vue是单页面组件,所有我们直接放在 #app上

       // 创建script标签,引入外部文件
        let script = document.createElement('script')
        script.type = 'text/javascript'
        script.src = url
        document.getElementById('app').appendChild(script)

分享源码:

  mounted中调用:(必须是mounted,不能是created,必须等页面加载完成才能挂载)

 let url = '//cktcdn.kaoti100.com/cdn.jsdelivr.net/npm/vue-aplayer/vue-aplayer.js'
    this.app_script(url)//初始化给他添加cdn地址
methods里面定义方法
    /**
     * 获取页面上的所有script地址。来判断是否要加cdn地址
     * */
    app_script(url) {
      let scriptsArr = document.getElementsByTagName('script')
      let newArr = []
      //获取所有的script地址
      for (var i = 0; i < scriptsArr.length; i++) {
        newArr.push(scriptsArr[i].getAttribute('src', 4))
      }
      let isFirst = true //判断是否加载过这个script,有就不加载了
      let cdnUrl = url
      newArr.forEach(item => {
        if (item === cdnUrl) {
          isFirst = false
        }
      })
      if (isFirst) {
        // 创建script标签,引入外部文件
        let script = document.createElement('script')
        script.type = 'text/javascript'
        script.src = url
        document.getElementById('app').appendChild(script)
      }

    },

到此为止!

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

js中动态获取页面的script地址,并动态给他添加script标签和地址,解决页面白屏问题 的相关文章

  • Junit中使用线程池不执行任务代码

    1 在test中使用线程池发送MQ 没有报错 没有执行线程池中的代码 2 查资料 junit框架只要主线程结束完成 单元测试就会关闭 导致线程池中的线程没有执行代码就被销毁关闭了 可以在主线程中sleep一段时间 或者用main方法

随机推荐

  • 稳定ORACLE的执行计划

    很多时候可能我们都希望CBO能够帮我们生成正确 高效的执行计划 但是很多时候事实并非如此 可能因为各种各样的原因 如 统计信息不正确或者CBO天生的缺陷等 都会导致生成的执行计划特别的低效 之前的一家公司有一台专门用于批量做数据校验清洗的数
  • 大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

    大学四年 看课本是不可能一直看课本的了 对于学习 特别是自学 善于搜索网上的一些资源来辅助 还是非常有必要的 下面我就把这几年私藏的各种资源 网站贡献出来给你们 主要有 电子书搜索 实用工具 在线视频学习网站 非视频学习网站 软件下载 面试
  • 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    vue时 报 vue cli service 不是内部或外部命令 也不是可运行的程序 或批处理文件 罪该万死 怎么能忘记 npm install 如果你下载的淘宝镜像 也可以cnpm install 转载于 https www cnblog
  • Java设计模式-状态模式

    1 概述 定义 对有状态的对象 把复杂的 判断逻辑 提取到不同的状态对象中 允许状态对象在其内部状态发生改变时改变其行为 例 通过按钮来控制一个电梯的状态 一个电梯有开门状态 关门状态 停止状态 运行状态 每一种状态改变 都有可能要根据其他
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • js操作剪贴板讲解

    文章目录 复制 剪切 到剪贴板 Document execCommand Clipboard复制 Clipboard writeText Clipboard write copy cut事件 从剪贴板进行粘贴 document execCo
  • 【E2EL5】A Year in Computer Vision中关于图像增强系列部分

    http www themtank org a year in computer vision 部分中文翻译汇总 https blog csdn net chengyq116 article details 78660521 The M T
  • eclipse修改文字显示大小及html乱码修改编码格式

    1 修改字体大小 2 修改编码格式 html文件出现乱码时需要修改编码格式 备注 有时候修改后还会是乱码 重启eclipse即可
  • 2022年7月3日leetcode每日一题打卡——112.路径总和

    一 题目描述与要求 112 路径总和 力扣 LeetCode 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 判断该树中是否存在 根节点到叶子节点 的路径 这条路径上所有节点值相加等于目标和 target
  • 基于YOLO-V5的结核杆菌目标检测系统【毕业设计,AI+医疗】

    项目背景 结核病 Tuberculosis TB 是由结核分枝杆菌 Mycobacterium tuberculosis 引起的一种慢性人畜共患病 它不受年龄 性别 种族 职业 地区的影响 人体许多器官 系统均可患结核病 其中以肺结核最为常
  • HBase Java 编程

    一 环境配置 1 引入Maven 库
  • JavaScript 中使用Ajax进行网络post请求和get请求

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 使用Ajax进行网络请求 默认是异步请求 而且不需要刷新页面 就可以发送请求 获取服务端返回来的数据 一 Ajax的get请求 做
  • apache kafka配置中request.required.acks含义

    Kafka producer的ack有3中机制 初始化producer时的producerconfig可以通过配置request required acks不同的值来实现 0 这意味着生产者producer不等待来自broker同步完成的确
  • 算法--大数开方

    之前已找到比较好的大数乘法算法 现在我们来解决大数开方问题 如有大数n 求其开方x 则x与n必满足x x n 也就是说我们能遍历x找到n的开方 但是问题在于我们是不可能对大数遍历的 如果我们可以确定它的大致范围 仅仅测试几个不容易直接判断的
  • SpringBoot使用Rabbit多消费者削峰

    文章目录 场景 配置 生产者发送消息 消费者处理消息 场景 前端系统推送大批量数据进入我方系统进行处理 为了减轻我方系统的压力 并且充分发挥服务器的性能 提高处理效率 于是使用 Rabbit 做了限流处理 同时有多线程运行多个消费者处理任务
  • QGraphicsItem的缩放

    QGraphicsItem的缩放 QgarphicsItem是Qt视图体系中的项 QGraphicsItem本身是不支持鼠标拖动来缩放的 本文介绍如何通过更改鼠标事件来修改项的大小 本文所用Qt版本为Qt4 8 下文代码实现的功能为 按住s
  • LLVM+clang+VS Code 搭建 C++ 编译环境(windows)

    可参考LLVM clang VS Code 搭建 C 编译环境 windows
  • Bluetooth 蓝牙介绍(七):逻辑链路控制和适配协议规范(L2cap 协议)

    文章目录 前言 L2CAP 特性 前提 术语 常规操作 通道标识符 操作模式 数据包格式 CONNECTION ORIENTED CHANNELS IN BASIC L2CAP MODE CONNECTIONLESS DATA CHANNE
  • 【C++】返回值是类名和返回值是引用的区别

    返回非引用类型 函数的返回值用于初始化在调用函数时创建的临时对象 temporary object 如果返回类型不是引用 在调用函数的地方会将函数返回值复制给临时对象 在求解表达式的时候 如果需要一个地方存储其运算结果 编译器会创建一个没命
  • js中动态获取页面的script地址,并动态给他添加script标签和地址,解决页面白屏问题

    前言 业务逻辑 在vue中 遇到这样的情况 初始化加载太多js 导致页面白屏 为了解决这个情况 决定使用具体组件具体加载相应的cdn地址 为啥不用vue的按需加载呢 是因为我们项目对性能要求很高 但是按需加载后 引入的插件包 打包以后的大小