从0到1深入理解vite

一、什么是构建工具

  1. ts:如果遇到ts文件,我们需要使用tsc把ts转换为js
  2. react/vue : 安装react-compiler、vue-conplier 将我们写的jsx或者vue文件转换成render函数
  3. less/sass/postcss/somponent-style:我们又需要less-loader、sass-loader等一系列编译工具
  4. 语法降级:babel—>将es的新语法转换成旧版浏览器可以接受的语法
  5. 体积优化:uglifyjs—>将代码进行压缩变成体积更小性能更高的文件

每次稍微改一点点东西,就会非常麻烦
我们需要把App.tsx通过tsc转换为App.jsx,再通过React-complier转换为js文件

有一个东西能够帮我们把tsc,react-complier,less,babel,uglifyjs全部集成到一起,我们只需要关心我们写的代码,如果代码一变化,就会全部把上述流程全部走一遍,这个东西就是构建工具

一个构建工具到底承担了哪些?

  1. 模块化开发支持:支持直接从node_modules中引入代码以及多种模块化支持
  2. 处理代码兼容性:比如babel语法降级、less、ts语法转换(不是构建工具做的,而是构建工具将这些语法对应的处理工具集成进来自动化处理)
  3. 提高项目性能 :压缩文件,代码分割
  4. 优化开发体验:
    • 构建工具会自动监听文件的变化,当文件变化会自动调用对应的集成工具进行重新打包,然后在浏览器重新运行,整个过程叫做热更新
    • 开发服务器:跨越问题,用react-cli,create-react-element、vue-cli 解决跨域问题

每次改一点,都需要走一遍这个构建的流程,顺序还不能错

构建工具就是为了让我们不用关心代码在浏览器如何运行,我们只需要首次给构建工具提供一个配置文件(这个配置文件也不是必须的,他会有默认的),有个这个集成的配置文件之后,我们就可以在下次需要更新的时候调用一次对应的命令就好了,如果我们再结合热更新,我们就不用关心生产的代码也不用关心代码如何在浏览器如何运行,只需要关心我们怎么写就行

市面上主流的构建工具

webpack
vite
parcel
esbuild
rollup
grunt
gulp

二、vite相较于webpack的优势

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

如果我们的项目越大,webpack所要处理的js代码就越多,跟webpack的构建过程有关,造成需要很长时间才能启动开发服务器

webpack支持多种模块化:工程不止跑在浏览器端
在这里插入图片描述

他一开始必须要统一模块化代码,所以意味着他需要将所有的依赖全部读一遍

vite是基于esmodule的,不能写commonjs代码,就不需要讲所有的依赖都读一遍,就以为不需要很长的时间启动开发服务器

根据下图:webpack先从入口开始把所有的模块构建在开启开发服务器,而vite是先开启服务器,从入口只加载当前路由的模块,按需加载,所以很快
在这里插入图片描述

三、vite启动项目初体验

yarn create vite

  • 会帮我们全局安装一个create-vite(vite脚手架)
  • 会直接运行create-vite bin目录下的一个执行配置

很多人会误区 认为官网中使用yarn create构建项目的过程是vite在做的事情,create-vite只是一个脚手架

create-vitevite的关系是什么?

create-vite内置了vite
就像是使用vue-cli也会内置webpack

预设

我们自己搭建一个项目,需要下载vite、vue、post-scc、less、babel等,而create-vite/vue-cli会帮我们集成好这些东西,这个就叫预设

四、vite依赖预构建

在默认情况下,esmodule导入资源的时候要么是绝对路径,要么是相对路径,既然我们现在的最佳实践是node_modules,为什么在es官方在我们导入非绝对路径和非相对路径资源的时候不帮我们搜寻node_modules呢?

原因就是太消耗性能了,在浏览器端,我们想要获取资源,都是通过http请求去加载资源,而一个资源往往也要引用好多个资源,这样一次就需要加载成千上万个资源,如果每个引入的资源都需要去加载,那么就会非常消耗性能

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

那么vite是怎么处理能够获取到这种非绝对路径或者相对路径的资源呢?

官网回答:https://cn.vitejs.dev/guide/features#npm-dependency-resolving-and-pre-bundling

vite在处理过程中如果遇到了非绝对路径或者相对路径的引用,则会尝试开启路径补全,比如我们引入import { cloneDeep } from "lodash";,会修改成如下图
在这里插入图片描述
找寻依赖的过程中,是自当前目录依次向上查找的过程,直到搜寻到根目录或者搜寻到对应依赖为止

而为何会把路径补齐成上图这样?

