Vue3 特点以及优势-源码解剖

Vue3 特点以及优势-Vue3.4源码解剖

Vue3 特点以及优势

1.声明式框架

命令式和声明式区别

  • 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程
  • 声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中,过程靠 vuejs 来实现

声明式代码更加简单,不需要关注实现,按照要求填代码就可以

- 命令式编程:
let numbers = [1,2,3,4,5]
let total = 0
for(let i = 0; i < numbers.length; i++) {total += numbers[i] - 关注了过程
}
console.log(total)- 声明式编程:
let total2 = numbers.reduce(function (memo,current) {return memo + current
},0)
console.log(total2)

2.采用虚拟 DOM

传统更新页面,拼接一个完整的字符串 innerHTML 全部重新渲染,添加虚拟 DOM 后,可以比较新旧虚拟节点,找到变化在进行更新。虚拟 DOM 就是一个对象,用来描述真实 DOM 的

const vnode = {__v_isVNode: true,__v_skip: true,type,props,key: props && normalizeKey(props),ref: props && normalizeRef(props),children,component: null,el: null,patchFlag,dynamicProps,dynamicChildren: null,appContext: null,
};

3.区分编译时和运行时

  • 我们需要有一个虚拟 DOM,调用渲染方法将虚拟 DOM 渲染成真实 DOM (缺点就是虚拟 DOM 编写麻烦)
  • 专门写个编译时可以将模板编译成虚拟 DOM (在构建的时候进行编译性能更高,不需要再运行的时候进行编译,而且 vue3
    在编译中做了很多优化)

4.Vue3 设计思想

  • Vue3.0 注重模块上的拆分 Vue3 中的模块之间耦合度低,模块可以独立使用。 拆分模块
  • 通过构建工具 Tree-shaking 机制实现按需引入,减少用户打包后体积。 组合式 API
  • Vue3 允许自定义渲染器,扩展能力强。 扩展更方便
  • 使用 RFC 来确保改动和设计都是经过 Vuejs 核心团队探讨并得到确认的。也让用户可以了解每一个功能采用或废弃的前因后果。 采用RFC

Vue3整体架构

Monorepo 管理项目

Monorepo 是管理项目代码的一个方式,指在一个项目仓库(repo)中管理多个模块/包(package)。 Vue3 源码采用 monorepo 方式进行管理,将模块拆分到 package 目录中。作为一个个包来管理,这样职责划分更加明确。

  • 个仓库可维护多个模块,不用到处找仓库
  • 方便版本管理和依赖管理,模块之间的引用,调用都非常方便

1.Vue3 项目结构

在这里插入图片描述
在这里插入图片描述

2.Vue3 采用 Typescript

复杂的框架项目开发,使用类型语言非常有利于代码的维护,在编码期间就可以帮我们做类型检查,避免错误。所以 TS 已经是主流框架的标配~

Vue2 早期采用 Flow 来进行类型检测 (Vue2 中对 TS 支持并不友好), Vue3 源码采用 Typescript 来进行重写。同时 Vue2.7 也采用 TS 进行重写。TS 能对代码提供良好的类型检查,同时也支持复杂的类型推导。

搭建 Monorepo 环境

Vue3 中使用pnpm workspace来实现monorepo (pnpm是快速、节省磁盘空间的包管理器。主要采用符号链接的方式管理模块)

1.全局安装 pnpm

npm install pnpm -g # 全局安装pnpmpnpm init  # 初始化配置文件

2.创建.npmrc 文件

shamefully-hoist = true

这里您可以尝试一下安装Vue3, pnpm install vue此时默认情况下vue3中依赖的模块不会被提升到node_modules下。 添加羞耻的提升可以将 Vue3,所依赖的模块提升到node_modules中

3.配置 workspace

新建 pnpm-workspace.yaml

packages:- "packages/*"

将 packages 下所有的目录都作为包进行管理。这样我们的 Monorepo 就搭建好了。确实比lerna + yarn workspace更快捷

4.环境搭建

打包项目 Vue3 采用 rollup 进行打包代码,安装打包所需要的依赖
在这里插入图片描述

pnpm install typescript minimist esbuild -D -w

5.初始化 TS

pnpm tsc --init

先添加些常用的ts-config配置,后续需要其他的在继续增加

