vite初识

Vite是伴随着Vue3正式版一起发布的,最开始Vite 1.0的版本是为Vue3服务的,并不是跨框架的。之后半年时间左右,出现了Vite 2.0版本,Vite 2.0真正脱离了和Vue3的强关联,以插件的方式,可以集成到目前流行的主流前端框架(Vue3、React)里。

打包优化核心

目前的技术发展来说,不论是什么打包工具,为了在生产环境中获得最佳的加载性能,最好还是将代码进行 tree-shaking、懒加载和 chunk 分割(以获得更好的缓存)。

组成

  • 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。

  • 一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可输出用于生产环境的高度优化过的静态资源。

选用原因

在浏览器支持 ES 模块之前,JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们对 “打包” 这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运行的文件。

当我们开始构建越来越大型的应用时,需要处理的 JavaScript 代码量也呈指数级增长。包含数千个模块的大型项目相当普遍。基于 JavaScript 开发的工具就会开始遇到性能瓶颈:通常需要很长时间(甚至是几分钟!题主遇见过5分钟的!)才能启动开发服务器,即使使用模块热替换(HMR),文件修改后的效果也需要几秒钟才能在浏览器中反映出来。如此循环往复,迟钝的反馈会极大地影响开发者的开发效率和幸福感。

Vite 旨在利用生态系统中的新进展解决上述问题:浏览器开始原生支持 ES 模块,且越来越多 JavaScript 工具使用编译型语言编写。

特点优势

Vite 通过在一开始将应用中的模块区分为 依赖 和 源码 两类,改进了开发服务器启动时间。

  • 依赖 大多为在开发时不会变动的纯 JavaScript。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会存在多种模块化格式(例如 ESM 或者 CommonJS)。

    Vite 将会使用 esbuild 预构建依赖。esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。

  • 源码 通常包含一些并非直接是 JavaScript 的文件,需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),时常会被编辑。同时,并不是所有的源码都需要同时被加载(例如基于路由拆分的代码模块)。

Vite 天然支持引入 .ts 文件

Vite 仅执行 .ts 文件的转译工作,并不执行 任何类型检查。并假定类型检查已经被你的 IDE 或构建过程处理了。

动态模块热替换(HMR)

Vite 以 原生 ESM 方式提供源码。这实际上是让浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码,即只在当前屏幕上实际使用时才会被处理。

HTTP缓存 

Vite 同时利用 HTTP 头来加速整个页面的重新加载(再次让浏览器为我们做更多事情):源码模块的请求会根据 304 Not Modified 进行协商缓存,而依赖模块请求则会通过 Cache-Control: max-age=31536000,immutable进行强缓存,因此一旦被缓存它们将不需要再次请求。

依赖预构建

当你首次启动 vite 时,Vite 在本地加载你的站点之前预构建了项目依赖。

目的

  1. CommonJS 和 UMD 兼容性: 在开发阶段中,Vite 的开发服务器将所有代码视为原生 ES 模块。因此,Vite 必须先将以 CommonJS 或 UMD 形式提供的依赖项转换为 ES 模块。

    在转换 CommonJS 依赖项时,Vite 会进行智能导入分析,这样即使模块的导出是动态分配的(例如 React),具名导入(named imports)也能正常工作:

    js
    // 符合预期
    import React, { useState } from 'react'
  2. 性能: 为了提高后续页面的加载性能,Vite将那些具有许多内部模块的 ESM 依赖项转换为单个模块。

    有些包将它们的 ES 模块构建为许多单独的文件,彼此导入。例如,lodash-es 有超过 600 个内置模块!当我们执行 import { debounce } from 'lodash-es' 时,浏览器同时发出 600 多个 HTTP 请求!即使服务器能够轻松处理它们,但大量请求会导致浏览器端的网络拥塞,使页面加载变得明显缓慢。

    通过将 lodash-es 预构建成单个模块,现在我们只需要一个HTTP请求!

缓存

文件系统缓存

vite 将预构建的依赖项缓存到 node_modules/.vite 中。它会基于以下几个来源来决定是否需要重新运行预构建步骤:

  • 包管理器的锁文件内容,例如 package-lock.jsonyarn.lockpnpm-lock.yaml,或者 bun.lockb
  • 补丁文件夹的修改时间;
  • vite.config.js 中的相关字段;
  • NODE_ENV 的值。

只有在上述其中一项发生更改时,才需要重新运行预构建。

如果出于某些原因你想要强制 Vite 重新构建依赖项,你可以在启动开发服务器时指定 --force 选项,或手动删除 node_modules/.vite 缓存目录。

