Vue3的reactive和ref原理区别详解

vue3中的refreactive 特性refreactive响应式原理Proxy数据类型任意类型(包装为Ref对象)仅对象/数组(需为引用类型)访问方式模板中自动解包,JS 中需.value直接访问属性类型系统Ref<T>原始对象类型的代理解构响应式保持响应式(.value需使用toRefs保持响应式在实际开发中,两者通常结合使用:用reactive管理复杂状态对象,用ref处理简单值或作为函数返回值。维度原生实现Vue3 实现实现复杂度较低(基础功能)极高(完整生态)性能基础优化。 阅读详情

Vite 或 Vue CLI:选择哪一个

随着 Vue 生态系统的成熟,已经引入了许多新技术。虽然一些开发人员可能从一个普通的 JavaScript 文件开始,并在页面中包含 Vue。但随着时间的推移,在开发 Vue 应用程序时,使用打包工具和命令行界面成为更加标准的开发流程。

Vue 不会强制你选择某种开发、打包方式,但vue的生态系统提供了许多工具,例如 Vue CLI 和最近的推出的Vite js。那么你应该使用 Vite 还是 Vue CLI?在做出选择的时候,了解 Vite 和 Vue CLI 之间的区别会对我们有很大的帮助。

在本文中,我们将深入探讨 Vite 与 Vue CLI,以便你可以根据自己的需求做出最佳选择。

Vue CLI 是如何工作的?

Vue 命令行界面 (CLI) 围绕 Webpack 创建一个包装器来编译你的 Vue 项目。但是我们为什么要编译它呢?在 Webpack 和 Rollup 这样的打包工具出现之前,我们只需要将我们的 JavaScript 文件部署到服务器并将它们全部包含在一个页面上。当我们的项目很小的时候,这种效果很好。但是随着 Vue 的发展,我们开始需要某种程度的打包功能。单文件组件 (SFC) 和 TypeScript的使用都需要借助打包工具来构建我们的项目。这就是为什么要引入Vue CLI 。

Vue CLI 允许我们在开发和生产期间创建和构建项目。CLI 隐藏了 Webpack 的复杂配置细节,并在开发和生产过程中为我们的项目提供服务。但是,如果我们想要将它与 Vite 进行比较,那就让我们再深入一点。

Webpack

正如 Webpack 网站所描述的,Webpack 是一个静态模块打包工具。但是,这是什么意思?Webpack 的主要目标是获取你的 Web 项目的资产并将它们打包到少量文件中以供浏览器下载。这并不意味着立即加载项目的所有文件,也可以按需下载。

虽然 Webpack 可以打包非代码资产,但它真正的闪光点是打包相关的代码。你可以认为打包就是简单地将所有代码文件(例如JavaScript/TypeScript)合并在一起,但实际上这里还有更多的内容。

Webpack 处理代码中的 imports/require 语句时,只包含实际需要的文件。此外,它经常进行“tree-shaking”,这可以删除实际上从未引用过的代码块(例如类、函数)。通过这种方式,Webpack 可以非常高效地打包你的项目。但是,如果我们正在研究 Vue CLI(包含 Webpack)与 Vite 的比较,我们需要继续看看在开发时会发生什么。

开发过程中的 Webpack

在 Vue CLI 中,Webpack 用于模块绑定。在开发时也会发生这种绑定。当你通过 CLI 开发 Vue 项目时,它会指示 Webpack 以增量方式构建项目并监听更改,以便它可以将更改的文件打包并在浏览器中进行替换。因为构建包是增量的,所以它可以在你开发项目时快速的将更改同步。第一次构建项目时可能会较慢(即 3 秒或更长时间,具体取决于你的项目大小),但一旦项目启动,增量更改的同步会非常快(即 < 1 秒,通常小于 100 毫秒)。

Vite js 是如何工作的?

如果你是Vite的新手,我建议直接从它的创造者尤雨溪那里学习,他在Vue Mastery的课程“使用vite快速构建”中教我们关于Vite的知识。

如果你看过该课程的第一课(它是免费的),你将了解如何开始,但在我们将其与 Vue CLI 和 Webpack 进行比较之前,我们需要了解 Vite 的工作原理。

当你创建一个基本的 Vite 项目(在我们的例子中,是 Vue 3 的 Vite 项目)时,index.html文件是非常基本的:

📄 index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="/vite.svg" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite + Vue</title></head><body><div id="app"></div>**<script type="module" src="/src/main.js"></script>**</body>
</html> 

你会注意到这与 Vue CLI 看起来很相似,但有一个主要例外:script标记使用type="module“。除非你使用 TypeScript,否则这里没有真正的构建步骤。src脚本指向你的实际源代码文件。

当这个请求传入时,它会将main.js文件作为原生 ES 模块发送到浏览器。这意味着它根本不会打包你的代码。实际上,源文件只是一个简单的Vue启动文件:

📄 main.js

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'

createApp(App).mount('#app') 

这里发生了什么?Vite 正在利用原生 ES 模块和动态 ESM 模块,以便根据需要将代码注入浏览器。本质上,项目中的每次导入都会强制浏览器根据需要加载每个有效负载。这些导入将级联以获得特定情况下所需的所有代码。

这意味着在开发过程中, Vite 不但为你的网站提供服务,并且它也支持动态加载(在支持它的新浏览器中,并且也兼容旧浏览器)。

此外,Vite 在你开发项目时使用模块热替换 (HMR) 来更新修改的代码。使你能够在开发时获得即时的启动速度,这会大大提高开发体验。

但是 Vite 是如何在生产环境中实现这一点的呢?让我们来看看。

Vite 和生产环境

虽然 Vite 在开发过程中使用其提供文件的能力来加速该过程,但 Vite 本身并没有真正打包你的项目。相反,它依赖于一个名为"Rollup"的打包程序来进行实际的打包。

通过使用Vite中的build命令,它将使用rollup来构建你的项目:

📄 命令行

> vite build 

这将构建项目,生成几个文件(使用校验和以避免缓存的影响):

📄 命令行

vite v3.0.9 building for production...
✓ 16 modules transformed.
dist/assets/vue.5532db34.svg 0.48 KiB
dist/index.html0.44 KiB
dist/assets/index.43cf8108.css 1.26 KiB / gzip: 0.65 KiB
dist/assets/index.3ee41559.js52.82 KiB / gzip: 21.30 KiB 

与 Vue CLI 非常相似,Vite 允许通过配置文件配置 Rollup(配置文件具有非常合理的默认值):

📄 vue.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],build: {sourcemap: true,outDir: "public/build/"}
}) 

