记录--Vue使用CDN引入,响应式失效?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
背景
最近心血来潮,想要在本地开发时,也用CDN的方式引入 Vue,想着既然通过CDN引入了,那么在项目中就没必要再 import Vue,然后把项目中引入 Vue 的地方都删掉,结果改完后,界面看似正常运行,但数据变更后,界面没有重新渲染。经过一番折腾,终于定位到问题。
vue版本:Vue2.7+;打包工具:Vite;核心插件:@vitejs/plugin-vue2;
在解决这个问题之前,我们需要先搞清楚两个事情:1)@vitejs/plugin-vue2的作用;2)@vitejs/plugin-vue2的工作原理。
@vitejs/plugin-vue2的作用
vite不做赘述,具体内容看官网。
在聊@vitejs/plugin-vue2的作用之前,我们必须搞清楚什么是单文件组件?
Vue 的单文件组件 (即
*.vue文件,英文 Single-File Component,简称 SFC) 是一种特殊的文件格式,使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。
很明显,这是 Vue 自己定义并实现的组件模板,不能直接在浏览器中运行,在实际项目中,我们一般会使用集成了 SFC 编译器的构建工具,比如 Vite 或者 Vue CLI (基于 webpack)。本文只讨论使用 Vite 的情况。
@vitejs/plugin-vue2 就是提供对 Vue 2.7 的单文件组件支持。如果大家的Vue项目是使用 Vite ,下面这段代码应该不陌生:
// vite.config.js
import vue from '@vitejs/plugin-vue2' export default {
plugins: [vue()]
}
想要*.vue 文件能正常在浏览器中运行,我们就需要做以上配置。
@vitejs/plugin-vue2的工作原理
扒了一下这个插件的源码,发现一行至关重要的代码,如下图:

这个插件在工作时,要依赖 Vue,上面红色框标注的部分,就是它如何去查找 Vue 的逻辑。如果我们在配置文件中,配置了 Vue alias,则会使用配置的alias,否则默认使用本地安装的 Vue。如何使用alias,参加vite文档alias。
这里可以先记住这个逻辑,后面有用。
问题分析
我们先看看复现问题的路径:1. 在 index.html 直接引入 Vue CDN;2. 删除项目中import Vue 的代码。
然后本地Run起来,界面看起来很正常,但是,修改数据后,发现界面没有重新渲染。为什么呢?
我们先看经过 @vitejs/plugin-vue2 处理之后生成的代码是什么样的,如下图:

