vue3和vite

vue3

1、vue3使如何实现效率提升的

客户端渲染效率比vue2提升了1.3~2倍
SSR渲染效率比vue2提升了2~3倍

1.1、静态提升

解释:
1. 对于静态节点(如:<h1>接着奏乐接着舞</h1>),vue3直接提出来了,避免render函数多次渲染
2. 静态属性也会被提升

下面的静态节点会被提升

  • 元素节点
  • 没有绑定动态内容
// vue2 的静态节点
render(){createVNode("h1", null, "Hello World")// ...
}// vue3 的静态节点
const hoisted = createVNode("h1", null, "Hello World")
function render(){// 直接使用 hoisted 即可
}

静态属性会被提升

<div class="user">{{user.name}}
</div>
const hoisted = { class: "user" }function render(){createVNode("div", hoisted, user.name)// ...
}

1.2、预字符串化

这里是最牛的地方。vue3对于超过20个连续的静态元素,他将这些节点变成字符串节点,在SSR里面效率提升尤为明显。

<div class="menu-bar-container"><div class="logo"><h1>logo</h1></div><ul class="nav"><li><a href="">menu</a></li><li><a href="">menu</a></li><li><a href="">menu</a></li><li><a href="">menu</a></li><li><a href="">menu</a></li></ul><div class="user"><span>{{ user.name }}</span></div>
</div>

当编译器遇到大量连续的静态内容,会直接将其编译为一个普通字符串节点

const _hoisted_2 = _createStaticVNode("<div class=\"logo\"><h1>logo</h1></div><ul class=\"nav\"><li><a href=\"\">menu</a></li><li><a href=\"\">menu</a></li><li><a href=\"\">menu</a></li><li><a href=\"\">menu</a></li><li><a href=\"\">menu</a></li></ul>")

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

1.3、缓存事件处理函数

这里的效率提升很简单,就是加了缓存,具体请看下面的代码示例

<button @click="count++">plus</button>
// vue2
render(ctx){return createVNode("button", {onClick: function($event){ctx.count++;}})
}// vue3
render(ctx, _cache){return createVNode("button", {onClick: cache[0] || (cache[0] = ($event) => (ctx.count++))})
}

1.4、Block Tree

这里也很重要,这是对于具体的节点(如某个对象)的对比,依托vue3强大的编译器,会标记动态节点,并将动态节点加入到数组中,然后遍历数组进行对比。
vue2在对比新旧树的时候,并不知道哪些节点是静态的,哪些是动态的,因此只能一层一层比较,这就浪费了大部分时间在比对静态节点上

<form><div><label>账号:</label><input v-model="user.loginId" /></div><div><label>密码:</label><input v-model="user.loginPwd" /></div>
</form>

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

1.5、PatchFlag

vue2在对比每一个节点时,并不知道这个节点哪些相关信息会发生变化,因此只能将所有信息依次比对

<div class="user" data-id="1" title="user name">{{user.name}}
</div>

在这里插入图片描述

2、script setup到底做了什么

Vue 3 中的

使用

例如,传统的 Options API 可能会像这样:

<template><button @click="increment">{{ count }}</button>
</template><script>
export default {data() {return {count: 0};},methods: {increment() {this.count++;}}
};
</script>

而使用

 <template><button @click="increment">{{ count }}</button>
</template><script setup>
let count = 0;function increment() {count++;
}
</script>

vite-plugin-inspect查看每一个文件的编译结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第六行多了expose(),手动指定向外界暴露的成员,假如外部拿到后可以通过以下方法操作内部参数,打破了单项数据流
在这里插入图片描述
假如setup里确实想要暴露一些东西,那就使用defineExpose宏,宏不参与运行,参与编译
在这里插入图片描述

vite

1、统一vite中的图片转换逻辑

在这里插入图片描述

一张小图一张大于4M大图,
开发环境里打印的是正常绝对路径,
生产环境大于4M图自动变成base64
在这里插入图片描述

第一种方法是动生产环境,修改配置,小于4096就自动转换,改成0
在这里插入图片描述
第二种方法是动开发环境,自己写vite插件,

plugins:[vue(),myPlugin()]

写个插件小于4096在开发环境转成base64,
【题外:code ai插件代码补全】
vite包括esbuild和rollup,这部分代码跟rollup有关,rollup有很多生命周期钩子函数,transform是做代码转换的,什么时候运行,当他加载到一个模块的时候,他就会运行这个函数,把这个模块的路径、内容给你,发挥转换之后的结果,
在这里插入图片描述
打印的id是文件的绝对路径
在这里插入图片描述

import fs from 'node:fs'
await fs.promise.stat(id)//stat文件状态,是异步的

下面是上面await的打印对象
在这里插入图片描述
在这里插入图片描述