例如,设置sourcemapoutDir,都直接传递给 Rollup 进行配置。vite.config.js中的选项允许你在必要时对Rollup进行深入配置。

因此,使用 Vite 实际上为你提供了两种不同的体验:在开发时的快速调试体验;遵循 Rollup 规范,允许你以想要的方式构建项目。

当 Vite 使用Rollup时, Rollup不是必需的。你可以使用任何你想要的打包工具代替 Rollup 来构建你的 Vue 项目。

Vite 或 Vue CLI:我应该选择哪个?

这个问题没有一个明确的答案,Vite 还是 Vue CLI 哪个更好?

但我想把它分成两个不同的讨论:在开发中使用和在生产中使用。

开发时

Vue CLI(以及扩展的 Webpack)和 Vite 的整体体验在开发过程中可能是相似的。两者都增量构建你的项目并使用模块热替换来替换运行的项目中改动的代码。

两者的区别归结为速度。Webpack 从源代码构建项目,并在开发项目时持续进行增量构建。

另一方面,Vite 会根据需要将实际代码加载到浏览器中。这意味着不需要太多源代码的映射,因为在浏览器中运行的代码就是你正在使用的实际代码(和文件)。这意味着,在大多数情况下,你会发现 Vite 比 Vue CLI 提供更快速和直接的开发和调试体验。在 Vue CLI 中,你调试的是Webpack 生成的代码(通过使用源代码映射),而不是调试的你正在编写的代码。