这是因为我们在导入第三方的包的时候,并不确定第三方包是以何种形式导出的,有的是commonjs(axios)规范导出,有的是esmodule规范导出,所以vite在导入这些第三方包的时候,就需要统一处理,vite会找到对应的依赖,然后用esbuild(对js语法进行处理的一个库),将其他规范的代码转换成esmodule规范的代码,然后放到当前目录下的node_modules/.vite/deps文件夹中,同时对

在这里插入图片描述

依赖预构建解决了什么问题

  1. 不同的第三方包会有不同的导出格式(这个是vite没法约束的事情),导入时统一格式

  2. 对路径的处理上可以直接使用.vite/deps,方便路径重写

  3. 网络多包传输的性能问题(也是原生esmodule不敢解决node_modules的问题),有了依赖预构建以后,无论有多少的额外的export和import,vite都会尽可能的将他们进行继承,最后生成一个或者几个模块

    假设loadsh又依赖了很多其他的模块,并且这些模块都是用export导出,比如lodash-es这个库,我们可以看到下图有很多导出
    在这里插入图片描述
    而在浏览器中则会看到vite已经把lodash-es做了一层转换,转换成一个一个的函数
    在这里插入图片描述

    export { default as add } from "./add.js" 
    //相当于 
    import add from "./add.js" 
    export const add = add 
    

    vite重写以后

    function add(){}
    

如果我们不让lodash-es进行预构建,可以再vite.config.js中配置
在这里插入图片描述
我们可以看到改变,足足有649个请求,并且lodash-es的代码也是没有打包过的
在这里插入图片描述
从上图不难看出,使用与构建之后只需要请求一,而不预构建则需求请求600多次,可想而知差距有多大,这也是为什么说解决了网络多包传输的性能问题

开发环境中,每次依赖预构建所重新构建的相对路径都是正确的
生产环境中vite会全权交给rollup去完成生产环境的打包

vite的基本安装和使用

vite的编译结果

vite的编译结果分析

vite的配置文件

vite中处理css,静态资源怎么去做

vite的插件以及常用插件的使用

vite与ts的结合

vite构建react项目,svelte项目,vue3项目

vite的构建原理

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

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

相关文章

目标检测-RT-DETR

RT-DETR (Real-Time Detection Transformer) 是一种结合了 Transformer 和实时目标检测的创新模型架构。它旨在解决现有目标检测模型在速度和精度之间的权衡问题,通过引入高效的 Transformer 模块和优化的检测头,提升了模型的实时性和准确性。RT-DETR 可…

Ceph RBD使用

CephRBD使用 一、RBD架构说明二、RBD相关操作1、创建存储池2、创建img镜像2.1 创建镜像2.1.2 查看镜像详细信息2.1.3 镜像其他特性2.1.4 镜像特性的启用和禁用 3、配置客户端使用RBD3.1 客户端配置yum源3.2 客户端使用admin用户挂载并使用RBD3.2.1 同步admin账号认证文件3.2.2 …

社交媒体的智能变革:Facebook AI优化用户体验

Facebook作为全球领先的社交平台,一直致力于通过人工智能(AI)技术提升用户体验。AI技术在Facebook的应用涵盖了推荐系统、自然语言处理、广告投放和用户反馈等多个方面,使平台的互动和内容体验更加智能和个性化。 推荐系统的智能化…

结构型设计模式—外观模式

结构型设计模式—外观模式 在软件开发的过程中,你是否遇到过这样的情况:你需要调用一个复杂系统中的多个模块,而每个模块都有自己的接口和使用方法,这让你不得不面对复杂的调用逻辑和大量的冗余代码?这时候&#xff0…

【网络安全】XSS+OTP绕过+账户接管

未经许可,不得转载。 文章目录 正文XSSOTP绕过账户接管正文 目标:www.example.com XSS 不断寻找可能存在XSS的点位。 终于,在个人资料页面:www.example.com/profile_details.php?userid= ,使用Payload<script>alert(1)</script>,实现XSS: 因此,能够实…

vxe-table——实现table 动态显示 +冻结列等功能——技能提升

之前我也有写过类似的功能&#xff0c;就是可以自定义勾选需要展示的列。 不过之前是我自己写的弹窗处理的&#xff0c;有现成的插件vex-table插件可以使用。 vxe-table官网&#xff1a;https://vxetable.cn/v3/#/table/api 解决步骤1&#xff1a;安装vxe-table——npm inst…

HTTP状态码介绍,带你了解请求响应全过程

1xx状态码&#xff1a;&#x1f449;表示信息响应&#xff0c;客户端请求已被接收&#xff0c;继续处理。 100 - Continue&#xff1a;客户端应继续其请求。&#x1f914; 101 -Switching Protocols&#xff1a;服务器已经理解并接受了客户端的请求&#xff0c;将切换协议。 10…

