记录--Vue使用CDN引入,响应式失效?

这篇具有很好参考价值的文章主要介绍了记录--Vue使用CDN引入,响应式失效?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--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使用CDN引入,响应式失效?

这个插件在工作时,要依赖 Vue,上面红色框标注的部分,就是它如何去查找 Vue 的逻辑。如果我们在配置文件中,配置了 Vue alias,则会使用配置的alias,否则默认使用本地安装的 Vue。如何使用alias,参加vite文档alias。

这里可以先记住这个逻辑,后面有用。

问题分析

我们先看看复现问题的路径:1. 在 index.html 直接引入 Vue CDN;2. 删除项目中import Vue 的代码。

然后本地Run起来,界面看起来很正常,但是,修改数据后,发现界面没有重新渲染。为什么呢?

我们先看经过 @vitejs/plugin-vue2 处理之后生成的代码是什么样的,如下图:

记录--Vue使用CDN引入,响应式失效?

因为我在项目中,没有为 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引入,响应式失效?文章来源地址https://www.toymoban.com/news/detail-748569.html

到了这里,关于记录--Vue使用CDN引入,响应式失效?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cdn引入vue后,开发环境下报错,无法识别vue路径

    Uncaught TypeError: Failed to resolve module specifier \\\"vue\\\". Relative references must start with either \\\"/\\\", \\\"./\\\", or \\\"../\\\". 未捕获类型错误:无法解析模块说明符“vue”。相对引用必须以“/”、“/”或“./”开头。 安装vue-demi 并导入,因为pinia中有用vue依赖中的vue-demi

    2024年02月10日
    浏览(21)
  • 直接在html中引入Vue.js的cdn来实现一个简单的上传图片组件

    当使用 Vue.js 的 CDN 来实现一个简单的上传图片组件时,你可以利用 Vue 的数据绑定和事件处理能力,结合 HTML 和 CSS,轻松地创建一个交互式的图片上传界面。以下是一个示例: index.html TANKING https://afdian.net/item/ffa3292a337c11ee9a8c5254001e7c00

    2024年02月13日
    浏览(30)
  • Vue3中reactive响应式失效的问题

    弹窗内部有一个挑选框,要通过请求接口获取挑选框下面可供选择的数据。 这是一个很简单的情境,我立刻有了自己的思路。如果实现搜索,数据较少可以直接用elementplus自带的filter。如果数据较多,就需要传val,在后台进行搜索,然后分页渲染。我选择的是前者,所以只需

    2024年02月10日
    浏览(28)
  • Vue3-04-reactive() 响应式失效的三种情况

    属性作为参数案例 整个对象作为参数

    2024年02月05日
    浏览(36)
  • vue3 组件响应式v-model 失效,实践踩坑,一文搞懂组件响应式原理,对初学者友好

    vue3的v-model已经有了变化,假如你还不知道其中细节,看完这篇文章你就完全明白了,我以踩坑的场景来进行解析。起因是在我的项目中需要一个输入框组件,这个组件用来根据输入异步查询系统内已有人员,而且在多个地方需要用到这个输入框,所以必须要封装成组件,但

    2024年02月02日
    浏览(44)
  • 前端系列19集-vue3引入高德地图,响应式,自适应

    npm i @amap/amap-jsapi-loader --save 要在Vue 3中引入高德地图,你可以按照以下步骤进行操作: 在项目目录中使用npm或yarn安装高德地图的JavaScript API库。你可以使用以下命令之一: npm install @amap/amap-jsapi-loader yarn add @amap/amap-jsapi-loader 在Vue组件中引入并使用高德地图。 在你的Vue组件中

    2024年02月07日
    浏览(32)
  • Vue2项目打包时,引入element-ui 配置 CDN 加速时报错 Cannot read properties of undefined (reading ‘prototype‘)

     Vue2项目打包优化时,引入element-ui 配置 CDN 加速时报错出现报错信息:Uncaught TypeError: Cannot read properties of undefined (reading \\\'prototype\\\') 老师说出现这个问题的原因是, 如果你完整引入了 Element,它会为 Vue.prototype 添加如下全局方法:$alert, $promp......     所以,如果想要正常使用

    2024年02月16日
    浏览(36)
  • vue项目引入微信sdk报错记录

    vue项目引入微信sdk 运行报错如下: npm install weixin-js-sdk --save下载失败显示未配置代理 解决方式如下 : 步骤一: npm配置你正在使用的代理 步骤二:

    2024年01月25日
    浏览(32)
  • vue element-ui响应式布局(记录)

    1.可以实现Vue移动端和PC端的响应式布局适配 实现方法:通过 postcss-px-to-viewport 来自动将我们开发时的px单位计算转换为vw/rem视口单位,完成响应式布局 。 安装插件 PC端适配,在项目根目录下创建 postcss.config.js 配置文件 移动端适配,也是在根目录下创建 postcss.config.js 配置文件

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包