vue3和vite

news2024/9/22 11:47:23

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 / index
  const 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.coloradmin.cn/o/1678683.html

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

相关文章

应用层之 HTTP 协议

HTTP 协议 HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些 其他的资源, 比如图片, 视频, 音频等二进制的数据。浏览器获取到网页&#…

了解 Robot Framework :接口自动化测试教程!

开源自动化测试利器&#xff1a;Robot Framework Robot Framework 是一个用于实现自动化测试和机器人流程自动化&#xff08;RPA&#xff09;的开放源代码框架。它由一个名为 Robot Framework Foundation 的组织得到推广&#xff0c;得到了多家领军企业在软件开发中的广泛应用。…

Shopline和Shopify哪个更好?Shopline和Shopify的区别

Shopline和Shopify哪个更好取决于用户面向的市场&#xff0c;面向亚洲市场就更适合有本地化支持的Shopline&#xff0c;而如果希望拓展全球业务&#xff0c;Shopify可能更好。 Shopline和Shopify都是知名的电子商务平台&#xff0c;可以很好的帮助商家搭建和管理在线商店&…

【基础算法总结】二分查找二

二分查找二 1.山脉数组的峰顶索引2.寻找峰值3.寻找旋转排序数组中的最小值4.点名 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.山脉数组的…

Blender雕刻建模_笔刷纹理和顶点绘制

笔刷纹理 主要用于皮肤&#xff0c;纹理的雕刻。 可以修改映射方式来实现不同绘制效果。 用一张纹理来定义笔刷各个点的强度。其中白色为1&#xff0c;黑色为0。 设置笔刷纹理步骤&#xff1a; -新建一套笔刷 -强度&#xff0c;设为0.15&#xff08;可以根据需求修改&#x…

Ubuntu 配置Samba

Ubuntu 配置&#xff1a; 安装 Samba &#xff1a; sudo apt-get install samba添加用户并设置密码&#xff08;可与ubuntu用户密码相同方便记忆&#xff09; sudo smbpasswd -a root这里我设置的密码为123456 sudo vi /etc/samba/smb.conf注意这个共享的目录一定要存在\ho…

高通Android 11/12/13 通过包名设置默认launcher

背景&#xff1a;最近在封装供第三应用系统SDK 接口&#xff0c;遇到一个无法通过包名设置主launcher代码坑所以记录下。 涉及类roles.xml # <!---~ see com.android.settings.applications.defaultapps.DefaultHomePreferenceController~ see com.android.settings.appl…

git常用命令及其ignore文件

1.git本地操作命令 # 查看git的版本 git --version # 生成空的本地仓库 git init # 将文件添加到暂存区 git add 文件 # 将暂存区里的文件提交到本地仓库 git commit -m "描述"2.git远程仓库命令 # 添加远程仓库 git remote add origin http://192.168.1.130:9000/…

asp.net 齿轮加工车间生产管理系统-计算机毕业设计源码56014

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;在现实运用中&#xff0c;为方便用户能够可以随时进行在线…

IT Tools

ChatGpt chatGpt chatgpt vs & vscode工具 Vs Extensions & Remote Development Vs Extensions Remote-SSH VSCode远程连接到Linux并实现免密码登录 Git Graph C cppreference.com cplusplus 镜像站点 用于下载 QT, Ubuntu, 清华镜像站点 CMake Downlo…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

接口自动化-requests库

requests库是用来发送请求的库&#xff0c;本篇用来讲解requests库的基本使用。 1.安装requests库 pip install requests 2.requests库底层方法的调用逻辑 &#xff08;1&#xff09;get / post / put / delete 四种方法底层调用 request方法 注意&#xff1a;data和json都…

网络安全产业的现在时和将来时

由于之前新冠疫情在全球肆虐&#xff0c;网络安全行业面临着不少挑战。例如&#xff0c;企业在被迫数字转型过程中&#xff0c;造成数据泄露威胁加剧。另一方面&#xff0c;攻击者的攻击手段和方式也日趋复杂和成熟&#xff0c;加密勒索和针对新冠疫情的网络钓鱼层出不穷。 基…

玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分2)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分2&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

togaf培训简介2

1.定义 2.ADM 业务下降期不要瞎折腾&#xff0c;上升期配合业务做一些改革&#xff1f; 项目交付物不能是聊天记录、PPT什么的&#xff0c;最起码是邮件。 3.架构内容框架 或者叫&#xff1a;企业统一体。 包括&#xff1a;企业连续性和解决方案连续性 方案和工具的解耦很大程…

FPGA - GTX收发器-K码 以及 IBERT IP核使用

一&#xff0c;前言 在FPGA - Xilinx系列高速收发器---GTX中详细介绍了GTX的基础知识&#xff0c;以及IP核的调用&#xff0c;下面将补充一下GTX在使用中的高速串行数据流在接收和发送时的控制与对齐&#xff08;K码&#xff09;&#xff0c;以及高速接口GTX&#xff0c;如果G…

CRMEB开源打通版/标准版v4电商商城系统小程序发布之后无法生成海报问题

小程序产品分销二维码生成不了 开发者工具可以生成海报&#xff0c;但是发布之后无法生成 1.在开发者工具中&#xff0c;将不校验合法域名关闭 2.点击生成海报&#xff0c;查看console 3.将域名填写到微信公众平台小程序的download合法域名中 网址微信公众平台

如何利用R包进行主成分分析和可视化

一. 使用R包“FactoMineR”进行主成分分析&#xff08;PCA&#xff09; 基本步骤如下&#xff1a; 安装和加载包&#xff1a;如果尚未安装&#xff0c;首先安装“FactoMineR”包&#xff0c;然后加载它&#xff1a; install.packages("FactoMineR")library(FactoM…

记录一下自己的宏碁暗影骑士电脑的属性

TOC 前言 没有前言。 参考博文 怎么查自己电脑服务器信息吗,如何查看自己电脑的服务器 一、cmd 看到服务器型号 wmic csproduct get name查询CPU个数 按照博主的方法&#xff0c;我出现了报错。 在 Windows 上&#xff0c;您可以通过 PowerShell 来执行类似的操作。您可以…

记一次洛谷刷题让人摸不到头脑的报错——Runtime Error.Received signal 6: Aborted / IOT trap.

报错题目 外星密码 - 洛谷 具体报错信息 Runtime Error.Received signal 6: Aborted / IOT trap. 错误代码 #include <iostream> #include <cstring> using namespace std;string sol() {string s "";string t "";char c ;int n 0;whi…