前端前端Vue项目动态切换依赖库版本
Vapaus Qi背景
大多数项目中要封装对应的业务组件来提供给对应的用户使用。所以基于现有工程的技术框架封装了一系列的组件,并上传至私服,对外提供并使用。
封装组件的过程不多赘述,大家可以自行查阅资料或者参考此文档来进行封装(Vue封装组件并发布到npm仓库)。
在此步骤之后,通常我们就会在现有工程通过 npm install xxxx
命令来安装对应的组件及版本,并使用。
那么如何不在package.json写固定的版本号,而可以使用动态的方法进行组件的注册呢:
比如A用户觉得1.0版本的SDK足以满足他的日常需求,新版本的内容他不感兴趣会一直维持此版本的使用,而B用户觉得1.0版本的SDK不够用,他需要使用新版本的功能,那么此时A用户和B用户就需要使用两个不同的版本。
解决方案
1、不同版本通过后端接口来获取,后端返回对应SDK的版本号及引入SDK需要的js、css文件地址。
2、前端页面加载对应的js, css, 并使用vue.component()来注册组件进行使用。
说明:
当你直接引入index.js和index.css文件时,它们实际上包含了如下内容
index.js:包含了组件的JavaScript逻辑,包括Vue组件的定义、状态管理、事件处理以及模板的渲染逻辑。这个文件会动态创建并插入相应的DOM元素到页面上
index.css:包含了组件的样式定义,确保组件在页面上显示时具有正确的样式
代码实现
1、 获取文件进行加载
2、 将加载好的文件进行注册
3、 在生命周期内执行加载SDK方法
4、 在模板区域使用组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <template> <div> <my-component v-if="showMyComponent" :key="tagMyComponent"></my-component> </div> </template>
<script> export default { data() { return { showMyComponent: false, tagMyComponent: 1 } }, mounted() { this.loadComponent(jsCdn, cssCdn); }, methods: { loadComponent(jsCdn, cssCdn) { const script = document.createElement('script'); script.src = jsCdn; const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = cssCdn; const loadScript = new Promise((resolve, reject) => { script.onload = () => { console.log(`SDK版本资源 ${cdn} 加载成功.`); resolve(); }; script.onerror = () => { console.error(`SDK版本资源 ${cdn} 加载失败.`); reject(); }; }); const loadStyle = new Promise((resolve, reject) => { link.onload = () => { console.log(`样式文件 ${cssCdn} 加载成功.`); resolve(); }; link.onerror = () => { console.error(`样式文件 ${cssCdn} 加载失败.`); reject(); }; }); Promise.all([loadScript, loadStyle]) .then(() => { this.registerComponent(); }) .catch(() => { console.error('SDK组件或样式加载失败.'); }); document.head.appendChild(script); document.head.appendChild(link); }, registerComponent() { Vue.component('MyComponent', window['MyComponent']); console.log('SDK组件挂载成功', Vue.options.components); this.showMyComponent = true; this.tagMyComponent += 1; } } } </script>
|