另一个好处是 Vite 不依赖于 Vue.js。Vite 可以在不同的环境中使用:纯 JavaScript、React、PReact 和 SvelteKit。因此,如果你在多个环境中工作,则可以更轻松地使用(和配置)一个工具来处理不同的项目。

生产时

Rollup 类似于 Webpack(以及Parcel,另一个流行的打包工具),尽管它们的工作_方式_有点不同。

Webpack基于CommonJS API来管理JavaScript模块。即使 Webpack 支持 ES 模块,底层构建系统仍然希望模块可以动态加载(因为require()只有在函数执行时才导入模块)。

相比之下,Rollup 依赖于 ES 模块,这意味着它可以比 Webpack 更轻松地进行静态分析,尽管这种差异非常小。但是,使用 Rollup 需要你具有支持 ES 模块的依赖项。这可能会给不支持ES模块的库带来一些问题,但这些库现在越来越少了。

最终,由你来决定

虽然我不能为你做决定,但我希望我已经列出了这两种方法的优缺点。我通常将 Vite(带有 Rollup)用于新项目,但我没有看到足够的好处来吸引我将现有的所有Vue CLI项目迁移到Vite。

在某些时候,这不太重要,因为尤雨溪曾表示,它们会在某个时刻趋于一致(例如,在 CLI 中用 Vite 替换 Webpack)。但就目前而言,这还没有发生,两种方法都得到了很好的支持。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

详细指南:如何在TI C2000基于C28x的微控制器上部署FreeRTOS_C语言实现 FreeRTOS是一个小型、开源、实时的嵌入式操作系统内核。它为多种微控制器处理器提供了支持,包括ARM、AVR、MSP430PIC等。小型轻量级:适合资源受限的嵌入式系统。实时性:可以满足严格的实时要求。多任务支持:支持多任务并发执行。内存管理:提供了多种内存管理策略。模块化设计:用户可以根据需要选择所需的功能模块。TI C2000系列微控制器是专为实时控制应用设计的。高性能C28x核:提供了高速的浮点运算能力。丰富的外设:包括PWM、ADC、DAC、通信接口等。低功耗。 阅读详情

相关推荐

Python爬虫实战:高效爬取CNKI知网文献数据的技术解析

本文将详细介绍如何使用Python最新技术构建一个高效的CNKI知网文献爬虫系统。我们将从爬虫基础知识讲起,逐步深入到高级反反爬技术、分布式爬取、智能解析等前沿内容。文章包含完整的代码实现,涵盖请求模拟、数据解析、持久化存储等关键环节,并特别针对CNKI的反爬机制提供解决方案。通过本文,读者将掌握构建专业级学术文献爬虫的全套技术栈。关键词:Python爬虫、CNKI爬取、反反爬技术、文献数据挖掘、Scrapy框架本文详细介绍了如何使用Python最新技术构建CNKI知网文献爬虫。

2201_76125261的博客 2051

vue3 使用require报错:require is not defined

与原生的 URL 构造器 组合使用,在一个 JavaScript 模块中,通过相对路径我们就能得到一个被完整解析的静态资源 URL。否则代码将被原样保留,因而在 build.target 不支持 import.meta.url 时会导致运行时错误。在生产构建时,Vite 才会进行必要的转换(保证 URL 在打包资源哈希后仍指向正确的地址)vite官网静态资源处理 new URL(url, import.meta.url)import.meta.url : ESM 的原生功能,会暴露当前模块的 URL。

qq_43383334的博客 1万+

最新更新1980-2023年中国各省地级市区县二氧化碳排放数据

