vite构建工具

article/2025/6/23 1:38:31

文章目录

  • 1. 什么是构建工具
  • 2. webpack的缺点在哪?
  • 3. 区分vite脚手架和vite
  • 5. vite预加载
    • 5.1 包的加载
    • 5.2. vite依赖预构建
  • 7. vite配置文件处理
  • 8. vite环境变量和模式
    • 8.1 环境变量
    • 8.2 模式

1. 什么是构建工具

在开发项目中,我们可能会使用到vuereact等框架,lesssass等预处理工具,以及其他的一些提升开发效率的工具。
但浏览器只认htmlcssjavascript三件套,其他的工具语言都必须通过编译 / 转译或者打包处理成浏览器理解的格式。

下面是一些工具语言需要的处理:

  1. less / sass / … —> less-loader / sass-loader编译工具;
  2. typescript —> 使用tsc转换成javascript;
  3. vue / react —> vue-compiler / react-copiler 将.vue文件或者.jsx文件转换成render函数;
  4. 语法降级 —> babel:将es新语法转换成旧版浏览器可以理解的语法
  5. 体积优化 —> uglifyjs:将代码压缩成体积更小性能更高的问价;

使用一种工具就需要做相应的处理,这很麻烦。而构建工具会将这些工作全部揽下,极大地提高了开发效率。

那构建工具具体承担了哪些工作呢?

  1. 模块化开发支持:支持从node_modules中直接引入代码 + 多种模块化支持;
  2. 处理代码的兼容性:例如babel语法降级,less、ts语法转换(❗️注意:这里的语法转换不是构建工具做的,构建工具只是将处理这些语法的工具集成起来了);
  3. 提高项目性能:压缩文件,提高性能;
  4. 优化开发体验
    • 构建工自动监听文件变化,文件变化,那么构建工具也会调用相应的集成工具处理,然后重新打包运行(和这个过程也叫做热更新—>无需刷新整个页面就可以更新)
    • 开发服务器:跨域的问题,用react-cli create-react-element vue-cli
      解决跨域的问题

市面上主流构建工具:

  • webpack
  • vite

2. webpack的缺点在哪?

webpack允许我们这么写:

const lodash = require("lodash") // commonJS
import Vue from 'vue'  // es moudule

webpack的编译原理:

  • 通过AST抽象语法树分析的工具,分析出所写js文件的的导入和导出操作
  • 构建工具运行在服务端

因为webpack支持多种模块化,所以在打包时必须要先统一模块化代码,所以意味着需要读取所有的导入导出,而在项目越来越大时,webpack的弊端也就越明显。

开发阶段:

比较方面vitewebpack
启动速度⚡️快🐢慢
模块热更新(HMR)快且颗粒度小,更新只影响更新模块慢,编译时间长
原因利用原生es module,模块按需加载支持多模块化使用,编译时需要获取所有导入导出,统一模块化

注:vite不需要打包,直接用浏览器加载原始模块文件(借助ES Module 和exbuild的预编译)

构建阶段:

比较方面vitewebpack
构建速度⚡️快(esbuild 编译快)🐢慢(依赖于JS编写的打包器)
打包结果体积通常更小,Tree-shaking 更彻底体积更大
支持静态资源优化默认支持需要配置插件

vite构建使用 rollup ,且使用esbuild做预编译

vite 更快、更现代、更贴近浏览器原生特性,适合大多数现代 Web 项目;webpack 功能更强大但配置繁琐,适合对构建过程精细控制的大型项目。

3. 区分vite脚手架和vite

创建项目时,输入npm craete vue@latest

  • 会全局安装一个东西:create-vite(vite的脚手架);
  • 并且直接运行create-vite bin目录下的一个执行配置

我们可能存在一个误区:
使用npm craete vue@latest构建项目是vite在做的事情!

但是其实跟 vue-cli 类似,webpack是内置在其中的;vite 内置在vite-craete