如果大于4096才需要转换,
读取文件(stat),是buffer对象,转base64
在这里插入图片描述

2、在vite中手动分包

在这里插入图片描述
打包出现js文件比较大的情况,js文件包括第三方和自己文件,手动进行分包
vite包括esbuild和rollup,esbuild影响开发环境,rollup影响打包结果
rollup里面有个manualChunks
在这里插入图片描述
重新打包只会改变自己js的文件大小,第三方库文件指纹也没变化
在这里插入图片描述
假如第三方库太多,可以直接这么写
在这里插入图片描述

3、在vite中使用glob完成自动化导入

在这里插入图片描述
假如使用vue-cli,其中webpack的require.context进行批量导入;vite里面是glob
打印模块的集合
1、
在这里插入图片描述
在这里插入图片描述
↓2、不是动态导入的函数,是具体的模块导入的值
在这里插入图片描述
在这里插入图片描述
3、出现模块路径、模块内容
在这里插入图片描述
在这里插入图片描述
4、map映射,pagePath不能直接写在import里,因为是用rollup打包,这个环境打包有个要求,不能放变量,import里必须放字面量或者字符串,不然会影响静态分析
在这里插入图片描述
在这里插入图片描述
5、

import { createRouter, createWebHistory } from "vue-router";
import { useStore } from "../store/index";
const routeparent = [{path: "/",name: "layout",redirect: "/statisticalchart",component: () => import("../layout/index.vue"), // 这个是默认的页面 每个页面公用的children: [],},
];
const pages = import.meta.glob("../view/**/page.js", {eager: true,import: "default",
});
const pageComps = import.meta.glob("../view/**/index.vue");const routes = Object.entries(pages).map(([path, meta]) => {const pageJSPath = path;path = path.replace("../view", "").replace("/page.js", "");path = path || "/";const name = path.split("/").filter(Boolean).join("-") || "index";//命名/a/b/c a-b-c /about about / indexconst compPath = pageJSPath.replace("page.js", "index.vue");//组件路径return {path,name,component: pageComps[compPath],meta,children: [],};
});
for (let i = 0; i < routes.length; i++) {if (routes[i].name != "login") {routeparent[0].children.push(routes[i]);} else {routeparent.push(routes[i]);}
}const router = createRouter({history: createWebHistory(),routes: routeparent,
});
router.beforeEach((to, from, next) => {const store = useStore();store.setTilte(to.meta.title);next();
});
export default router;

嵌套路由,路由参数,导航守卫等问题,参考react的umijs

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

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

相关文章

whisper使用

whisper使用 1. 直接调用 语音识别2. 语种识别 whisper.detect_language()和whisper.decode()3. 指定要识别的语种做语音识别**whisper 源码的transcribe函数** 函数解析1. transcript.py2. tokenizer.py3. audio.py4. __ init__.py github: https://gitcode.com/openai/whispe…

vue基础+高级用法

一、vue基础用法 mvvm的了解/认知 语义化模板mvc - model view controllermvvm - model view view-model vue是如何利用mvvm思想进行开发 双向数据绑定 花括号&#xff0c;构建了数据与视图的双向绑定通过视图绑定事件&#xff0c;来处理数据 生命周期-vue示例 建立&…

【JAVA进阶篇教学】第十六篇:Java中AOP使用

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十五篇&#xff1a;Java中AOP使用。 AOP&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它允许开发者在不修改源代码的情况下&#xff0c;对代码进行横切关注点的分离和增强。在 Java…

CNAME记录

CNAME记录 维基百科&#xff0c;自由的百科全书 &#xff08;重定向自CNAME&#xff09; 真实名称记录&#xff08;英语&#xff1a;Canonical Name Record&#xff09;&#xff0c;即CNAME记录&#xff0c;是域名系统&#xff08;DNS&#xff09;的一种记录。CNAME记录用于…

mysqldump: Error 2013 导致mysql停止运行

https://www.cnblogs.com/DataArt/p/10173957.html 1 查询表大小 SELECT table_name AS "表名", round(((data_length index_length) / 1024 / 1024), 2) AS "大小(MB)" FROM information_schema.tables WHERE table_schema your_database_name AND …

Togaf培训简介

Togaf简单讲 1.定义事物&#xff0c;方便大家互相理解 2.做好现状和愿景设计 3.做好现状到愿景的计划 1.togaf 首先是统一语言。大家互相能理解&#xff0c;比如各种定义。 togaf源自美国军方理论 2.没有架构设计&#xff0c;烟囱式系统是必然的。 就跟之前去政府办户籍一…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好&#xff0c;我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单&#xff0c;转化低的各种问题。 明明店铺的曝光不低&#xff0c;访客也不少&#xff0c;就是没转化。 下面我根据我们做店的经验&#xff0c;给大家分享一些问题所在&#xff0c;…

Git—安装及介绍

下载Git 官网地址&#xff1a;Git - Downloads (git-scm.com) 安装 双击安装包 点击 next 检查安装 桌面&#xff0c;右键鼠标&#xff0c;是否出现 Git GUI Here 和 Git Bash Here 打开Git Bash Here 输入命令 git --verison

NX/UG软件使用—策略OK回调环境变量

新建环境变量UGII_CAM_OPERATION_OK_EXIT&#xff0c;变量值为需要执行的xx.dll路径&#xff0c;设置后&#xff0c;重启NX&#xff0c;那么在每次点击策略OK之后&#xff0c;会自动执行xx.dll(注意这个dll需要在配置好的工具目录里&#xff0c;也就是说NX能手动加载这个dll)。…

finallyshell激活-支持所有版本(老版 + 最新版) + 所有平台(mac + windows)

一&#xff1a;打开finally shell的激活页面 二&#xff1a;点击离线激活 三&#xff1a;复制机器码&#xff0c;然后执行一下代码 原文&#xff1a;大哥原文&#xff0c;但是这个大佬是用java实现的&#xff0c;执行因为依赖的问题一直报错 基于以上问题&#xff0c;所以使…

YoLov9目标检测算法的使用

目录 一、环境安装 1、创建虚拟环境 2、安装依赖库 二、数据集准备 1、数据集的文件名 2、划分数据集 3、配置数据文件 4、修改模型结构文件的类别 5、下载模型预训练权重 三、训练 1、训练的三个文件介绍 2、训练 3、验证 4、检测单张图片 四、附录 1、训练参…

C#数据库密码加密保存和登录验证方法

目录 1. 使用哈希算法加密密码 2. 用户注册时加密密码并保存到数据库 3. 用户登录时验证密码 注意事项 如何实现加盐处理 安装BCrypt.Net包 密码哈希和验证 用户注册时加盐并哈希密码 用户登录时验证密码 1. 使用哈希算法加密密码 可以使用C#中的System.Security.Cryp…

01 区块链-- Smart Contract

Concept of Smart Contract 1. 智能合约并非区块链的专属 智能合约&#xff0c;就是一段部署在区块链里的代码。 合约有自己的地址&#xff0c;与该地址进行交易会触发代码运行&#xff0c;一旦某个事件触发合约中的条款&#xff0c;代码即自动执行。 也就是说&#xff0c;满…

上海市计算机学会竞赛平台2024年1月月赛丙组成绩等第

题目描述 给定一个在 00 到 100100 之间的整数 &#x1d44e;a&#xff0c;请将它转成等第&#xff0c;规则如下&#xff1a; 9090 或以上为 A8080 或以上为 B7070 或以上为 C6060 或以上为 D5959 或以下为 F 输入格式 单个数字表示 &#x1d44e;a 输出格式 单个字符表示…

c++快读快写

一般来讲&#xff0c;快读快写在针对数据量不是很大的输入输出的时候显得比较无力&#xff0c;但如果是多组数据或者输入量较多&#xff0c;就可以显著提升效率。 快读 一个一个字符读取比读入一个数字&#xff08;int&#xff09;快 inline int read(){int x 0, f 1;//in…

【前端】LayUI监听事件汇总

一、监听单选按钮事件 点击资源类型单选按钮时&#xff0c;请求后台接口&#xff0c;把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型&#xff1a;</label><d…

【Python快速上手(二十四)】-Python3 JSON数据解析

目录 Python快速上手&#xff08;二十四&#xff09;Python3 JSON数据解析编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09;读写JSON文件 Python快速上手&#xff08;二十四&#xff09; Python3 JSON数据解析 在Python 3中&#xff0c;使用JSON&…

6. 神经网络的内积

目录 1. 准备知识 1.1 NumPy 的多维数组 1.2 矩阵乘法 1.2.1 矩阵乘法顺序 1.2.2 矩阵乘法范例 2. 神经网络的内积 2.1 使用场合 2.2 Python 实现 1. 准备知识 1.1 NumPy 的多维数组 大家应该对多维数组都很熟悉&#xff0c;我不再多言。在 NumPy 模块中&#xff0c;…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

AI地名故事:鸦岗村

鸦岗村&#xff0c;位于广州市白云区石井镇&#xff0c;是一个历史悠久、文化底蕴深厚的村落。据《广州地名志》记载&#xff0c;南宋时期&#xff0c;南雄珠玑巷的凌氏家族迁移至此地&#xff0c;并在此建立村落。由于村子周边的山岗上常有乌鸦栖息&#xff0c;因此得名“鸦岗…