首页 > 其他分享 >深入了解Vite:依赖预构建原理

深入了解Vite:依赖预构建原理

时间:2024-09-05 19:14:17浏览次数:3  
标签:缓存 lodash 依赖 构建 Vite es

前言

前面我们有提到Vite在开发阶段,提倡的是一个no-bundle的理念,不必与webpack那样需要先将整个项目进行打包构建。但是no-bundle的理念只适合源代码部分(我们自己写的代码),vite会将项目中的所有模块分为依赖源码两部分。

依赖: 指的是一些不会变动的一些模块,如:node_modules中的第三方依赖,这部分代码vite会在启动本地服务之前使用esbuild进行预构建。esbuild 使用 Go 编写,比使用 JavaScript 编写的打包器预构建依赖快 10-100 倍。

源码: 指的是我们自己开发时写的那部分代码,这部分代码可能会经常变动,并且一般不会同时加载所有源代码。

所以总结来说:no-bundle是针对源码的,而预构建是针对第三方依赖的

使用预构建的原因

主要有以下两点:

  • commonJS 与 UMD兼容:因为Vite在开发阶段主要是依赖浏览器原生ES模块化规范,所以无论是我们的源代码还是第三方依赖都得符合ESM的规范,但是目前并不是所有第三方依赖都有ESM的版本,所以需要对第三方依赖进行预编译,将它们转换成EMS规范的产物。

比如React,它就没有ESM的版本,所以在使用Vite时需要预构建

  • 性能: 为了提高后续页面的加载性能,Vite将那些具有许多内部模块的 ESM 依赖项转换为单个模块。

比如常用的loads-es

我们引入lodash-es工具包中的debounce方法,此时它理想状态应该是只发出一个请求

import  { debounce }  from 'lodash-es'

事实也是这样

但这是预构建的功劳,如果我们对lodash-es关闭预构建呢?

vite配置文件加上如下代码,再来试试:

// vite.config.js
optimizeDeps: {
    exclude: ['lodash-es']
  }

可以看到,此时发起了600多个请求,这是因为lodash-es 有超过 600 个内置模块!

vite通过将 lodash-es 预构建成单个模块,只需要发起一个HTTP请求!可以很大程度地提高加载性能

由于Vite的预构建是基于性能优异的Esbuild来完成的,所以并不会造成明显的打包性能问题

开启预构建

默认配置

一般来说,Vite帮我们默认开启了预构建

预构建产物会存放在:node_modules/.vite/deps

里面会有一个_metadata.json的文件,这里保存着已经预构建过的依赖信息

对于预构建产物的请求,Vite会设置为强缓存,有效时间为1年,对于有效期内的请求,会直接使用缓存内容

如果只有HTTP强缓存肯定也不行,如果用户更新了依赖版本,在缓存过期之前,浏览器拿到的一直是旧版本的内容。

所以Vite对本地文件也设置了缓存判断,如果下面几个地方任意一个地方有变动,Vite将会对依赖进行重新预构建:

  • 项目依赖dependencies变更

  • 各种包管理器的lock文件变更

  • optimizeDeps配置内容变更

自定义配置

entries

默认情况下,Vite会抓取项目中的index.html来检测需要预构建的依赖

optimizeDeps: {
  entries: ['index.html']
}

如果指定了 build.rollupOptions.input,Vite 将转而去抓取这些入口点。

exclude

排除需要预构建的依赖项

optimizeDeps: {
  exclude: ['lodash-es']
}

include

默认情况下,不在 node_modules 中的依赖不会被预构建。使用此选项可强制选择预构建的依赖项。

optimizeDeps: {
  include: ['lodash-es']
}

预构建流程

还是从源码入手,在启动服务的过程中会执行一个initDepsOptimizer表示初始化依赖优化

接着找到定义initDepsOptimizer方法的地方

在这里会执行createDepsOptimizer方法,再接着找到定义createDepsOptimizer的地方

这里首先会去执行loadCachedDepOptimizationMetadata用于获取本地缓存中的metadata数据

该函数会在获取到_metadata.json文件内容之后去对比lock文件hash以及配置文件optimizeDeps内容,如果一样说明预构建缓存没有任何改变,无需重新预构建,直接使用上次预构建缓存即可

如果没有缓存时则需要进行依赖扫描

