对vite的理解

news2024/11/28 6:53:58

🐱 个人主页:不叫猫先生,公众号:前端舵手
🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:vue3+vite+typeScript从入门到实践
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼(文末有我wx或者私信)。

目录

  • 对vite的理解
    • 快速的冷启动
    • 即时的热模块替换(HMR)
    • 零配置的开发环境
    • vite打包原理
    • vite配置文件

在这里插入图片描述

对vite的理解

快速的冷启动

"快速的冷启动"指的是在开发过程中,当你启动应用程序或重新启动开发服务器时,Vite 能够迅速加载应用程序。

vitewebpack
Vite 利用了 ES 模块的原生支持,它在冷启动过程中无需进行打包和编译操作,而是直接基于原始的源码文件来运行应用程序。它通过使用浏览器原生的 ES 模块加载器来实现,这个加载器可以直接从浏览器中加载和解析 ES 模块。传统的构建工具(如 webpack)在启动过程中需要先进行构建和打包操作,生成中间文件和编译后的代码,然后再启动开发服务器。这个过程可能会耗费一定的时间,特别是在大型项目中或者项目依赖较多的情况下。

由于不需要进行打包和编译的操作,Vite 的冷启动过程非常快速。它可以快速加载和解析源码文件,准备好开发环境,从而可以更快地启动应用程序并开始开发工作,加速了开发过程中的热重载和重新构建操作。

即时的热模块替换(HMR)

即时的热模块替换(HMR)是指在开发过程中,当你对代码进行修改后,Vite 能够实时更新修改的模块,而无需完全刷新整个页面或重新加载整个应用程序。

vitewebpack
Vite 利用了热模块替换(HMR)的技术,它能够在保持应用程序状态的同时,仅仅更新修改过的模块。当你修改了某个模块的代码后,Vite 会通过 WebSocket 或者 HMR 运行时,将新的模块代码发送到浏览器中。浏览器接收到更新后的模块代码后,会立即应用这些变化,而不需要刷新整个页面。在代码发生变化时,需要刷新整个页面或重新加载整个应用程序,以查看更新后的效果。这会导致开发者在每次修改代码后都需要手动刷新页面,增加了开发的时间和复杂性。

零配置的开发环境

Vite提供了零配置的开发环境,减少了配置的复杂性。开发者可以在项目中使用常见的前端开发工具和框架(如Vue.js、React等),而无需繁琐的配置文件。

  • Vite 的预解析(Pre-Bundling)
    "Vite 的预解析"是指在构建阶段对项目的源码进行静态分析和预处理,以提前解析模块的依赖关系和生成优化的代码块,从而提高构建性能和减少启动延迟。
    在传统的打包工具中,如 webpack,在构建阶段需要扫描整个项目的源码,解析模块的依赖关系,并进行相应的打包和编译操作。这个过程可能会耗费一定的时间,特别是在大型项目中或者项目依赖较多的情况下。
    Vite 利用了现代浏览器对 ES 模块的原生支持,可以通过静态分析和预处理源码,提前解析模块的依赖关系,从而减少构建时的工作量和时间。
    具体来说,Vite 的预解析包括以下步骤:

    • 1、静态分析:Vite 会对项目的源码进行静态分析,解析模块之间的依赖关系。它会查找 import 和 export 语句,分析模块的引用关系。

    • 2、模块解析:Vite 会根据模块的路径,解析模块的实际位置,并标记模块的类型(例如 JavaScript、CSS、JSON 等)。

    • 3、优化的代码块生成:根据模块的依赖关系,Vite 会生成优化的代码块(Code Splitting),将相关的模块打包到同一个代码块中。这样可以提高代码的加载效率,减少不必要的网络请求。

    • 4、缓存:Vite 会缓存解析过的模块和依赖关系,以便后续的构建过程可以直接使用缓存,避免重复解析和编译。

vite打包原理