【自用14】C++俄罗斯方块-思路复盘

1.编写主函数 int main(void){welcome();//欢迎函数system("pause");//窗口停留colsegraph();//关闭图画return 0;//返回值 }其中包含有最开始的欢迎&#xff0c;以及基础的窗口停留、图画关闭和返回值语句 2.编写欢迎函数 需求&#xff1a; 欢迎函数中需要包含的…

Java如何读取resources目录下的文件路径(九种代码示例教程)

本文摘要&#xff1a;Java如何读取resources目录下的文件路径 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f91…

教育行业解决方案:智能PPT在教育行业的创新应用

在信息化时代&#xff0c;教育行业面临着巨大的变革。随着人工智能技术的不断发展&#xff0c;传统教学方式正在被重新定义。彩漩科技作为 AI 技术的先行者&#xff0c;推出了歌者 PPT &彩漩 PPT&#xff0c;为教师、学生和家长提供了一种全新的教育体验&#xff0c;实现了…

Quartz.Net_持久化

简述 通常而言&#xff0c;Quartz.Net的数据默认是存储在运存中的&#xff0c;换言之&#xff1a;断电即失。所以在默认情况下&#xff0c;当系统重启后&#xff0c;原先的所有任务、触发器、调度器都会失效 为避免上述情况的发生&#xff0c;可以对Quartz.Net进行持久化设置…

第二十一届华为杯数学建模经验分享之资料分享篇

今天给大家分享一些数学建模的资料&#xff0c;通过这些资料的学习相信你们一定在比赛中获得好的成绩。今天分享的资料包括美赛和国赛的优秀论文集、研赛的优秀论文集、推荐数学建模的相关书籍、智能算法的学习PPT、python机器学习的书籍和数学建模经验分享与总结&#xff0c;其…

[Hive]五、Hive 源码编译

G:\Bigdata\2.hive\大数据技术之Hive源码编译 Hadoop3.3.1 Hive3.1.3 Spark3.3.1 Hive on spark / spark on hive 均验证通过。 第1章 部署Hadoop和Hive 1.1 版本测试 Hadoop3.3.6 和Hive3.1.3 运行hive客户端时报错: java.lang.NoSuchMethodError:com.google.common.ba…

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include<stdio.h> #define MAX 100 void findmin(int a[],int n,int& pos) {int mina[0];pos0;//pos0我开始忘了&#xff0c;特别注意边界for(int …

怎么才能快速提升网站在谷歌的收录?

​想让你的网站在谷歌快速收录&#xff0c;其实正常的方法都需要时间&#xff0c;无论是定期更新&#xff0c;提交网站地图&#xff0c;搞外链建设啥的&#xff0c;这些方法虽然有效&#xff0c;但见效慢。而且谷歌爬虫不会一下子抓取你所有页面&#xff0c;需要时间。如果真想…

停车找位难怎么办?捷顺智慧车位引导系统方案,让找车停车变得简单快捷!

随着城市化的快速发展&#xff0c;城市交通压力日益增大&#xff0c;尤其是在商业区、办公区和居民区&#xff0c;停车位的供需矛盾愈发突出。在这种背景下&#xff0c;车位引导系统&#xff08;PGS&#xff09;的重要性日益凸显。它不仅能够提高停车效率&#xff0c;减少车辆在…

用了这个编程助手,“数学建模”真的太简单了~

目录 一、ChatGPT在数学建模中的价值1、学习和指导2、模型评估和改进3、算法设计和优化4、解释和文档生成 二、作为编程手如何正确使用ChatGPT1、阅读代码及优化代码2、执行脚本3、生成单测 三、编程手备战建模大赛的一些建议1、明确&#xff1a;如何去问一个问题2、程序设计能…

[译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

STM32F100xx 系统架构

STM32F100xx 系统架构 参考手册下载关键词: STM32F100xx advanced Arm-based 32-bit MCUs - Reference manual 总结 注意: 这个架构是High-density value line devices的图。 ICode bus 把M3内核指令总线连接到闪存指令接口。Bus matrix 由4主4从构成。 总线矩阵管理内核系…

进程

进程 进程进程的含义PCB块内存空间进程分类&#xff1a;进程的作用进程的状态进程已经准备好执行&#xff0c;所有的资源都已分配&#xff0c;只等待CPU时间进程的调度 进程相关命6.查询进程相关命令1.ps aux2.top3.kill和killall发送一个信号 函数1.fork();2.getpid3.getppid示…