碳排放数据是衡量地方经济发展与环境可持续性的重要指标,通常包括二氧化碳排放量,来源涵盖能源消耗及工业、交通、建筑等领域。中国地域广阔,经济发展不均衡,导致各地碳排放水平差异较大。本次分享的数据来自EDGAR,包含中国各省、地级市、区县1980-2023年的二氧化碳排放数据。 数据名称:中国省、市、县二氧化碳排放数据 数据年份:1980-2023年 数据范围:各省、地级市、区县 数据来源:EDGAR_2024_GHG 数据指标:年份、省份、城市、城市代码、区县、二氧化碳排放总量。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

vue3项目打包错误

这个错误似乎是 plugin-legacy 2.0需要 vite 3.0才行。(1)在安装包的时候忽略冲突,安装命令后面加。(2)更新所有的包到,最新,再来解决冲突。第一个报错js,右键点进去,搜索。但是我是这样的也报错。

qq_24986271的博客 1万+

Vite vs Webpack

本文作者为奇舞团前端工程开发师原文作者:Shawn Wildermuth原文地址:https://www.vuemastery.com/blog/vite-vs-webpack/Vite 或 Vue CLI:选择哪一个随着 Vue 生态系统的成熟,已经引入了许多新技术。虽然一些开发人员可能从一个普通的 JavaScript 文件开始,并在页面中包含 Vue。但随着时间的推移,在开发 Vue 应用程...

奇舞周刊 494

vue3引入图片等无法使用require,需要用newURL来动态引入图片等静态资源

Uncaught (in promise) ReferenceError: require is not defined1、因为requirewebpack提供的一种加载能力,但是vue3项目时搭配vite的,所以这里应该用vite提供的静态资源载入方法,将上面的require改为new URL这种格式,页面就可以正常加载静态资源了。new URL(‘路径’,import.meta.url).href

wzy_PROTEIN的博客 1万+

vite 构建失败 modules transformed.

记录一下,可能是 因为npm 有个打赏 导致的,删除node_modules目录。重新下载,使用 npm install --no-fund。概率性的问题,构建的时候出现这个,然后就自动断开进程了。目前问题已经解决了,记录一下。

MaiJi 942

Vue3refreactive实现原理区别

refreactive都是Vue3中新增的组合式API函数,用于响应式数据的处理。

2301_81122125的博客 909

vue3中的refreactive原理,使用区别

Vue 3 中,refreactive是实现响应式数据的核心 API,它们基于实现,但适用场景使用方式有所不同。Vue 3 的响应式系统通过实现,相比 Vue 2 的,Proxy 能拦截对象的所有操作(如新增属性、删除属性、数组索引修改等),天然支持更全面的响应式场景。

& 圆 。的博客 938

Vue3refreactive区别及底层原理详解

refreactiveVue3 响应式系统的两大核心 API:•ref通过.value封装简化基本类型响应式,兼顾对象类型的灵活性。•reactive利用Proxy实现深度监听,适合复杂状态管理。开发者应根据数据类型、更新频率及使用场景选择最合适的 API,必要时结合toRefs优化代码结构。

警警的博客 1788

5.vue3 ref reactive 我该用哪个,解析 refreactive原理区别

掌握refreactive的正确使用方式,可以让Vue3开发既保持响应式的高效性

qq_1401820561的博客 1699

Vue 3reactiveref、watchEffectwatch的底层原理及核心区别解析

例如:操作嵌套表单用 reactive + watch 深度监听;• 依赖收集:执行过程中访问的响应式属性(如 ref.value 或 reactive 属性),自动触发其 track 逻辑,建立依赖关系。• 依赖来源:显式指定监听源(refreactive属性、getter函数或数组),内部调用 track 绑定特定属性。• 深度响应:嵌套对象属性访问时,递归调用 reactive 创建子代理,实现全对象树的响应式。• reactive:管理复杂嵌套状态(如表单对象、配置树),避免频繁整体替换。

警警的博客 1223

深入解析 Vue3refreactive原理区别(附源码)

Vue3refreactive是Composition API中的核心响应式工具,两者均基于Proxy实现,但存在关键差异。reactive直接代理对象/数组,支持深度响应式,适合管理复杂数据结构;ref通过容器包装基础类型,需通过.value访问,支持所有数据类型,模板中自动解包。选择方案时,基础类型用ref,对象/数组优先用reactiveref包装对象时会内部转为reactive,确保嵌套属性响应性。开发者应根据数据类型场景需求合理选用。