Vite 在开发阶段通过浏览器原生的 ES 模块加载器直接加载源码文件,并实现了即时的热模块替换。在构建阶段,Vite 使用 Rollup 进行优化的构建,仅处理入口文件和模块的依赖关系,生成优化的代码块。这种基于原生 ES 模块加载器和优化的构建策略,使得 Vite 在开发过程中能够提供快速的冷启动和即时的热模块替换,同时在生产环境中生成高性能的代码。

  • 开发阶段(Development Phase):
    Vite 利用浏览器原生的 ES 模块加载器(ES Module Loader)来直接加载源码文件,而不需要进行打包。这意味着每个源码文件都被视为一个独立的模块。
    当浏览器请求某个模块时,Vite 根据模块路径直接返回对应的源码文件。
    在开发过程中,Vite 会监视文件变化,当某个模块的源码文件发生修改时,它会通过 WebSocket 或 HMR 运行时将更新的模块代码推送到浏览器端,实现即时的热模块替换(HMR)。
  • 构建阶段(Build Phase):
    当项目准备部署到生产环境时,Vite 会执行构建操作,将源码文件转换为生产环境可用的代码。
    Vite 使用 Rollup 进行构建,但与传统的 Rollup 打包方式不同,Vite 仅处理入口文件,并根据模块的依赖关系生成优化的代码块(Code Splitting)。
    Vite 通过预先解析和缓存模块的依赖关系,可以避免不必要的文件扫描和重新编译,提高了构建速度。
    Vite 会根据需要对代码进行转换和优化,例如压缩代码、处理静态资源等。
    最终,Vite 生成优化后的代码块和资源文件,用于生产环境的部署。

vite配置文件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import { esbuildCommonjs } from '@originjs/vite-plugin-commonjs' // 让浏览器支持commonjs语法
import inject from '@rollup/plugin-inject'
import viteCompression from 'vite-plugin-compression'
import path from "path"
// import url from '@rollup/plugin-url';
console.log(process.env.VITE_API_SECRET, 'VITE_API_SECRET')
export default defineConfig({
  build: {
    minify: 'esbuild', // 默认
  },
  esbuild: {
    drop: ['console', 'debugger'],//打包去除
  },
  plugins: [
    vue(),
    viteCompression({ threshold: 1024000 }),
    AutoImport({
      imports: ['vue', 'vue-router']//自动导入vue和vue-router相关函数
    }),
    esbuildCommonjs(),
  ],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
      'components': path.resolve(__dirname, 'src/components'),
    },
    extensions: ['.js', '.json', '.ts', '.vue'], // 使用路径别名时想要省略的后缀名,可以自己 增减
  },
  server: {
    port: 8070,
    host: true,
    open: true, 
    proxy: {
      '/file_service': {
        target: `http:/xxx`,
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/file_service/, ""),
      }, 
      '/webhooks': { 
        target: `http://xxxx`, 
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/webhooks/, "/webhooks"),
      }
    },
    hmr: true,  // 开启热更新 
  }
})

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

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

相关文章

强化学习笔记-13 Policy Gradient Methods

强化学习算法主要在于学习最优的决策,到目前为止,我们所讨论的决策选择都是通过价值预估函数来间接选择的。本节讨论的是通过一个参数化决策模型来直接根据状态选择动作,而不是根据价值预估函数来间接选择。 我们可以定义如下Policy Gradien…

软件测试外包干了3年,感觉废了..

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了3年的功能测试&…

官方都不告诉你的 Windows ISO 下载方式

目录 一、背景二、下载 一、背景 我们都知道,在日常生活中,经常会遇到各种操作系统的安装,如 Windows、Linux 等,一般都会通过 ISO 来安装。而在很多第三方地址中下载的 ISO 镜像通常会捆绑一些流氓软件,很是难受。那…

Java 中的异常处理

认识异常 程序中可能会有很多意想不到的问题的出现,这些问题中,有些是在编写阶段时就无法编译通过,比如写代码时变量名写错,出现语法错误 java.lang.Error: Unresolved compilation problem ……;有些是在程序运行的时…

从零开始Vue项目中使用MapboxGL开发三维地图教程(四)改变鼠标style、地图置于单击feature中心、量测距离和polgon面积和中心点坐标

文章目录 1、飞行平移到鼠标点击图层属性的地图中心位置2、当鼠标光标进入“圆”图层中的某个要素时,将其更改为指针3、量测距离4、量测area面积和中心点坐标 1、飞行平移到鼠标点击图层属性的地图中心位置 //鼠标点击事件map.on("click", "iconImag…

基于Amazon SageMaker平台部署Stable Diffusion模型实现——图片识别