{"compilerOptions": {"outDir": "dist", // 输出的目录"sourceMap": true, // 采用sourcemap"target": "es2016", // 目标语法"module": "esnext", // 模块格式"moduleResolution": "node", // 模块解析方式"strict": false, // 严格模式"resolveJsonModule": true, // 解析json模块"esModuleInterop": true, // 允许通过es6语法引入commonjs模块"jsx": "preserve", // jsx 不转义"lib": ["esnext", "dom"] // 支持的类库 esnext及dom}
}

6.创建模块

packages目录下新建两个 package

  • reactivity 响应式模块
  • shared 共享模块

所有包的入口均为src/index.ts 这样可以实现统一打包

  • reactivity/package.json
{"name": "@vue/reactivity","version": "1.0.0","main": "index.js","module": "dist/reactivity.esm-bundler.js","unpkg": "dist/reactivity.global.js","buildOptions": {"name": "VueReactivity","formats": ["esm-bundler", "cjs", "global"]}
}
  • shared/package.json
{"name": "@vue/shared","version": "1.0.0","main": "index.js","module": "dist/shared.esm-bundler.js","buildOptions": {"formats": ["esm-bundler", "cjs"]}
}

formats 为自定义的打包格式

  • lobal 立即执行函数的格式,会暴露全局对象
  • esm-browser 在浏览器中使用的格式,内联所有的依赖项。
  • esm-bundler 在构建工具中使用的格式,不提供.prod 格式,在构建应用程序时会被构建工具一起进行打包压缩。
  • cjs 在 node 中使用的格式,服务端渲染。
pnpm install @vue/shared --workspace --filter @vue/reactivity

配置ts引用关系

"baseUrl": ".",
"paths": {"@vue/*": ["packages/*/src"]
}

7.开发环境esbuild打包

在这里插入图片描述
创建开发时执行脚本, 参数为要打包的模块
解析用户参数

"scripts": {"dev": "node scripts/dev.js reactivity -f esm"
}
import esbuild from "esbuild"; // 打包工具
import minimist from "minimist"; // 命令行参数解析
import { resolve, dirname } from "path";
import { fileURLToPath } from "url";
import { createRequire } from "module";
const require = createRequire(import.meta.url); // 可以在es6中使用require语法
const args = minimist(process.argv.slice(2)); // 解析打包格式和打包模块
const format = args.f || "iife";
const target = args._[0] || "reactivity";// __dirname在es6模块中不存在需要自行解析
const __dirname = dirname(fileURLToPath(import.meta.url));const pkg = require(`../packages/${target}/package.json`);esbuild.context({entryPoints: [resolve(__dirname, `../packages/${target}/src/index.ts`)],outfile: resolve(// 输出的文件__dirname,`../packages/${target}/dist/${target}.js`),bundle: true, // 全部打包sourcemap: true, // sourcemap源码映射format, // 打包格式 esm , cjs, iifeglobalName: pkg.buildOptions?.name, // 全局名配置platform: "browser", // 平台}).then((ctx) => {console.log("watching~~~");return ctx.watch(); // 监控文件变化});

Vue3 响应式数据核心

Vue3 中使用 Proxy 来实现响应式数据变化。

CompositionAPI
简单的组件仍然可以采用 OptionsAPI 进行编写(但是在 Vue3 中基本不在使用),compositionAPI 在复杂的逻辑中有着明显的优势~

  • CompositionAPI 在用户编写复杂业务逻辑不会出现反复横跳问题
  • CompositionAPI 不存在this指向不明确问题
  • Composition API 对 tree-shaking 更加友好,代码也更容易压缩。
  • CompositionAPI 提取公共逻辑非常方便

reactivity模块中就包含了很多我们经常使用到的API 例如:computed、reactive、ref、effect 等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性代数中的“过定系统”和“欠定系统”

过定系统 在线性代数中&#xff0c;当方程式的数量大于未知数的数量时&#xff0c;我们通常称这样的系统为“过定系统”&#xff08;Overdetermined System&#xff09;。这种情况下&#xff0c;系统往往没有精确解&#xff0c;即不存在一组未知数的值能够同时满足所有的方程。…

关于 VuePress 的插件

插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增加光标效果等。VuePress 官网对插件的介绍&#xff1a;插件通常会为 VuePress 添加全局功能。 这里简单介绍几个本站用的插件吧&#xff01; ‍ ‍ 插件就好比第三方功能&#xff0c;例如增加一个阅读进度条、增…

如何实现在短信链接中直接打开微信小程序

你是否有过这样的体验&#xff0c;收到一条短信&#xff0c;里面有一个链接&#xff0c;点击后就直接打开了微信&#xff0c;并且进入了一个小程序。这种神奇的功能是如何实现的呢&#xff1f;本文将为你揭晓答案。 利用微信URL Link 接口生成链接 要实现短信中的链接直接打开…

13.什么是Proxy?

Proxy 是一种代理服务器&#xff0c;它充当客户端和目标服务器之间的中间人&#xff0c;转发网络请求和响应。当客户端向目标服务器发送请求时&#xff0c;它首先发送给代理服务器&#xff0c;然后由代理服务器转发请求给目标服务器。代理服务器可以用于许多目的&#xff0c;包…

VSG虚拟同步发电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 VSG虚拟同步发电机simulink建模与仿真&#xff0c;虚拟同步发电机&#xff08;Virtual Synchronous Generator, VSG&#xff09;技术是电力电子领域的一项重要创新&#xff0c…

C++:const及引用的使用场景

for (const auto& row : matrix) { // ... } 在C中&#xff0c;对于for (const auto& row : matrix)这样的循环&#xff0c;加上引用&#xff08;&&#xff09;并不是必须的&#xff0c;但它通常是一个好习惯&#xff0c;尤其是当matrix中的元素&#xff08;…

Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire

一、前言 线上项目往往依赖非常多的具备特定能力的资源&#xff0c;如&#xff1a;DB、MQ、各种中间件&#xff0c;以及随着项目业务的复杂化&#xff0c;单一项目内&#xff0c;业务模块也逐渐增多&#xff0c;如何高效、整洁管理各种资源十分重要。 本文从“术”层面&#…

安全和加密常识(1)对称加密和非对称加密以及相应算法

文章目录 对称加密(Symmetric Encryption)非对称加密(Asymmetric Encryption)使用场景和优缺点对称加密和非对称加密是信息安全领域中两种重要的加密方式,它们分别使用不同的加密算法和密钥管理方式来保护数据的机密性。下面我来简单介绍一下它们及其相应的算法。 对称加…

js多线程解决方案Web Worker简单说明与实例介绍

Web Worker是JavaScript中的多线程解决方案&#xff0c;它允许在后台执行耗时的任务&#xff0c;而不会阻塞主线程。通过将任务发送给Web Worker&#xff0c;主线程可以继续执行其他操作&#xff0c;同时Web Worker在后台完成任务。 使用Web Worker的一般流程如下&#xff1a;…

爆火AI惨遭阉割,1600万美国年轻人集体「失恋」? Character AI被爆资金断裂,00后炸了

【新智元导读】最近&#xff0c;在美国00后中爆火的Character AI&#xff0c;竟然把聊天机器人对话模型给「阉割」了&#xff1f;愤怒的年轻人们冲进社区&#xff0c;抱怨的声浪快要掀翻天了&#xff01;而这背后&#xff0c;似乎还有谷歌或Meta的授意。 美国当今最火爆的社交…

JavaScript——数组的遍历和多维数组

目录 任务描述 相关知识 数组的遍历 多维数组的实现 编程要求 任务描述 本关任务&#xff1a;将一个一维数组转换为二维数组&#xff0c;行优先。 相关知识 数组的遍历 数组的遍历指按顺序访问你数组的每一个元素。有两种方法&#xff1a; 使用for循环 //依次在浏览器…

看个病都有大模型陪诊了!上海市第一人民医院主导,一手体验在此

现在看个病&#xff0c;都有大模型全程陪诊了。 这是上海市第一人民医院此时此时正在发生的事情—— AI就医助理&#xff0c;无需下载APP&#xff0c;打开支付宝就能用。 从诊前预约挂号、在线取号&#xff0c;到诊中院内导航、排队叫号、扫码支付&#xff0c;再到诊后的报告…

基于SpringBoot高校体育运动会管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

Vuetify3:监听当前手机还是电脑

我们在开发的时候&#xff0c;实现根据移动设备或PC设备来改编一些交互样式&#xff0c;这个时候我们需要监听宽度&#xff0c;在Vuetify3中可我们可以参考 ​​​​显示 & 平台配合监听即可在窗口缩小的时候判断出手机还是电脑 <template><v-app><div v-if…

KVB交易平台 :市场迎来新热潮!铜价会持续上涨吗?

近期&#xff0c;全球铜价出现明显上涨趋势。韩国光阳LME仓库的铜库存显著下降&#xff0c;市场对即时需求的增加作出了积极反应。供应端的紧张和需求端的复苏共同推动了铜价的上涨。 KVB外汇 分析师们对未来铜价保持谨慎乐观态度&#xff0c;认为长期内铜价有望保持稳定甚至进…

unity 打开文件资源管理器(不使用UnityEditor)

问题描述&#xff1a; 有个地方需要用户上传一张图片&#xff0c;网上查了&#xff0c;使用了如下代码&#xff1a; string imagePath EditorUtility.OpenFilePanel("Select Image", "", "png,jpg,jpeg");然后在打包发布时遇到问题&#xff0c…

浏览器关闭页面 前的提示

原生html <script>window.addEventListener("beforeunload", function (e) {// 取消事件的默认动作e.preventDefault();// Chrome 需要设置 returnValuee.returnValue "2333333333";});</script>React useEffect(() > {const handleBefor…

【面试系列】UI设计师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

守望先锋2延迟高、卡顿、丢包的解决方法一览

守望先锋2/ow2是一款在全球范围内拥有超高热度的特殊游戏&#xff0c;因为该作在一定程度上是FPS游戏融合了MOBA元素&#xff0c;守望先锋2中的每一位英雄之间都有克制因素&#xff0c;使其技能点形成闭环逻辑&#xff0c;提升了游戏的可重复游戏性和趣味性。不过很多玩家在游玩…

三菱A系列网络连接

寄存器名 读写 寄存器类型 变量类型 寄存器范围 说明 X##1 R/W BIT I/O离散 0&#xff0d;7FF Input Y##1 R/W BIT I/O离散 0&#xff0d;7FF Output M##1 R/W BIT I/O离散 0&#xff0d;9255 Internal relay B##1 R/W BIT I/O离散 0&#xff0d;3FF Link relay F##1 R/W BIT I…