浏览器缓存

已预构建的依赖请求使用 HTTP 头 max-age=31536000, immutable 进行强缓存,以提高开发期间页面重新加载的性能。一旦被缓存,这些请求将永远不会再次访问开发服务器。如果安装了不同版本的依赖项(这反映在包管理器的 lockfile 中),则会通过附加版本查询自动失效。如果你想通过本地编辑来调试依赖项,您可以:

  1. 通过浏览器开发工具的 Network 选项卡暂时禁用缓存;
  2. 重启 Vite 开发服务器指定 --force 选项,来重新构建依赖项;
  3. 重新载入页面。

Vite构建Vue3项目

npm create vite@latest

目录结构

webpack项目的编译入口文件是main.js,配置文件是vue.config.js;而我们用Vite构建的项目的编译入口文件是index.html,配置文件是vite.config.js。其他的目录结构基本和webpack构建的项目是一致的。

vite.config.js配置文件

插件

vite使用一些三方依赖基本都是以plugins插件的方式引入的。

例如在webpack的项目中,我们要使用svg相关的图标,我们是通过引入loader的方式来使用的,然后在vue.config.js配置文件里设置svg-sprite-loader
然而在vite里是通过集成插件的方式来使用svg图标的,我们得先安装vite-plugin-svg-icons的依赖,然后在plugins数组里,设置要缓存的svg图标的目录。

构建过程

Vite一开始会去加载index.html文件,然后通过script标签加载main.js,这其实和Vite的编译特性有关,传统的例如webpack的构建打包方式,启动必须优先抓取并构建你的整个应用,然后才能提供服务。这样的打包方式有一个明显的缺点,就是重建整个包的效率很低。而且更新速度会随着应用体积增长而直线下降。但在 Vite 中,当编辑一个文件时,Vite支持动态模块热替换(HMR),允许一个模块 “热替换” 它自己,而不会影响页面其余部分,使得无论应用大小如何,HMR 始终能保持快速更新。

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

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

相关文章

Apache Doris 在某工商信息商业查询平台的湖仓一体建设实践

本文导读: 信息服务行业可以提供多样化、便捷、高效、安全的信息化服务,为个人及商业决策提供了重要支撑与参考。本文以某工商信息商业查询平台为例,介绍其从传统 Lambda 架构到基于 Doris Multi-Catalog 的湖仓一体架构演进历程。同时通过一…

js中for 循环和 map 循环都是是什么,他们有什么区别

在JavaScript中,for循环和map循环都是用于迭代数组元素的常见方法。 for循环:for循环是一种常见的迭代结构,可以使用循环变量和循环条件来控制循环的次数。它可以遍历数组的索引,并通过索引访问数组中的元素。示例代码如下&#…

【头歌系统数据库实验】实验2 MySQL软件操作及建库建表建数据

目录 第1关:创建数据库 第2关:创建供应商表S,并插入数据 第3关:创建零件表P,并插入数据 第4关:创建工程项目表J,并插入数据 第5关:创建供应情况表SPJ,并插入数据 …

第一百九十回 自定义一个可选择的星期组件

文章目录 1. 概念介绍2. 实现方法2.1 实现思路2.2 实现方法3. 示例代码4. 内容总结我们在上一章回中介绍了"如何让Text组件中的文字自动换行"相关的内容,本章回中将介绍 如何自定义一个可选择的星期组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

智能优化算法应用:基于类电磁机制算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于类电磁机制算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于类电磁机制算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.类电磁机制算法4.实验参数设定5.算法结果…

EasyRecovery14破解版 v14.0.0.4 官方免费版(含激活码)

软件介绍 EasyRecovery14高级版是一款功能强大的数据恢复软件,软件对比家庭版本它的使用更加广泛,在恢复数据方面软件可以做到最完整的损失恢复,无论是文档、音乐、软件都可以一键恢复,同时软件还可以对文件的名字、后缀进行修改…

ES6之Symbol

ES6中为我们新增了一个原始数据类型Symbol,让我为大家介绍一下吧! Symbol它表示是独一无二的值 Symbol要如何创建 第一种创建方式: let sy Symbol()第二种创建方式: let sy Symbol.for()具体独一无二在哪呢?它们的地…

nodejs+vue+微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐

本项目主要分为前台模块与后台模块2个部分,详细描述如下:   (1)前台模块 首页: 首页可以起到导航的作用,用户想要了解网站 ,网站首页为用户可以深入了解网站提供了一个平台,它就向一个“导游”…

react-router v6实现动态的title(react-router-dom v6)

