前端引用vue/element/echarts资源等引用方法Blob下载HTML

news/2024/7/8 2:12:17 标签: 前端, vue.js, echarts

echarts_0">前端引用下载vue/element/echarts资源等引用方法

功能需求
需求是在HTML页面中集成Vue.js、Element Plus(Element UI的Vue 3版本)、ECharts等前端资源,使用Blob下载HTML。

在这里插入图片描述

解决方案概述

  1. 直接访问线上CDN地址:简单直接,但受限于外部网络环境,可能导致加载失败或延迟。
  2. 使用国内CDN加速:通过选择更贴近用户地理位置的CDN服务,提升加载速度,但仍可能受网络波动影响。
  3. 本地下载并引用资源:确保资源可用性,但会增加本地包体积,可能影响应用加载速度。
  4. 后端服务生成并返回HTML:解决前端资源加载问题,但依赖于后端服务器性能和用户网络状况。

这里我们主要分析一下 2/3这两个方案

1. HTML模板构建:
使用Element Plus的组件构建页面结构。
引入必要的CSS样式和JavaScript库。
2. 资源引用:
使用国内CDN服务如jsdelivrunpkg的国内镜像,以减少网络延迟。
确保Vue.js、Element Plus和ECharts的版本兼容性。
3. JavaScript逻辑实现:
使用Vue 3的Composition API(如createApp, ref, onMounted等)构建组件逻辑。
Element Plus中引入所需组件(如ElContainer, ElHeader, ElMain等)。

使用国内的服务 cdn加速访问
  1. dome 渲染

一个button下载按钮

<el-button @click="downloadHtml(scope.row)"> </el-button>

创建一个reportHtml.js文件

亿点小知识 用来导出这个html的js这样更加语义化

export const htmlTemplate = async(htmlData) => {
    return 	`<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
    <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css">
</head>
<style>
    * {
     margin: 0;
     padding: 0;
    }
    .content-container {
        margin-top: 20px;
    }
</style>
<body>
<div id="app">
    <el-container style="background-color: #EFF3F6">

        </el-container>
    </el-container>
</div>

<!-- 引入 Vue 3 -->

<script src="https://cdn.jsdelivr.net/npm/vue@3.2.37/dist/vue.global.prod.js"></script>
<!-- 引入 Element Plus -->

<script src="https://cdn.jsdelivr.net/npm/element-plus@2.7.0/dist/index.full.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js"></script>
<script>
    const { createApp,ref, onMounted } = Vue;
    const { ElContainer, ElHeader, ElMain, ElTable, ElTableColumn } = ElementPlus;
    const app = createApp({
     setup() {
        const baseInfo =  ref(${htmlData}.baseInfo)
        const bugTableData=  ref(${htmlData}.bugTableData)
        const moduleTableData=  ref(${htmlData}.moduleTableData)
        const bugTotalData = ref([
             {name: '高危',itemStyle: {
                color: '#e06666'
              }, value: baseInfo.value.codesVulnHighNum},
              {name: '中危',itemStyle: {
                color: '#5555ff'
              }, value: baseInfo.value.codesVulnMediumNum},
              {name: '低危',itemStyle: {
                color: '#69cc73'
              }, value: baseInfo.value.codesVulnLowNum},
              ])
         const initECharts = () =>{
             const chartDom = document.getElementById('bugTotal')
             const myChart = echarts.init(chartDom);
             const option = {
                title: {
                  text: '漏洞概览',
                  left: 'center'
                },
                tooltip: {
                  trigger: 'item',
                  formatter: '{b} : {c} ({d}%)'
                },
                legend: {
                  top: 'bottom'
                },
                series: [
                  {
                    type: 'pie',
                    radius: '65%',
                    center: ['50%', '50%'],
                    selectedMode: 'single',
                    emphasis: {
                      itemStyle: {
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                      }
                    },
                    labelLine: {
                      show: true
                    },
                    data: bugTotalData.value
                  }
                ]
            }
            myChart.setOption(option);
         }
        onMounted(() => {
            initECharts();
        })
        return {
             baseInfo,
             bugTableData,
             moduleTableData,
             highTableData,
             mediumTableData,
        }
     }
        
    });
    app.use(ElementPlus);
    app.mount('#app');
</script>
</body>
</html>`
};

</script>

最后一步导出html方法

