<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Build Tools on 日日是好日</title><link>https://jjjjjjy.github.io/posts/buildtools/</link><description>Recent content in Build Tools on 日日是好日</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 20 Jan 2026 17:46:16 +0800</lastBuildDate><atom:link href="https://jjjjjjy.github.io/posts/buildtools/index.xml" rel="self" type="application/rss+xml"/><item><title>Vite总结</title><link>https://jjjjjjy.github.io/posts/buildtools/vitesummary/</link><pubDate>Tue, 20 Jan 2026 17:46:16 +0800</pubDate><guid>https://jjjjjjy.github.io/posts/buildtools/vitesummary/</guid><description>&lt;h6 id="vite-本质"&gt;vite 本质
&lt;/h6&gt;&lt;p&gt;开发阶段利用浏览器原生 ESM 做按需编译，生产阶段基于Rollup做高质量打包。&lt;/p&gt;
&lt;h6 id="vite配置文件为什么是viteconfigts"&gt;vite配置文件为什么是vite.config.ts
&lt;/h6&gt;&lt;ol&gt;
&lt;li&gt;配置本身就是 ESM&lt;/li&gt;
&lt;li&gt;可以使用 TS&lt;/li&gt;
&lt;li&gt;区分生产环境和开发环境，可以写逻辑（if / env）&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id="vite请求快的原因"&gt;vite请求快的原因
&lt;/h6&gt;</description></item><item><title>Vite</title><link>https://jjjjjjy.github.io/posts/buildtools/vite/</link><pubDate>Wed, 07 Jan 2026 11:33:39 +0800</pubDate><guid>https://jjjjjjy.github.io/posts/buildtools/vite/</guid><description>&lt;h1 id="vite-介绍"&gt;Vite 介绍
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;Vite 发音 /viːt/&lt;/li&gt;
&lt;li&gt;vite官网: &lt;a class="link" href="https://cn.vitejs.dev/" target="_blank" rel="noopener"
&gt;https://cn.vitejs.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;vite源码: &lt;a class="link" href="https://github.com/vitejs/vite" target="_blank" rel="noopener"
&gt;https://github.com/vitejs/vite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vite是一个由原生ESM驱动的Web开发构建工具。&lt;/p&gt;
&lt;p&gt;在开发环境下基于浏览器原生ESimports开发，在生产环境下基于Rollup打包。&lt;/p&gt;
&lt;p&gt;vite是vue作者开发的一款意图取代webpack的工具，其实现原理是&lt;strong&gt;利用ES6的import会发送请求去加载文件的特性，拦截这些请求，做一些预编译&lt;/strong&gt;，省去webpack冗长的打包时间。&lt;/p&gt;
&lt;h1 id="vite-组成"&gt;Vite 组成
&lt;/h1&gt;&lt;p&gt;vite主要由两部分组成：一个开发服务器 + 一套构建指令。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个开发服务器，它基于 原生 ES 模块 提供了 丰富的内建功能，如速度快到惊人的 模块热更新（HMR）。&lt;/li&gt;
&lt;li&gt;一套构建指令，它使用 Rollup 打包代码，并且是预配置的，可输出用于生产环境的高度优化过的静态资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;理解：Vite 的开发服务器 只在开发环境使用。Vite 的构建（build / Rollup）只在生产环境构建时使用。两者职责清晰、阶段完全不同。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vite 的精髓就是：
&lt;strong&gt;开发阶段基于ESM，不打包，速度更快，生产阶段基于Rollup打包，打包到极致&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="开发服务器"&gt;开发服务器
&lt;/h2&gt;&lt;p&gt;在开发期间，vite就是一个服务器。开发服务器只在开发阶段使用，本质上是“让浏览器直接跑你的源码”。&lt;/p&gt;
&lt;p&gt;✔ 提供本地服务
✔ 利用 浏览器原生 ES Modules
✔ 实时转换源码（TS / JSX / Vue）
✔ HMR（模块热替换）
✔ 不做整体打包&lt;/p&gt;
&lt;p&gt;你写的源码
↓
Vite Dev Server（即时转换）
↓
浏览器按需请求模块（ESM）
💡 特点：&lt;/p&gt;
&lt;p&gt;没有 bundle&lt;/p&gt;
&lt;p&gt;改一个文件，只重新加载这一个模块&lt;/p&gt;
&lt;p&gt;启动速度 ≈ 0（项目再大也快）&lt;/p&gt;
&lt;h2 id="构建指令"&gt;构建指令
&lt;/h2&gt;&lt;p&gt;本质：把源码变成适合线上部署的静态文件&lt;/p&gt;
&lt;p&gt;✔ 使用 Rollup
✔ 真正“打包”
✔ 代码分割、Tree-shaking
✔ 文件 hash
✔ 输出静态资源（dist）&lt;/p&gt;
&lt;h1 id="--diff-vite-vs-webpack"&gt;🚧 Diff: Vite vs Webpack
&lt;/h1&gt;&lt;h2 id="开发环境"&gt;开发环境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Webpack 是在“浏览器不会模块化”的时代诞生的正确方案，【浏览器不支持ESModule和import和export】因此他的世界观是先打包再运行，因此开发服务器启动速度慢。&lt;/li&gt;
&lt;li&gt;Vite 是在“浏览器已经会模块化”之后，对构建工具的重构，因此他的世界观是先运行再打包，因此开发服务器启动速度极快。
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;开发环境对比点&lt;/th&gt;
&lt;th&gt;Webpack&lt;/th&gt;
&lt;th&gt;Vite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;是否打包&lt;/td&gt;
&lt;td&gt;✅ 是（内存 bundle）&lt;/td&gt;
&lt;td&gt;❌ 否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模块加载&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;浏览器原生 ESM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;启动时&lt;/td&gt;
&lt;td&gt;全量构建依赖图&lt;/td&gt;
&lt;td&gt;不扫描全量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;改一个文件&lt;/td&gt;
&lt;td&gt;重新构建 chunk&lt;/td&gt;
&lt;td&gt;精确替换模块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMR&lt;/td&gt;
&lt;td&gt;基于 bundle&lt;/td&gt;
&lt;td&gt;基于模块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;项目越大&lt;/td&gt;
&lt;td&gt;越慢&lt;/td&gt;
&lt;td&gt;基本不变&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;｜ 在开发环境，Vite 和 Webpack 的主要区别在于是否对代码进行打包。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;webpack在启动开发服务器时，会将整个项目模块构建一个依赖图，打包为一个bundle.js文件，然后再运行这个文件。&lt;/p&gt;
&lt;p&gt;只是这个打包是 内存中的打包（in-memory bundle），不是写到磁盘而已。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vite则是利用浏览器的ES Module Imports特性，不进行预打包，只有在真正需要时才编译文件，按需加载模块。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;在启动开发服务器时，Webpack 将整个项目所有模块构建一个依赖图，打包为一个bundle.js文件，然后再运行这个文件。对于大型项目，这个过程可能非常耗时，导致开发者需要等待较长时间才能开始调试代码。&lt;/li&gt;
&lt;li&gt;Vite：Vite 利用浏览器的ES Module Imports特性，不进行预打包，只有在真正需要时才编译文件，按需加载模块。
&lt;ul&gt;
&lt;li&gt;Vite直接启动了一个开发服务器devServer，然后劫持浏览器的HTTP请求，在后端进行相应的处理将项目中使用的文件通过简单的分解与整合，然后再返回给浏览器(整个过程没有对文件进行打包编译)。所以Vite 的开发服务器启动速度非常快，通常可以在几百毫秒内启动。&lt;/li&gt;
&lt;li&gt;（在生产模式下，vite使用Rollup进行打包，提供更好的tree-shaking，代码压缩和性能优化。）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;【对比: Webpack 在开发阶段「本质上也要打包」, 只是这个打包是 内存中的打包（in-memory bundle），不是写到磁盘而已。】&lt;/p&gt;
&lt;h2 id="为什么-vite-启动这么快"&gt;为什么 Vite 启动这么快？
&lt;/h2&gt;&lt;p&gt;因为vite是浏览器直接加载 ESM，不做 bundle，而是按需加载模块，只在请求到某个模块时才编译（on-demand）&lt;/p&gt;
&lt;h2 id="vite-的工作原理"&gt;vite 的工作原理
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;启动 dev server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;浏览器请求 index.html&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;浏览器通过 &lt;!-- raw HTML omitted --&gt; 加载模块&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遇到裸模块（vue / react）→ Vite 转成浏览器可识别路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按需编译、缓存结果&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="vite-中如何区分环境"&gt;Vite 中如何区分环境？
&lt;/h2&gt;&lt;p&gt;import.meta.env.MODE
import.meta.env.DEV
import.meta.env.PROD&lt;/p&gt;
&lt;p&gt;只有 VITE_ 开头的环境变量才会注入到客户端&lt;/p&gt;
&lt;h2 id="vite-如何处理-css"&gt;Vite 如何处理 CSS？
&lt;/h2&gt;&lt;p&gt;原生支持：
CSS / Less / Sass&lt;/p&gt;
&lt;p&gt;CSS Module：*.module.css&lt;/p&gt;
&lt;p&gt;自动拆分 CSS&lt;/p&gt;
&lt;p&gt;开发阶段 style 注入&lt;/p&gt;
&lt;p&gt;生产阶段提取成文件&lt;/p&gt;</description></item></channel></rss>