前言 react-router-dom v6 默认不支持 title设置了,所以需要自己实现一下。 属性描述path指定路由的路径,可以是字符串或字符串数组。当应用的URL与指定的路径匹配时,该路由将会被渲染。element指定要渲染的React组件或元素。children代表…

Flutter桌面应用程序定义系统托盘Tray

文章目录 概念实现方案1. tray_manager依赖库支持平台实现步骤 2. system_tray依赖库支持平台实现步骤 3. 两种方案对比4. 注意事项5. 话题拓展 概念 系统托盘:系统托盘是一种用户界面元素,通常出现在操作系统的任务栏或桌面顶部。它是一个水平的狭长区…

深度学习在单线性回归方程中的应用--TensorFlow实战详解

深度学习在单线性回归方程中的应用–TensorFlow实战详解 文章目录 深度学习在单线性回归方程中的应用--TensorFlow实战详解1、人工智能<-->机器学习<-->深度学习2、线性回归方程3、TensorFlow实战解决单线性回归问题人工数据集生成构建模型训练模型定义损失函数定义…

发请求/传递过程中出现‘[object Object]‘的问题“

问题&#xff1a;post请求的时候data数据传过去的的时候显示data: [object Object] 问题代码&#xff1a; wx.request( { url: "", header: { "Content-Type": "application/x-www-form-urlencoded" }, method: "POST", data:…

【算法每日一练]-图论(保姆级教程篇11 tarjan模板篇)无向图的桥 #无向图的割点 #有向图的强连通分量

目录 预备知识 模板1&#xff1a;无向图的桥 模板2&#xff1a;无向图的割点 模板3&#xff1a;有向图的强连通分量 讲之前先补充一下必要概念&#xff1a; 预备知识 无向图的【连通分量】&#xff1a; 即极大联通子图&#xff0c;再加入一个节点就不再连通&#xff08;对…

Python 删除字典列表等元素问题

""" 在 Python 中&#xff0c;在迭代列表的同时修改它可能导致意外的结果&#xff0c; 因为这会破坏迭代器的状态。在你的代码中&#xff0c;当你尝试删除元素时&#xff0c; 迭代器可能会跳过下一个元素&#xff0c;导致删除的不是你预期的元素。 ""…

Kafka Schema介绍

Avro概述 简介 Apache Avro(以下简称 Avro,读音:阿夫罗)是一个数据序列化系统,是一种与编程语言无关的序列化格式,是提供一种共享数据文件的方式。Avro是Hadoop中的一个子项目,Avro是一个基于二进制数据传输高性能的中间件。Avro可以做到将数据进行序列化,适用于远程…

三星AI笔电:年底大战一触即发,行业变革在即

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透至我们日常生活的各个角落&#xff0c;而其在电脑行业的应用也正引发一场革命。 据韩国媒体Businesskorea报道&#xff0c;全球科技巨头三星电子即将于12月中发表世界首款搭载AI技术的笔电。此次发…

Leetcode1423. 可获得的最大点数

Every day a Leetcode 题目来源&#xff1a;1423. 可获得的最大点数 解法1&#xff1a;前缀和 后缀和 基于贪心的思想&#xff0c;要使得获得的点数最大&#xff0c;每次拿卡牌都应该选点数尽量高的卡牌。 但是拿卡牌有限制&#xff0c;每次行动&#xff0c;只可以从行的…

[Java][项目][战斗逻辑]基于JFrame的文字游戏

项目注解&#xff1a; Core:启动文件 AttributeBean&#xff1a;玩家属性 BackpackedBean&#xff1a;背包设计&#xff08;未完成&#xff09; BackpackedFrame&#xff1a;背包页面&#xff08;未完成&#xff09; BattleField&#xff1a;战斗逻辑&#xff08;核心&…

Android Chips(标签)

目录 一、流式布局标签发展历程 二、类型及使用 2.1 Chip.Action(默认值) 2.2 Chip.Entry 2.3 Chip.Filter 2.4 Chip.Choice 三、常用事件 3.1 OnClickListener 3.2 OnCheckedChangeListener 3.3 OnCloseIconClickListener 四、ChipGroup 4.1 ChipGroup Chip.Choi…

AGI = 大模型 + 知识图谱 + 强化学习

一、大模型&#xff08;Large Models&#xff09; 定义&#xff1a; 大模型通常指的是参数数量庞大的机器学习模型&#xff0c;特别是深度学习模型。这些模型在训练时需要大量的计算资源和数据。例如&#xff0c;GPT-3&#xff08;Generative Pre-trained Transformer 3&#…