5. vite预加载

5.1 包的加载

在没有使用vite的情况下,我们使用es module规范去引入一个工具包,那么在运行时就会报错,因为原生js不接受非绝对路径文件或者非相对路径文件的引入
(因为这些包都是由浏览器发送请求获取得到,都是在客户端进行的,使用es module 引入依赖可能会涉及到很多文件的引入,会非常消耗浏览器性能,所以浏览器不会自动在node_modules中寻找依赖。也是原生es module不敢支持node_modules的原因之一)

在这里插入图片描述

而在使用了vite之后,对于非绝对路径文件或者非相对路径文件的引入,vite会尝试开启路径补全。

在这里插入图片描述

在使用了vite的项目中,public文件夹以外使用commonJS语法规范,这些依赖的引入会在服务端进行,这样就大大优化了浏览器性能。

寻找依赖的过程是从当前文件向上层文件寻找的过程,直到寻找到根目录或者找到目标依赖位置。

5.2. vite依赖预构建

项目开发中,我们会下载很多的工具包,这些工具包可能会使用不同的模块化规范,比如

  • commonJS
    • lodash
    • express
  • es module
    • axios(ESM版本)
    • uuid
    • vue@3

在运行或打包项目时总是要先统一规范,这是就需要使用到依赖预构建

首先vite会先找到依赖,接着通过esbuild处理,将不同规范的工具包通通转换成es module规范,放在node_modules/.vite/deps路径下。

以上方面说明了vite预构建的几个优点:

  1. 统一工具包的规范,方便项目构建和运行;
  2. 对路径的处理可以直接使用.vite/deps,方便路径重写;
  3. 解决了网络多包传递的问题(也是上面我们所说的消耗浏览器性能的一个地方)

当然,不想进行依赖预构建的话,vite也给我们提供了关闭预构建的方式:

vite.config.js:

export default {optimizeDeps: {exclude: ["lodash-es"], // 告诉vite排除对lodash-es的依赖}
}

7. vite配置文件处理

import { defineConfig } from "vite"
import BaseViteConfig from "./vite.base.config"
import DevViteConfig from "./vite.dev.config"
import ProdViteConfig from "./vite.prod.config"const EnvViteConfig = {// 生产环境"build": ({ ...BaseViteConfig, ...ProdViteConfig }),// 开发环境"serve": () => Object.assign({}, BaseViteConfig, DevViteConfig),
}export default defineConfig((command) => {// command: build | serve  只有这两种命令return EnvViteConfig[command]
})

8. vite环境变量和模式

8.1 环境变量

环境变量:会根据当前代码环境产生值的变化的变量就叫做环境变量。

代码环境

  1. 开发环境
  2. 测试环境
  3. 预发布环境
  4. 灰度环境
  5. 生产环境

vite在一个特殊对象import.meta.env上暴露环境变量。下面是这个对象的几个内置变量:

  • import.meta.env.MODE:{string} 应用运行时的模式;
  • import.meta.env.BASE_URL:{string} 部署应用时的基本URL(BASE_URL也可以替换成其他的名称,主要看自己怎么定义变量名称);
  • import.meta.env.PROD:{boolean} 应用是否运行在生产环境;
  • import.meta.env.DEV:{boolean} 应用是否运行在开发环境;
  • import.meta.env.SSR:{boolean} 应用是否运行在server上;

vite中的环境变量是怎样进行处理的呢?

vite中集成了第三方库dotenv,它会自动读取.env中的环境变量,并将其注入到process对象下。

这些变量在生产环境时都将被静态替换,因此,在引用它们时请使用完全静态的字符串。动态的 key 将无法生效。例如,动态 key 取值 import.meta.env[key] 是无效的。

补充知识:为什么vite.config.js中可以书写esmodule规范?

因为vite在读取vite.config.js文件时,率先使用node去解析文件语法,如果发现时esmodule语法就会直接将esmodule语法替换成commonJS规范。

8.2 模式

vite使用dotenv从你的环境目录中的下列文件加载额外的环境变量:

  • .env # 所有情况下都会加载
  • .env.local # 所有情况下都会加载,但会被 git 忽略
  • .env.[mode] # 只在指定模式下加载
  • .env.[mode].local # 只在指定模式下加载,但会被 git 忽略

这些文件在启动项目时加载,中间修改需要重启服务。

执行npm run dev运行在development(开发)模式,npm run build运行在production(生产)模式,相应的,也会执行对应模式下的.env文件。


http://www.hkcw.cn/article/TynSPQWTSP.shtml

相关文章

警方通报“男子拖拽6岁女童进小巷” 嫌疑人已被拘留将追责

6月3日,湖南娄底市公安局娄星分局通报了一起事件。5月20日下午,嫌疑人刘某某酒后行至娄底市娄星区涟滨中街附近,拖拽一名六岁女童进入居民区巷子。幸好被居民及时制止并报警。接警后,民警迅速赶到现场将刘某某控制。经侦查,刘某某涉嫌寻衅滋事已被拘留,将依法追究其刑事责…

下一个假期连休8天要等4个月 国庆中秋合并放

今天是端午节假期的最后一天。很多人关心下一次休假是什么时候。根据国务院办公厅关于2025年部分节假日安排的通知,下一轮节假日将在4个月后的国庆节和中秋节。这两个节日合并放假8天。责任编辑:zx0001

成品油价将迎年内第11次调价 或迎来小幅上涨

成品油价将迎年内第11次调价 或迎来小幅上涨!油价最新消息:2025年6月1日星期日,距离油价调整窗口开启只剩下两天。预计油价将小幅上涨,虽然涨幅不大,但对车主来说能省一点是一点,请相互转告。在本轮计价周期中,开局时油价每吨上涨140元,但由于国际油价下跌的影响,到第…

C. Basketball Exercise

time limit per test 2 seconds memory limit per test 256 megabytes Finally, a basketball court has been opened in SIS, so Demid has decided to hold a basketball exercise session. 2⋅n2⋅n students have come to Demids exercise session, and he lined up th…

【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的旅游论坛系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …

基于Android的医院陪诊预约系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

随机性的起源

文章目录 随机性的起源模型权重初始化主要影响常见做法代码示例 数据采集与重排(加载与打乱)例子注意事项代码示例 非确定性算法Dropout带来的随机性代码示例不同运行时的算法卷积操作的实现差异例子解决方法小结 硬件与驱动程序随机性与生成式AI生成式A…

12.1 GUI 事件处理

Swing简介 不同于 AWT 使用重量级组件(每个组件对应有一个本地窗口系统资源),Swing 提供了轻量级组件,它们不是直接映射到本地窗口系统组件上,而是绘制出来的。因此,Swing 组件可以在不同的平台上保持一致的…

冲入起火麦地抢收司机称举手之劳 网友赞救火英雄

冲入起火麦地抢收司机称举手之劳 网友赞救火英雄!6月1日,一段视频在网上引起广泛关注。视频中,远处麦田浓烟滚滚,火焰借风力蔓延。这时,一台收割机朝着浓烟方向驶去,在麦田中快速开辟出一条隔火带。视频中,收割机司机的妻子大声呼喊:“别离火那么近!往外走点!”她还对…

稳定币概念集体大涨 政策利好密集释放

受全球多地稳定币监管政策进展提振,相关概念股近日表现活跃。截至发稿,连连数字(02598.HK)、OSL集团(00863.HK)分别上涨57.88%、3.10%。香港特别行政区政府5月30日在宪报刊登《稳定币条例》,标志着该条例正式生效,进一步完善了香港的数字资产监管框架。此前5月21日,香港立…

从0开始学vue:pnpm怎么安装

一、什么是 pnpm? pnpm(Performant npm)是新一代 JavaScript 包管理器,优势包括: 节省磁盘空间:通过硬链接和符号链接实现高效存储安装速度更快:比 npm/yarn 快 2-3 倍内置工作区支持&#xf…

【笔记】在 MSYS2 MINGW64 环境中安装常用开发依赖包

📝 在 MSYS2 MINGW64 环境中安装常用开发依赖包 ✅ 目标说明 在 MSYS2 的 MINGW64 工具链环境中,安装 Python 开发所需的基础依赖库和工具。 这些包括: 编译工具(GCC)Python 包管理器(pip、setuptools、wh…

基于springboot的家政服务预约系统

博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言&#xff0…

“对等关税”要黄了吗 特朗普政府上诉反击

近期,美国政坛围绕关税的斗争不断升级。5月28日,美国国际贸易法院裁定特朗普利用《国际紧急经济权力法》越权加征关税无效。这意味着特朗普今年2月对中国、墨西哥和加拿大征收的关税将被视为违法。对此,特朗普团队随即提出上诉。5月29日,美国联邦巡回上诉法院批准特朗普政府…

警方通报男子将女童拖进小巷 嫌疑人已被拘留

6月3日,湖南娄底市公安局娄星分局通报了一起事件。5月20日下午,嫌疑人刘某某(男,38岁)酒后在娄底市娄星区涟滨中街附近拖拽一名6岁女童进入居民区巷子。幸亏居民及时制止并报警。警方迅速赶到现场将刘某某控制。经侦查,刘某某涉嫌寻衅滋事已被拘留,并将依法追究其刑事责…

郑钦文晋级法网8强,发文晒满背泥泞照祝大小朋友勇敢追梦

法网女单第四轮,郑钦文总比分2-1战胜萨姆索诺娃。赛后郑钦文发文送出儿童节祝福:人都应该有梦,有梦就别怕痛,是一颗宝石就该闪烁祝所有的大朋友小朋友们节日快乐,勇敢追梦。其中有一张照片郑钦文满背泥泞,心疼又佩服!责任编辑:zx0002

国足将于5日迎18强赛“生死战” 背水一战求生机

中国青年报报道,北京时间今天中午,国足一行从上海驻地出发前往印尼雅加达,备战2026美加墨世界杯亚洲区18强赛小组赛第9轮客场赛事。除因伤无法随队出征的前锋刘若钒外,25名球员将乘坐傍晚航班前往印尼。这场关键比赛将于6月5日21时45分在雅加达格罗拉蓬卡诺体育场举行,如果…

特朗普回应科罗拉多州“恐袭”事件 谴责并要求严惩

美国总统特朗普在社交媒体上发文表示,美国绝不会容忍6月1日在科罗拉多州博尔德发生的可怕袭击。他指责嫌疑人是通过拜登政府“荒谬的开放边境政策”进入美国,这项政策严重损害了国家利益。特朗普强调,该嫌疑人必须被驱逐出境,并且恐怖主义行为将受到法律的全面追究。他认为…

《酱园弄》第一部定档 全明星阵容引期待

《酱园弄》第一部定档 全明星阵容引期待。你是否还记得1945年的民国旧事,那些尘封在岁月里的悬案奇闻,如今被搬上了大银幕。《酱园弄》第一部《酱园弄・悬案》定档6月21日,带着满满的期待与未知,缓缓向我们走来,它能否成为下一个票房爆款,引发众人热议。章子怡、雷佳音、…

【机器学习基础】机器学习入门核心算法:多分类与多标签分类算法

多分类与多标签分类算法 一、单标签分类问题1. 单标签二分类2. 单标签多分类 二、多标签分类问题 (Multi-Label Learning - MLL)1. 定义与特点2. 解决策略 三、实现与应用总结 在机器学习领域,分类任务是核心问题之一。根据预测目标的性质,主要分为单标签…