当前位置: 首页 > 知识库问答 >
问题:

前端 - vue使用externals分离依赖,同时我想使用动态获取最快CDN来加载,要怎么实现呢?

阴永逸
2024-06-17

webpack配置:

externals = {    vue: 'Vue',    axios: 'axios'}

正常是在html中使用固定的cdn链接加载:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.16/vue.min.js"></script>....

以上是没问题的,但是国内cdn不稳定,我想从多个cdn中使用最快的cdn,于是我写了个函数:

loadFastCdnScripts() {  // 此处动态判断多个cdn链接速度,选择最快的cdn来并添加到头部,此处代码实现没问题}

我不知道该把loadFastCdnScripts函数放在哪执行?怎么让Cdn加载完后才加载主程序呢?因为运行总是报Vue is undefined,似乎主程序总是优先于cdn加载

共有1个答案

慕容高卓
2024-06-17

为了在 Vue 项目中动态地选择并使用最快的 CDN 来加载外部依赖(如 Vue 和 axios),你需要确保 CDN 脚本在应用程序的其它脚本之前加载,并在它们加载完成后再初始化你的 Vue 应用。这可以通过使用 JavaScript 的事件监听来实现,比如监听 DOMContentLoaded 事件或者监听特定脚本的加载完成。

下面是一个基本的实现思路:

  1. 在 HTML 中不要直接添加 <script> 标签来加载 CDN 资源。
  2. 编写 loadFastCdnScripts 函数,该函数负责动态选择 CDN 并插入 <script> 标签到 <head> 中。
  3. loadFastCdnScripts 函数中为每个 CDN 脚本添加 onload 事件监听器,以确认它们何时加载完成。
  4. 一旦所有必要的 CDN 脚本都加载完成,触发一个自定义事件或者调用一个回调函数来初始化你的 Vue 应用。

以下是一个简化的代码示例,演示了如何实现这个过程:

// 假设这个函数能够返回最快的 CDN URLfunction getFastCdnUrl(library) {  // ... 这里是选择最快 CDN 的逻辑 ...  return 'https://fast-cdn.example.com/' + library + '.min.js';}// 加载 CDN 脚本的函数function loadCdnScript(url, callback) {  return new Promise((resolve, reject) => {    const script = document.createElement('script');    script.src = url;    script.async = true;    script.onload = () => {      resolve();      if (typeof callback === 'function') {        callback();      }    };    script.onerror = (error) => {      reject(error);    };    document.head.appendChild(script);  });}// 动态加载 Vue 和 axios 的 CDN 脚本async function loadFastCdnScripts() {  const vueUrl = getFastCdnUrl('vue');  const axiosUrl = getFastCdnUrl('axios');  // 等待 Vue 和 axios 加载完成  await Promise.all([    loadCdnScript(vueUrl),    loadCdnScript(axiosUrl)  ]);  // 所有 CDN 脚本加载完成后,初始化 Vue 应用  initializeVueApp();}// 初始化 Vue 应用的函数function initializeVueApp() {  // 在这里初始化你的 Vue 实例  new Vue({    // ...  }).$mount('#app');}// 在页面加载完成后加载 CDN 脚本document.addEventListener('DOMContentLoaded', () => {  loadFastCdnScripts();});

请注意,以上代码仅提供了一个基本的框架,你需要根据自己的项目结构和需求来调整。特别是 getFastCdnUrl 函数需要实现具体的 CDN 选择逻辑,比如可以发送预加载请求并测量响应时间等。

确保在调用 initializeVueApp 之前,Vue 和 axios 的 CDN 脚本已经成功加载到页面上。通过这种方式,你就可以动态地选择并使用最快的 CDN 来加载你的依赖,并且保证在它们加载完成后再初始化 Vue 应用。

 类似资料:
  • 代码地址 要如何正确引入ant并使用呢?

  • 动态加载需要在点击之后才能搜索到子节点的内容。该怎么实现不点击,也能搜索到子节点的呢? 当没有搜索到内容时,v-model可以获取到输入的这个值吗?

  • 本文向大家介绍VUE+node(express)实现前后端分离,包括了VUE+node(express)实现前后端分离的使用技巧和注意事项,需要的朋友参考一下 vue作为前端的框架,node(express)作为后端的框架。无数据库,使用端口保存数据。 VUE: 使用vue-cli构建vue项目(vueapp)。 axios:(与ajax相似) axios没安装的记得装一下。(安装不细说) nod

  • 本文向大家介绍使用ajax+jqtransform实现动态加载select,包括了使用ajax+jqtransform实现动态加载select的使用技巧和注意事项,需要的朋友参考一下 今天在工作的时候遇到一个问题,页面中公司名称是在项目名称选择后用ajax读取出来的。但是jqtransform是在页面加载完成后调用的,所以导致了公司名称下拉框无法展示最新的数据。 用firebug可以看到数据其实已

  • vue实现动态按钮借助iview的Button,由于这些按钮是配置出来的,目前没有代码,还不清楚怎么写,所以麻烦大佬们了 如图 期望能在各个vue组件使用的,然后通过不同的点击来触发事件,希望大佬们,给个思路

  • 我正在使用maven-shade-plugin创建一个包含我项目所有依赖项的可执行jar。有时,这些依赖项会带来自己的依赖项,这些依赖项会与其他库的依赖项发生冲突,而maven-shade-plugin会警告我不确定在uber jar中包含哪个版本。 通常,我对此警告的回应是使用

  • 最近在学习java,ruoyi框架模仿com.ruoyi.framework.config.MybatisConfig,我的方法会报错显示无法自动装配。找不到 'DataSource' 类型的 Bean。但他的我也没看到有写实体类这是怎么做到的? 图一是ruoyi的 图二是我的

  • 我想用cdn的axios 但是我得到了一个错误:拒绝加载脚本的https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'因为它违反了以下内容安全策略指令:“script src'self'”。请注意,未显式设置“script src elem”,因此将“script src”用作回退。