这里主要是会调用scanImport方法,从名字也能看出该方法应该是通过扫描项目中的import语句来得到需要预编译的依赖

最终会返回一个prepareEsbuildScanner方法

最后该方法中会使用esbuild对扫描出来的依赖项进行预编译。

标签:缓存,lodash,依赖,构建,Vite,es
From: https://www.cnblogs.com/songyao666/p/18399086

相关文章

  • libreoffice24.2--arm环境源码编译--构建RPM包
    1、下载源代码地址:https://zh-cn.libreoffice.org/download/libreoffice/ 2、构建环境,使用docker容器,在容器内编译,使用的基础镜像是:fedora:latest,使用过centos9和centos10,centos9gcc版本不够;centos10安装fakeroot包有问题,无法构建rpm包。3、在解压后的libreoffice-24.2.......
  • 基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
    作者:计缘LLMChat应用大家应该都不陌生,这类应用也逐渐称为了我们日常的得力助手,如果只是个人使用,那么目前市面上有很多方案可以快速的构建出一个LLMChat应用,但是如果要用在企业生产级别的项目中,那对整体部署架构,使用组件的性能,健壮性,扩展性要求还是比较高的。本文带大家了解一......
  • 构建高效医护人员排班系统:Spring Boot框架的优势
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理医护人员排班系统的相关信息成为必然。开发合适的医护人员排班系统,可以方便管理人员对医护......
  • 浅述GIS技术与EasyCVR的深度融合:构建视频监控的地理空间信息化综管平台
    随着科技的飞速发展,视频监控与地理信息系统(GIS)技术的融合在各行各业中展现出强大的应用潜力和价值。旭帆科技EasyCVR视频平台,作为一款高性能的视频汇聚管理平台,凭借其强大的视频处理、汇聚与融合能力,结合GIS技术,为智慧安防、应急救援等领域提供了更为全面、高效的解决方案。GIS技......
  • 视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线
    随着科技的飞速发展,视频监控系统已成为现代社会安全防范的重要组成部分,广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略,不仅能够显著提升安全监控的效率和效果,还能在关键时刻提供关键证据,保障人员与财产的安全。一、需求分析:明确监......
  • 用 React 构建一个简单的计算器:前端开发实战演练
    在前端开发中,React是一个非常流行的JaScript框架,广泛用于构建用户界面。今天我们将通过一个实战项目,展示如何用React构建一个简单的计算器,这不仅可以帮助你巩固对React的基础知识,还能让你对实际开发有更深的理解。一、项目搭建你需要确保本地环境已经安装了Node.js和n......
  • 超强台风“摩羯”来临:EasyCVR平台如何汇聚城市视频资源,构建应急监测网
    一、背景概述2024年第11号台风“摩羯”自生成以来,迅速加强为超强台风级别,预计将在海南琼海到广东电白一带沿海登陆,带来16-17级的强风和巨浪。中央气象台和各地气象部门纷纷发布预警,各级政府和相关部门紧急启动应急响应机制,全力做好防台抗灾工作。我国作为自然灾害多发的国家,每年......
  • vue3+vite+echarts集成中国地图
    前段时间我们的项目有使用到echarts集成中国地图的功能,实际上这个功能我进项目组的时候人家就已经完成了,我这边只是简单复刻了一遍,先看看效果图;上代码,走起<template><!--第一步:设置地图容器--><divid="map"style="width:100vw;height:100vh"></div></template>......
  • 测试工程师的质量体系构建指南
    掌握质量体系的知识与技能,对于个人与企业而言,均占据着举足轻重的地位。对于个体而言,深入学习质量体系不仅能够显著提升专业技能的广度与深度,还能在激烈的职场竞争中脱颖而出,更关键的是,它能在心中根植起强烈的质量意识,成为职业生涯中不可或缺的宝贵财富。而对于企业而言,构建并持续优......
  • C++程序的发布部署方式及缺失依赖库dll的解决方法
    主要对Windows平台上C++项目开发过程中库目录进行梳理及程序发布要注意的相关事项进行总结,希望对其他开发者有一定的借鉴意义。1.问题的提出在最近的项目中,主要工作是为SketcchUp平台开发基于Ruby的扩展功能库,这种库文件是以.so为后缀的形式提供,用C++语言来编写实现。当我在自己......