前端圈边缘选手,擅长把 UI 稿 “翻译” 成代码,也擅长在 console.log 里写 “求救信号”。日常状态:要么在调像素级对齐,要么在查 “为什么这个样式只在我电脑上生效”。博客不搞高深理论,只唠实在干货~ 1099

Vue3:深入浅出ref reactive原理区别

是的响应式引用,用于让(包括基本类型引用类型)变成。:通过监听value属性的getset,当包裹引用类型时,会自动将其转换为reactive代理对象。.valueref.valuereactivereactiverefVue 3 的,用来让都能被追踪变化,.value。

F310517的博客 763

Vue 3响应式核心:深入解析refreactive区别与实现原理

理解refreactiveref是"包装器",解决值类型响应问题reactive是"代理器",处理对象深度响应通过组合使用这两个API,配合toRefs等工具函数,可以构建出既高效又易维护的响应式系统。

梦想成为公务员 735

refreactive函数区别,面试之vue2与vue3响应式原理区别

ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)。 reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据

m0_61698324的博客 1448

Vue3 响应式原理reactive函数ref函数的区别

Vue3 响应式原理reactive函数ref函数的区别

wsl636969的博客 318

Vue3 refreactive 区别详解,搞懂响应式原理面试再也不慌

本文介绍了Vue3的声明式渲染响应式数据管理。主要内容包括:1) 通过CDN引入Vue3使用createApp创建应用;2) setup函数作为Vue3的代码入口点,用于定义数据函数;3) 插值表达式{{}}的语法使用场景;4) 响应式函数reactiveref的使用:reactive处理对象类型数据,ref可处理任意类型数据,在JS中需要通过.value访问。文章通过多个代码示例展示了这些核心概念的实际应用,帮助开发者快速掌握Vue3的基础特性。

qq_71356343的博客 252

HoRain云--Vue3响应式:refreactive终极指南

Vue3refreactive的核心区别与使用指南摘要:本文详细对比了Vue3refreactive的响应式特性。ref适合基本类型需要整体替换的对象,通过.value访问;reactive则专为复杂对象设计,支持深度响应但需避免解构丢失响应性。文章分析了实现原理,提供了使用场景建议(如DOM引用用ref,表单数据用reactive),并给出常见问题解决方案(如使用toRefs保持解构响应)。核心建议:基本类型用ref,复杂对象用reactive,解构时配合toRefs,替换对象时使用.value

sinat_57153473的博客 1385

vue for beginner】refreactive

若需要一个基本类型的响应式数据,必须使用ref。若需要一个响应式对象,层级不深,refreactive都可以,推荐用reactive。若需要一个响应式对象,且层级较深,推荐使用reactiveref创建的变量必须使用.value(可以使用volar插件自动添加.value)reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。失去响应性: 重新分配一个新对象会使原有的响应式对象失去响应性。使用 Object.assign。

qq_42476938的博客 1305

vue3经典面试题总结:响应式数据绑定原理refreactive区别

有人说过:2023年以后的中国市场将永远属于长期主义者,bug是改不完的,只能说这次遇到了希望下次不会在出现同样的bug就行,如果你觉得对您有帮助,欢迎一起交流学习,本人也是一名很菜的20级学生,编程界的小白,一起加油变优秀啦!总的来说,refreactive都是用于实现Vue.js组件的数据响应式更新,但是它们的使用方法、适用范围设计理念等方面略有不同,需要根据具体的应用场景选择合适的API进行开发使用。💕希望本文对你在学习前端的过程中有所帮助,如有不足请指正一起学习,一起进步🥇。

零小唬的博客 514
上一篇: vue2响应式原理解析并实现一个简单响应系统
下一篇: vue-cli的组件化开发(上)
梅花十三儿
博客等级 码龄5年 1035粉丝 444原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值