/**
 * 导出html
 */
 let downLoadHtml = async(scanProjectName, scanStartTime)=> {

 const filledHtml = await htmlTemplate(JSON.stringify(htmlData));
 // 创建一个Blob对象,包含HTML内容
 const blob = new Blob([filledHtml], {type: 'text/html'});

 // 创建一个链接元素并设置其href属性为Blob对象的URL
 const url = window.URL.createObjectURL(blob);
 const link = document.createElement('a');
 link.href = url;
 link.setAttribute('download', '测试文件'+.html'); // 设置下载文件名

 // 触发点击事件来下载文件
 document.body.appendChild(link);
 link.click();
 document.body.removeChild(link); // 之后移除链接元素
}

以上就是简单的cdn加速来引入资源

使用访问本地资源进行加载

这里我们只需要改变的是reportHtml.js里面的代码

亿点小知识这里我们利用 axios请求的方法来访问本地资源

首先引入axios

import axios from "axios";

优化方法

这里的逻辑是用axios去请求本地资源来引入 使用变量去使用

export const htmlTemplate = async(htmlData) => {
    let indexCss=``
    let vue3=``
    await axios.get('https://unpkg.com/element-plus/dist/index.css').then(res=>{
        indexCss = res.data
    })
    await axios.get('/public/vue.global.prod.js').then(res=>{
        vue3 = res.data
    })
    return`<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
<style>${indexCss}</style>
</head>

<style>
    * {
     margin: 0;
     padding: 0;
    }
    .content-container {
        margin-top: 20px;
    }
</style>
<script>${vue3}</script>
总结

通过Axios从服务器获取CSS和JavaScript文件的内容,并将这些内容直接嵌入到HTML字符串中。然而,这种方法有几个问题和限制,特别是在处理大型CSS和JS文件时,以及安全性和维护性方面。

首先,将CSS和JS文件的内容直接嵌入到HTML字符串中通常不是一个好的做法,因为这会使生成的HTML文件变得非常大,增加了页面加载时间和内存使用。此外,这样做还可能导致跨站脚本(XSS)攻击的风险增加,因为正在动态地执行从服务器获取的JavaScript代码。

其次,对于Vue.js和Element Plus等现代前端框架和库,它们通常包含复杂的依赖关系和优化策略,这些在直接通过Ajax请求并嵌入到HTML中时可能无法正确处理。
对于下载到本地这种并不推荐
直接在script标签中使用CDN URL或本地路径是更简单、更有效的方法
在这里插入图片描述
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…


http://www.niftyadmin.cn/n/5536282.html

相关文章

yaml格式转换成json格式

yaml格式转换成json格式 ①postman生成的结果是yaml格式 ps&#xff1a;postman输出的格式是没有自动换行的&#xff0c;需要将内容换行 ②复制到Python的脚本跑一趟&#xff1a;自动换行并去掉/n&#xff1b; str " "//(postman输出的内容&#xff09; print(st…

嵌入式系统中的SPI存储突破:STM32与W25Q64 Flash的深度集成

摘要 在嵌入式系统设计中&#xff0c;存储解决方案的选择对性能、可靠性和成本有着深远的影响。W25Q64 Flash存储器以其高容量、低功耗和高速数据传输特性&#xff0c;成为STM32微控制器项目中的优选。本文将深入探讨STM32与W25Q64 Flash的深度集成&#xff0c;包括硬件设计、…

Java类文件

Class文件是以无符号字节为基础单位的二进制流&#xff0c;每个数据项目严格按照顺序紧密地排列在文件中。 版本信息&#xff0c;常量池 常量池中主要放置字面量和符号引用 字面量&#xff1a;文本字符串&#xff0c;final常量 符号引用&#xff1a;导出的包&#xff0c;字段&a…

[k8s生产系列]:k8s集群故障恢复,etcd数据不一致,kubernetes集群异常

文章目录 摘要1 背景说明2 故障排查2.1 查询docker与kubelet状态2.2 查看kubelet服务日志2.3 重启docker与kubelet服务2.3.1 首先kubelet启动起来了&#xff0c;但是报错master节点找不到2.3.2 查询kubernetes集群服务&#xff0c;发现etcd与kube-apiserver均启动异常 2.4 etcd…

uniapp自定义富文本现实组件(支持查看和收起)

废话不多说上代码 CollapseText.vue <template><view v-if"descr"><scroll-view class"collapse-text" :style"{maxHeight: computedMaxHeight}"><!-- <slot></slot> --><rich-text :nodes"descr&q…

Redis 缓存问题及解决

所有问题解决的关键就是尽少的访问数据库&#xff0c;或者避免太集中的访问。 一&#xff0c;缓存穿透&#xff08;key在数据库不存在&#xff09; 当数据既不在缓存中&#xff0c;也不在数据库中&#xff0c;导致请求访问缓存没数据&#xff0c;访问数据库也没数据&#xff0c…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(五)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

软考《信息系统运行管理员》-2.5信息系统运维管理系统与专用工具

2.5信息系统运维管理系统与专用工具 信息系统运维管理系统功能框架 信息系统运维管理系统是站在运维管理的整体视角&#xff0c;基于运维流程&#xff0c;以服务为导向的业务 服务管理和运维管理支撑平台&#xff0c;提供统一管理门户&#xff0c;最终帮助运维对象实现信息系…