因为我在项目中,没有为 Vue 配置 alias,所以**@vitejs/plugin-vue2直接使用了我本地安装的 Vue**。原因见@vitejs/plugin-vue2的工作原理
但问题是,我在项目中删除了 import Vue 的代码,这个时候界面之所以能正常运行,是因为我在index.html引入的 Vue 有正常初始化,这里就产生了一个冲突:
最后@vitejs/plugin-vue2处理的产物中,是使用本地 Vue 导出的 Ref 来处理响应式变量,但真正执行 Vue 初始化动作依赖的却是 CDN。这会带来什么问题?
也就是说,数据变化后,能正常执行响应式逻辑,但是 notify 的时候,却找不到可通知对象(此时,是触发了 本地安装 Vue 的代码逻辑),因为初始化的时候,收集依赖关系时,执行的是 CDN 导入的 Vue 代码逻辑,这两者之间没有正确建立联系,导致数据变了,但是界面没有重新渲染。
如果看不懂,可能需要了解一下 Vue 初始化时 干了啥,主要是要知道如何收集依赖,并触发DOM更新,要理解Watcher是如何工作的。
如何解决
很简单,我们只要保证初始化 和 最后数据变化执行 的代码逻辑 来自同一个源就可以,而不是一个来自 本地安装的 Vue,一个来自CDN。
最简单的方法,就是在项目中手动import Vue,这个时候,初始化的时候,就会走 本地安装的 Vue 的代码逻辑。
不过这样的话,还是会加载两次 Vue,不是特别优雅。也可以使用 CDN 加载的 Vue,也得在项目中 import Vue,只不过引入的 路径要变化。
import Vue from '具体的 Vue 路径'
可以通过配置 alias,简化 from 后面的路径,变成 import Vue from 'Vue'。
本文转载于:
https://juejin.cn/post/7295694519185440777
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--Vue使用CDN引入,响应式失效?的更多相关文章
- vue源码之响应式数据
分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是vue实例. 使用的都是vue的响应式数据特性及$w ...
- Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究
Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究 在github上阅览README.md以获得最佳阅读体验,点这里 v-for响应式key ...
- 《Vue 进阶系列之响应式原理及实现》
https://www.bilibili.com/video/av51444410/?p=5 https://github.com/amandakelake/blog/issues/63 https: ...
- MVVM 和 VUE三要素:响应式、模板引擎、渲染
MVVM 和 VUE三要素:响应式.模板引擎.渲染:https://blog.csdn.net/weixin_37644989/article/details/94409430
- vue 数组 新增元素 响应式原理 7种方法
1.问题 思考一个问题,以下代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- vue学习之深入响应式原理
vue的响应式原理 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全 ...
- vue进阶用法-深入响应式原理
异步更新队列 当vue异步执行更新DOM时,只要观察到数据变化,vue经开启一个队列,并缓冲在同一时间循环中发生的所有数据改变.如果同一个watch被多次触发,只会一次推入到队列中.然后在下一个事件循 ...
- Vue添加新的响应式属性
vm.userProfile = Object.assign({}, vm.userProfile, { age: , favoriteColor: 'Vue Green' })
- vue 数据驱动原理,响应式 原理?
Object.defineProperty(obj,"name",{ get(){ console.log("被访问了") return obox.innerH ...
- VUE下echarts宽度响应式
window.addEventListener("resize", () => { myChart2.resize();});
随机推荐
- 扒开源安卓性能测试工具moblieperf源码——开发属于你自己的性能稳定性测试工具
moblieperf下载和使用 moblieperf由阿里巴巴开源的Android性能测试工具 下载:官方源码地址mobileperf github 使用: 使用pycharm打开下载的项目 使用只需 ...
- VMware全版本下载工具
有很多小伙伴想下载适合自己的虚拟机版本,但是官网全是英文看不懂 百度找的还怕带病毒 这里栀煜单独制作了个工具,内置vm9 10 11 12 14 15 16 17版本的虚拟机下载地址,都是官方版 不是 ...
- JS leetcode 合并两个有序数组 解题分析
壹 ❀ 引 今天做的一题是前两周博客园一粉丝在面试360时遇到的算法题,题目来自leetcode88. 合并两个有序数组,理解起来可能有些费劲,不过我尽量用图的形式给大家解释它,题目描述如下: 给你两 ...
- 序列化协议:Protobuf入门
偶然在网上清华大学电子系科协软件部2023暑期培训的内容中发现了这个东西,后面随着了解发现以后学习有关项目时会用到,便写个随笔记录一下这次学习的经历.作为一种序列化协议,与使用文本方式存储的xml.j ...
- MOS 管工作原理
浅谈MOS管的工作原理_数字IC修行者的博客-CSDN博客_mos管工作原理 一文讲明白MOS管工作原理 - 知乎 (zhihu.com) 闪存基本原理 (sohu.com)
- 【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据
1 简介 本文以 mp4 文件为例,讲解去音频操作.mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264.在去音频过程中 ...
- 我在winform项目里使用“Windows I/O完成端口”的经验分享
少年!看你骨骼惊奇,是万中无一的练武奇才,我这儿有本武林秘籍,见与你有缘就送你了! 如来神掌 Windows I/O完成端口是一个我至今都说不好的话题,请宽容的接受我这不是科班出身的自学成才的野生程序 ...
- sentry-native 在 windows 平台上搭建
官方文档:https://github.com/getsentry/sentry-native 虽说官方文档有搭建步骤,奈何我用 git bash 试了 n 遍,最终都会报一大堆错误,白白浪费了我快一 ...
- 记一个 Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 编译问题引发的案例
某天将项目 kotlin 版本升级到了 1.8.0 ,然后编译报错了, Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 然后开始寻求解决方案 ...
- 面试官:说一下红锁RedLock的实现原理?
RedLock 是一种分布式锁的实现算法,由 Redis 的作者 Salvatore Sanfilippo(也称为 Antirez)提出,主要用于解决在分布式系统中实现可靠锁的问题.在 Redis 单 ...