序言: 当谈到机器学习和人工智能的开发和部署时,Amazon SageMaker是一个非常强大和全面的平台。作为一项托管式的机器学习服务,Amazon SageMaker提供了一套完整的工具和功能,帮助开发者轻松构建、训练和部署机器学习模型。 首先&…

程序猿成长之路之密码学篇-AES算法解密详解及代码呈现

各位csdn的小伙伴们大家好呀,我又回来了,这篇文章为上一次介绍AES加密算法的姊妹篇,重点将会详细介绍一下AES算法的解密过程并呈上AES加解密的代码。【暂时不包含iv即偏移量】。下面请跟随我一同进入AES解密的世界。 AES加密详解 如果有小伙…

ffmpeg编译笔记:ubuntu18.04编译ffmpeg5.1 x86与64

一、前言 本篇描述了ffmpeg5.1在ubuntu18.04上的编译经验。编译后的库支持h264,h265软硬解码,支持https,支持SDL。本篇同时描述openssl在ffmpeg中的编译经验,以及提供ffmpeg编译和openssl编译的32位和64位的配置命令。 二、相关…

这8道接口测试面试题

接口测试常见的问题了。 大家乍一看! 接口测试面试题 这几个问题,能答出来几个?有没有8个都能够完美的答出来的?在留言区打出你的数字。(0~8) 这些问题你回答起来,不要吞吞吐吐只说几个关键字…

1. java.io.File 类的使用

1.1 概述 • File 类及本章下的各种流,都定义在 java.io 包下。 • 一个 File 对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹), 与平台无关。(体会万事万物皆对象) • File 能新建、删除…

重启好多次路由器,还是上不了网怎么办?

大家好,我的网工朋友 遇到突发的网络断连,你一般会怎么做? 我觉得很多人都会插拔一下路由器,这和电脑不行了,马上就重启电脑一样,是刻在DNA里的傻瓜操作。 但是也有很多时候,这个傻瓜操作是解…

PrivateGPT:安全和私密的离线 GPT-4

在人工智能 (AI) 和自然语言处理 (NLP) 领域,隐私通常是一个基本问题,尤其是在处理敏感数据时。PrivateGPT 是这一领域的突破性发展,正面解决了这个问题。它旨在在没有互联网连接的情况下在本地运行,通过防止数据离开您的执行环境…

这些方法可以手写扫描识别

小伙伴们知道有一项技术是可以将我们手写的东西识别出来吗?这一项创新的技术就是手写识别功能,它能够将手写内容快速转换为数字或文本格式,并提高信息处理和管理的效率。而且相比传统的手工记录方式,手写识别功能具有较高的准确性…

腾讯测试开发 4 轮面试,接到 30k*15 的 Offer !详解面试流程和真题

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。我的一个朋…

find命令

你将看到的第一个命令是find。这是个用于搜索文件的命令,它极其有用,但Linux初学者常常觉得它不易使用,这不仅仅是因为它有选项、测试和动作类型的参数,还因为其中一个参数的处理结果可能会影响到后续参数的处理。在深入研究这些选…

pandas---缺失值的处理

1. 处理缺失值 判断数据中是否包含NaN: pd.isnull(df);pd.notnull(df) 存在缺失值nan: 删除存在缺失值的:dropna(axisrows) 不会修改原数据,需要接受返回值; 替换缺失值:fillna(value, inplaceTrue) value:替换成的值&#…

基于STM32的四旋翼无人机项目(一):基础知识篇

前言:本篇博客为飞控专栏的第一篇系统性概述文章,将对飞控系统进行详细讲解介绍。考虑到飞控项目具有一定工程复杂度,所以作者将整个项目进行分章节教学与讲解,希望可以给读者朋友带来更好地学习体验。项目将以 C-Quad 四轴无人机…

SpringBoot 中使用 JWT 案例分享详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

大模型LLM领域,有哪些可以作为学术研究方向?

清湛人工智能研究院 2023-05-31 09:23 发表于江苏 编者:本文转载了清华大学计算机系刘知远教授对大模型的一些思索,以飨读者。 刘知远 CCF 高级会员,CCCF 前编委。清华大学计算机系副教授、博士生导师。已在ACL、IJCAI、AAAI等人工智能领域…

回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于GRU-AdaBoost门…