<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vite on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/vite/</link><description>Recent content in Vite on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/vite/index.xml" rel="self" type="application/rss+xml"/><item><title>Vite的定义与核心目标</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-01/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-01/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考核候选人：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>现代构建工具演进认知&lt;/strong>：是否理解前端工程化发展脉络及工具迭代动因&lt;/li>
&lt;li>&lt;strong>模块化加载机制理解&lt;/strong>：对比传统打包与原生ESM的差异&lt;/li>
&lt;li>&lt;strong>性能优化策略&lt;/strong>：分析构建工具在开发/生产环境的不同优化思路&lt;/li>
&lt;/ol>
&lt;p>具体评估点：&lt;/p>
&lt;ul>
&lt;li>浏览器原生ES Modules的工程化应用&lt;/li>
&lt;li>冷启动性能瓶颈的成因与解决方案&lt;/li>
&lt;li>模块热替换(HMR)的底层实现差异&lt;/li>
&lt;li>依赖预构建的技术选型考量&lt;/li>
&lt;li>开发与生产环境构建策略的分离设计&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>原生ES Modules &amp;gt; 依赖预构建 &amp;gt; 按需编译&lt;/li>
&lt;li>浏览器模块解析 &amp;gt; 服务端编译中间件 &amp;gt; HMR协议&lt;/li>
&lt;li>开发/生产环境策略分离 &amp;gt; 开发即时编译 &amp;gt; 生产Rollup打包&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过三个核心机制突破传统构建工具性能瓶颈：&lt;/p>
&lt;p>&lt;strong>1. 原生ESM加载（开发环境）&lt;/strong>&lt;/p>
&lt;pre class="mermaid">graph LR
 Browser --&amp;gt;|请求模块| ViteServer
 ViteServer --&amp;gt;|按需编译| 源码文件
 ViteServer --&amp;gt;|返回ESM| Browser
&lt;/pre>
&lt;ul>
&lt;li>浏览器直接请求源码模块，服务端实时编译后返回标准ESM&lt;/li>
&lt;li>对比Webpack必须预先打包整个应用才能启动dev server&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. 依赖预构建&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>使用esbuild将CommonJS模块转换为ESM格式&lt;/li>
&lt;li>合并细碎文件为单个模块（如lodash的数百个文件）&lt;/li>
&lt;li>建立模块缓存，避免重复编译&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3. HMR优化&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>基于ESM的精确边界更新：仅更新变更模块及其依赖树&lt;/li>
&lt;li>对比Webpack需要重建整个模块关系图&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为Vite完全不打包（生产环境仍需Rollup打包）&lt;/li>
&lt;li>混淆开发环境即时编译与生产构建的区别&lt;/li>
&lt;li>忽视HTTP/2多路复用对模块加载的加速作用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite是面向现代浏览器的下一代前端构建工具，其核心目标是通过原生ES Modules和按需编译，解决传统构建工具在开发环境中的性能瓶颈。相较于Webpack等工具：&lt;/p></description></item><item><title>Vite工作原理与快速开发实现</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-02/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-02/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察对现代前端构建工具核心机制的理解能力，重点评估以下维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ES Modules 原生特性应用&lt;/strong>：浏览器如何利用ESM实现模块按需加载&lt;/li>
&lt;li>&lt;strong>构建工具架构设计&lt;/strong>：对比传统打包工具（如Webpack）的全量编译与Vite的按需编译差异&lt;/li>
&lt;li>&lt;strong>开发环境优化策略&lt;/strong>：依赖预构建、请求拦截、编译缓存等实现细节&lt;/li>
&lt;li>&lt;strong>模块化生态适配&lt;/strong>：处理CommonJS转换、裸模块解析等工程化问题&lt;/li>
&lt;/ol>
&lt;p>技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>浏览器端模块请求的动态处理机制&lt;/li>
&lt;li>依赖预构建的作用与实现&lt;/li>
&lt;li>服务端实时编译的性能优化手段&lt;/li>
&lt;li>模块热更新（HMR）与ESM的结合&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>ES Modules &amp;gt; 依赖预构建 &amp;gt; 中间件拦截 &amp;gt; 按需编译 &amp;gt; 缓存策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>浏览器驱动加载&lt;/strong>：通过&lt;code>&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code>发起模块请求，浏览器自动解析依赖树&lt;/li>
&lt;li>&lt;strong>请求拦截&lt;/strong>：Vite dev server使用中间件拦截&lt;code>.vue&lt;/code>、&lt;code>.ts&lt;/code>等特殊模块请求&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="562dff9" class="language-javascript ">
 &lt;code>// 伪代码示例
server.middlewares.use((req, res, next) =&amp;gt; {
 if (isJSRequest(req)) {
 // 编译SFC/TS文件并返回ESM格式
 transformModule(req.url).then(compiled =&amp;gt; res.end(compiled))
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>
&lt;p>&lt;strong>依赖预构建&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>将node_modules中的CommonJS模块转换为ESM&lt;/li>
&lt;li>合并细碎文件为单个模块（如lodash的数百个文件）&lt;/li>
&lt;li>通过http头&lt;code>Cache-Control: max-age=31536000,immutable&lt;/code>实现强缓存&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>按需编译&lt;/strong>：仅处理当前路由所需模块，编译延迟从传统打包工具的O(n)降至O(1)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为Vite完全不打包（实际有预构建阶段）&lt;/li>
&lt;li>混淆开发环境与生产环境的构建策略&lt;/li>
&lt;li>忽视浏览器缓存对性能的关键影响&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite基于浏览器原生ES Modules实现按需加载的核心流程：&lt;/p></description></item><item><title>Vite模块预构建机制</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-03/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-03/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题主要考察候选人对现代前端构建工具原理的掌握程度，重点评估：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>模块化规范理解&lt;/strong>（ESM与CJS差异及浏览器兼容性）&lt;/li>
&lt;li>&lt;strong>构建工具优化策略&lt;/strong>（依赖预打包与请求合并机制）&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>（开发体验与构建性能的平衡）&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>ESM规范在浏览器环境的应用限制&lt;/li>
&lt;li>多文件依赖导致的HTTP请求瀑布问题&lt;/li>
&lt;li>依赖图谱扁平化处理能力&lt;/li>
&lt;li>构建工具链选型（esbuild性能优势）&lt;/li>
&lt;li>缓存策略对开发效率的影响&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>ESM浏览器支持 &amp;gt; CommonJS转换 &amp;gt; 依赖合并 &amp;gt; 强缓存策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>ESM转换意义&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>浏览器无法直接执行CommonJS模块，需转换为&lt;code>import/export&lt;/code>语法&lt;/li>
&lt;li>统一模块规范，避免混合使用导致运行时错误（如&lt;code>__esModule&lt;/code>标记处理）&lt;/li>
&lt;li>解决部分库的导出问题（如动态&lt;code>require&lt;/code>转换为静态分析）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>请求数量优化&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>将分散的依赖文件合并为单个ESM模块（如lodash的600+模块合并为1个）&lt;/li>
&lt;li>通过&lt;code>import&lt;/code>重写建立虚拟依赖映射表（&lt;code>node_modules/.vite/deps&lt;/code>）&lt;/li>
&lt;li>配合HTTP/2多路复用时仍保持单文件优势（避免队头阻塞）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>执行流程&lt;/strong>：&lt;/p>
&lt;pre class="mermaid">graph TD
A[扫描入口文件] --&amp;gt; B[收集裸模块导入]
B --&amp;gt; C{是否预构建?}
C --&amp;gt;|否| D[esbuild转换CJS]
C --&amp;gt;|是| E[读取缓存]
E --&amp;gt; F[生成扁平化ESM包]
F --&amp;gt; G[写入磁盘并创建映射]
&lt;/pre>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为预构建仅为兼容旧版浏览器（实际主要解决ESM规范统一）&lt;/li>
&lt;li>忽视嵌套依赖处理（如A依赖B@1.0，C依赖B@2.0的分开打包）&lt;/li>
&lt;li>混淆开发环境预构建与生产构建差异（生产环境仍用Rollup）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过预构建实现两大优化：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>ESM格式转换&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>将CommonJS/UMD模块转换为标准ESM，解决浏览器兼容问题&lt;/li>
&lt;li>规范化导出内容（如处理&lt;code>module.exports&lt;/code>的默认导出）&lt;/li>
&lt;li>消除多版本依赖冲突（通过semver版本锁定）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>请求数量优化&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>合并细粒度模块为单个文件（如将&lt;code>lodash-es&lt;/code>的数百文件合并）&lt;/li>
&lt;li>建立静态依赖映射表，将裸模块导入重写为预构建路径&lt;/li>
&lt;li>配合Cache-Control强制缓存，避免重复构建&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="配置示例viteconfigjs">配置示例（vite.config.js） &lt;a href="#%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8bviteconfigjs" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="b43f493" class="language-javascript ">
 &lt;code>export default {
 optimizeDeps: {
 // 强制排除不需要预构建的依赖
 exclude: [&amp;#39;vue-demi&amp;#39;],
 // 包含非package.json声明的依赖
 include: [&amp;#39;esm-only-dep &amp;gt; polyfill&amp;#39;],
 // 自定义esbuild配置
 esbuildOptions: {
 plugins: [/* 处理特殊格式插件 */]
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化策略">优化策略 &lt;a href="#%e4%bc%98%e5%8c%96%e7%ad%96%e7%95%a5" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>缓存机制&lt;/strong>：&lt;/p></description></item><item><title>Vite热模块替换机制对比</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-04/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-04/</guid><description>&lt;h2 id="二考察点分析">二、考察点分析 &lt;a href="#%e4%ba%8c%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人对现代构建工具核心机制的理解深度及技术选型判断能力：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ES Modules底层原理认知&lt;/strong>（浏览器原生支持与打包器模拟的区别）&lt;/li>
&lt;li>&lt;strong>HMR实现机制对比&lt;/strong>（模块依赖链管理、更新策略差异）&lt;/li>
&lt;li>&lt;strong>开发体验优化思维&lt;/strong>（冷启动速度、增量更新效率等工程化考量）&lt;/li>
&lt;li>&lt;strong>模块化发展脉络把握&lt;/strong>（从打包时代到原生ESM的范式转变）&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>原生ESM对HMR的架构级影响&lt;/li>
&lt;li>模块边界定义与更新传播机制&lt;/li>
&lt;li>浏览器缓存策略的深度利用&lt;/li>
&lt;li>源码转换与预构建策略差异&lt;/li>
&lt;/ul>
&lt;h2 id="三技术解析">三、技术解析 &lt;a href="#%e4%b8%89%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>原生ESM支持 &amp;gt; 模块更新粒度 &amp;gt; 无编译环节 &amp;gt; 依赖预构建&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>Webpack HMR流程&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>启动时全量打包生成Bundle&lt;/li>
&lt;li>文件变更触发增量编译&lt;/li>
&lt;li>通过websocket推送补丁&lt;/li>
&lt;li>客户端执行hotApply进行模块替换&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Vite HMR流程&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>浏览器直接加载ESM模块&lt;/li>
&lt;li>文件变更仅重新请求单个模块&lt;/li>
&lt;li>模块更新通过import链自动传播&lt;/li>
&lt;li>浏览器缓存自动失效机制&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="0d3ee4d" class="language-text ">
 &lt;code>Webpack：文件改动 -&amp;gt; 增量编译 -&amp;gt; 发送补丁 -&amp;gt; 客户端合并
Vite：文件改动 -&amp;gt; 模块失效 -&amp;gt; 浏览器重新请求 -&amp;gt; 自动更新&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为Vite完全不编译（仍需预构建node_modules）&lt;/li>
&lt;li>混淆更新粒度（文件级vs模块级）&lt;/li>
&lt;li>忽略浏览器缓存对HMR的影响&lt;/li>
&lt;/ol>
&lt;h2 id="四问题解答">四、问题解答 &lt;a href="#%e5%9b%9b%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite的HMR核心区别在于：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>原生ESM支持&lt;/strong>：直接利用浏览器模块系统，避免打包导致的更新冗余。每个模块独立缓存，修改后仅需重新获取单个文件，而Webpack需处理完整依赖链&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>精准更新粒度&lt;/strong>：基于ESM的精确绑定，可定位到具体模块的更新边界。相较Webpack的模块热替换，Vite的&lt;code>import.meta.hot&lt;/code>API支持更细粒度的热更新控制&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>按需编译机制&lt;/strong>：开发服务器拦截请求时进行实时转换，保留源码结构。相比Webpack的预打包模式，节省了全量编译的开销，实现秒级热更新&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>典型场景对比：修改组件props时，Vite仅更新关联组件树，而Webpack可能需要重新执行整个模块的factory函数&lt;/p>
&lt;h2 id="五解决方案">五、解决方案 &lt;a href="#%e4%ba%94%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="架构实现对比">架构实现对比 &lt;a href="#%e6%9e%b6%e6%9e%84%e5%ae%9e%e7%8e%b0%e5%af%b9%e6%af%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ef48975" class="language-javascript ">
 &lt;code>// Webpack HMR核心逻辑
compiler.hooks.done.tap(&amp;#39;hmr&amp;#39;, () =&amp;gt; {
 websocket.send({type: &amp;#39;hash&amp;#39;, data: latestHash})
})

// Vite HMR核心逻辑
watcher.on(&amp;#39;change&amp;#39;, (file) =&amp;gt; {
 server.ws.send({ type: &amp;#39;update&amp;#39;, path: &amp;#39;/&amp;#39;&amp;#43;file })
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>复杂度优化&lt;/strong>：&lt;/p></description></item><item><title>Vite的Tree Shaking与Rollup集成</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-05/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-05/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：是否掌握Vite底层Rollup集成机制及模块打包原理&lt;/li>
&lt;li>&lt;strong>Tree Shaking实现机制&lt;/strong>：能否解释静态分析与死代码消除的具体过程&lt;/li>
&lt;li>&lt;strong>生产优化实践&lt;/strong>：是否了解构建工具链配置与优化策略的配合方式&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>ES模块静态分析原理&lt;/li>
&lt;li>副作用（side effects）检测机制&lt;/li>
&lt;li>模块依赖图谱构建过程&lt;/li>
&lt;li>代码淘汰策略与打包优化实现&lt;/li>
&lt;li>Rollup与Vite的构建流程整合&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>ES Module静态结构 &amp;gt; 2. 依赖图谱分析 &amp;gt; 3. 副作用标记 &amp;gt; 4. 代码淘汰策略&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过Rollup实现的Tree Shaking流程分为四步：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>模块静态解析&lt;/strong>：
利用ES模块的静态导入/导出特性，构建从入口文件开始的模块依赖图。不同于CommonJS的动态require，ESM的静态结构允许构建时确定所有依赖关系。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>副作用检测&lt;/strong>：
通过package.json的&lt;code>sideEffects&lt;/code>字段识别无副作用的纯模块。标记为&lt;code>false&lt;/code>的模块会直接跳过副作用检测，显著提升未使用模块的淘汰效率。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>可达性分析&lt;/strong>：
基于入口模块进行深度遍历，通过抽象语法树（AST）分析确定实际被使用的导出项。未被其他模块引用的导出将被标记为&amp;quot;dead code&amp;quot;。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>安全剔除&lt;/strong>：
在代码生成阶段，通过以下策略确保安全移除：&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>删除未被引用的顶层作用域变量&lt;/li>
&lt;li>移除未被调用的函数声明&lt;/li>
&lt;li>消除不可达的条件分支&lt;/li>
&lt;li>清理空模块/文件&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆开发/生产构建差异（开发模式使用ESBuild不做Tree Shaking）&lt;/li>
&lt;li>误认为动态引入语法（import()）支持Tree Shaking&lt;/li>
&lt;li>忽略CSS等非JS资源的Tree Shaking处理&lt;/li>
&lt;li>未正确配置sideEffects导致关键代码被错误剔除&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过Rollup实现生产构建时的Tree Shaking，核心流程分为三个阶段：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>静态结构解析&lt;/strong>：基于ESM的静态语法特征构建模块依赖图谱，识别所有import/export声明。这是Tree Shaking的前提条件，例如对于仅部分导入的模块：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="c7f942b" class="language-javascript ">
 &lt;code>// math.js
export const add = (a,b) =&amp;gt; a &amp;#43; b
export const unused = () =&amp;gt; {}

// main.js
import { add } from &amp;#39;./math&amp;#39; // unused将被标记为dead code&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>
&lt;p>&lt;strong>副作用标注&lt;/strong>：结合package.json的&lt;code>sideEffects&lt;/code>属性和代码静态分析，识别可能改变全局状态或具有隐式依赖的模块。无副作用的模块可安全删除未使用导出。&lt;/p></description></item><item><title>Vite性能优势核心原因</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-06/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-06/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察候选人对现代前端构建工具的深层理解，重点评估以下维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>模块化体系认知&lt;/strong>：对ES Modules原生加载机制的理解深度&lt;/li>
&lt;li>&lt;strong>构建工具原理&lt;/strong>：预构建的设计目标与实现策略&lt;/li>
&lt;li>&lt;strong>开发体验优化&lt;/strong>：HMR机制的实现差异及性能影响&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：对比传统打包工具的性能瓶颈与解决方案&lt;/li>
&lt;/ol>
&lt;p>技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>ESM免打包特性如何提升冷启动速度&lt;/li>
&lt;li>依赖预构建如何解决瀑布流请求问题&lt;/li>
&lt;li>按需编译与全量打包的能耗差异&lt;/li>
&lt;li>基于浏览器缓存的模块热更新策略&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>原生ESM加载机制 &amp;gt; 2. 依赖预构建 &amp;gt; 3. HMR优化&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>&lt;strong>原生ESM加载&lt;/strong>：
Vite直接利用浏览器原生ESM支持，将每个文件视为独立模块。开发服务器收到模块请求时，通过中间件进行实时转换（如将Vue单文件组件拆解为JS/CSS）。相较于Webpack的全量打包，这种按需编译（见图1）避免了不必要的资源消耗。&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="fd5962c" class="language-text ">
 &lt;code>[浏览器] --&amp;gt; 请求模块A --&amp;gt; [Vite服务器] --&amp;gt; 实时编译 --&amp;gt; 返回ESM格式
 ↓
 模块A依赖模块B --&amp;gt; 发送新请求 --&amp;gt; 编译返回模块B&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>依赖预构建&lt;/strong>：
通过Esbuild将CommonJS模块转换为ESM格式，并合并细碎文件（如lodash的600+模块）。预构建结果存入node_modules/.vite目录，解决：&lt;/p>
&lt;ol>
&lt;li>兼容性转换（CJS to ESM）&lt;/li>
&lt;li>请求合并（lodash -&amp;gt; lodash.js）&lt;/li>
&lt;li>缓存复用（304响应）&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>HMR机制&lt;/strong>：
基于ESM的import.meta.hot接口，实现精准模块热替换。当文件修改时：&lt;/p>
&lt;ol>
&lt;li>服务端推送更新消息&lt;/li>
&lt;li>客户端按依赖链请求新模块&lt;/li>
&lt;li>替换模块实例并执行边界HMR回调
对比Webpack的HMR需要重建chunkhash和模块关系图，Vite的更新粒度更细。&lt;/li>
&lt;/ol>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ul>
&lt;li>误认为Vite完全不打包（仍需预构建依赖）&lt;/li>
&lt;li>混淆生产环境构建策略（实际使用Rollup）&lt;/li>
&lt;li>忽视ESM兼容性处理（仍需转换SFC等非JS资源）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite的dev server性能优势源于三个核心设计：&lt;/p></description></item><item><title>Vite项目创建与模板支持</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-07/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-07/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工具链实践能力&lt;/strong>：对现代前端脚手架工具的熟练程度&lt;/li>
&lt;li>&lt;strong>框架生态认知&lt;/strong>：对主流框架及Vite适配方案的了解&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：根据项目需求选择技术方案的决策能力&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite项目创建的标准流程&lt;/li>
&lt;li>官方模板体系认知&lt;/li>
&lt;li>模板差异化的适用场景判断&lt;/li>
&lt;li>配置扩展的理解深度&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite脚手架机制 &amp;gt; 官方模板体系 &amp;gt; 框架差异适配&lt;/li>
&lt;li>模块化设计 &amp;gt; 预设配置 &amp;gt; 开发体验优化&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite使用&lt;code>create-vite&lt;/code>作为脚手架生成器，通过npm init代理模式实现零全局依赖。执行流程：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8807755" class="language-bash ">
 &lt;code>npm create vite@latest → 下载create-vite包 → 交互式CLI → 生成项目结构&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>模板系统采用分层设计：&lt;/p>
&lt;ul>
&lt;li>框架层（Vue/React/Svelte等）&lt;/li>
&lt;li>语言变体（JavaScript/TypeScript）&lt;/li>
&lt;li>扩展功能（Router/State Management）&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为需要全局安装Vite&lt;/li>
&lt;li>混淆Vite模板与框架CLI（如Vue CLI）&lt;/li>
&lt;li>忽视模板预设的优化配置&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>创建项目命令：&lt;/strong>&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="5437463" class="language-bash ">
 &lt;code>npm create vite@latest
# 按提示输入项目名称
# 选择框架（Vue/React等）
# 选择变体（JS/TS）&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>官方支持模板：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Vue&lt;/li>
&lt;li>React&lt;/li>
&lt;li>Preact&lt;/li>
&lt;li>Lit&lt;/li>
&lt;li>Svelte&lt;/li>
&lt;li>Solid&lt;/li>
&lt;li>Vanilla（纯JS/TS）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>多模板应用场景：&lt;/strong>&lt;/p></description></item><item><title>vite.config.js的作用与配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-08/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-08/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具理解&lt;/strong>：对现代前端工程化工具的配置认知&lt;/li>
&lt;li>&lt;strong>工程化实践能力&lt;/strong>：通过配置解决实际开发需求的能力&lt;/li>
&lt;li>&lt;strong>环境配置经验&lt;/strong>：对开发环境与生产环境差异的掌握&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>配置文件的模块化导出方式&lt;/li>
&lt;li>构建输出目录配置&lt;/li>
&lt;li>开发服务器代理配置&lt;/li>
&lt;li>模块别名解析机制&lt;/li>
&lt;li>配置项之间的优先级关系&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>模块解析（Module Resolution）&lt;/li>
&lt;li>开发服务器配置（Dev Server）&lt;/li>
&lt;li>构建配置（Build Configuration）&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;code>vite.config.js&lt;/code> 是Vite的配置文件，采用ES模块格式导出配置对象。其核心作用包括：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>开发服务器调优&lt;/strong>：通过&lt;code>server&lt;/code>配置项控制开发服务器行为，包括端口、代理、HTTPS等&lt;/li>
&lt;li>&lt;strong>构建过程控制&lt;/strong>：通过&lt;code>build&lt;/code>配置项管理构建输出格式、目录结构、资源处理等&lt;/li>
&lt;li>&lt;strong>模块解析规则&lt;/strong>：通过&lt;code>resolve&lt;/code>配置项定义路径别名、文件扩展名解析顺序等&lt;/li>
&lt;/ol>
&lt;p>开发阶段配置通过&lt;code>server.proxy&lt;/code>实现请求代理，其底层使用&lt;code>http-proxy&lt;/code>库；生产构建时&lt;code>build.outDir&lt;/code>对应Rollup的output.dir配置，控制打包输出位置；路径别名通过修改模块解析器实现路径重定向。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆CommonJS与ESM导出方式&lt;/li>
&lt;li>未正确处理路径解析（需要使用path.resolve）&lt;/li>
&lt;li>代理配置未设置&lt;code>changeOrigin&lt;/code>导致跨域问题&lt;/li>
&lt;li>忘记配置TypeScript的路径映射（tsconfig.json）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;code>vite.config.js&lt;/code> 是Vite项目的核心配置文件，主要用于定制构建过程和开发服务器行为。典型配置示例如下：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2c82af4" class="language-javascript ">
 &lt;code>import { defineConfig } from &amp;#39;vite&amp;#39;
import path from &amp;#39;path&amp;#39;

export default defineConfig({
 // 构建配置
 build: {
 outDir: &amp;#39;build&amp;#39;, // 自定义输出目录（默认dist）
 assetsDir: &amp;#39;static&amp;#39; // 静态资源子目录
 },
 
 // 开发服务器配置
 server: {
 proxy: {
 &amp;#39;/api&amp;#39;: {
 target: &amp;#39;http://backend-service:8080&amp;#39;,
 changeOrigin: true, // 修改请求头host
 rewrite: path =&amp;gt; path.replace(/^\/api/, &amp;#39;&amp;#39;) // 路径重写
 }
 }
 },

 // 模块解析配置
 resolve: {
 alias: {
 &amp;#39;@&amp;#39;: path.resolve(__dirname, &amp;#39;src&amp;#39;), // 路径别名
 &amp;#39;#lib&amp;#39;: path.resolve(__dirname, &amp;#39;src/library&amp;#39;) 
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例关键点">编码示例关键点 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b%e5%85%b3%e9%94%ae%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>路径处理&lt;/strong>：使用Node.js的path模块确保跨平台兼容性&lt;/li>
&lt;li>&lt;strong>代理配置&lt;/strong>：正则表达式实现路径重写，避免后端路由冲突&lt;/li>
&lt;li>&lt;strong>类型安全&lt;/strong>：使用defineConfig获取配置智能提示&lt;/li>
&lt;/ol>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>环境区分&lt;/strong>：通过&lt;code>mode&lt;/code>参数加载不同配置&lt;/li>
&lt;li>&lt;strong>配置拆分&lt;/strong>：将大型配置按功能拆分为多个文件&lt;/li>
&lt;li>&lt;strong>动态配置&lt;/strong>：使用函数式配置根据环境变量生成配置对象&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何实现多环境配置？&lt;/strong>&lt;/p></description></item><item><title>build与server配置项详解</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-09/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-09/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题考察候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具深度使用&lt;/strong>：是否掌握Vite核心配置项及其工程化应用&lt;/li>
&lt;li>&lt;strong>构建优化意识&lt;/strong>：能否根据场景选择合适的构建配置优化产物体积&lt;/li>
&lt;li>&lt;strong>开发环境调优&lt;/strong>：是否具备本地开发环境定制能力&lt;/li>
&lt;li>&lt;strong>安全认知&lt;/strong>：是否理解现代Web开发中的HTTPS配置要求&lt;/li>
&lt;/ol>
&lt;p>技术评估点：&lt;/p>
&lt;ul>
&lt;li>build.minify的压缩策略选择&lt;/li>
&lt;li>rollupOptions自定义打包配置&lt;/li>
&lt;li>server.proxy跨域解决方案&lt;/li>
&lt;li>HTTPS证书配置方式&lt;/li>
&lt;li>预构建依赖配置逻辑&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>生产构建（build）&lt;/p>
&lt;ul>
&lt;li>代码压缩：&lt;code>minify&lt;/code>（terser/esbuild）&lt;/li>
&lt;li>资源处理：&lt;code>assetsInlineLimit&lt;/code>（base64内联阈值）&lt;/li>
&lt;li>输出控制：&lt;code>outDir&lt;/code>/&lt;code>sourcemap&lt;/code>/&lt;code>manifest&lt;/code>&lt;/li>
&lt;li>高级配置：&lt;code>rollupOptions&lt;/code>（覆盖Rollup配置）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>开发服务器（server）&lt;/p>
&lt;ul>
&lt;li>网络配置：&lt;code>port&lt;/code>/&lt;code>host&lt;/code>/&lt;code>open&lt;/code>&lt;/li>
&lt;li>安全协议：&lt;code>https&lt;/code>（自签名证书/自定义证书）&lt;/li>
&lt;li>代理系统：&lt;code>proxy&lt;/code>（解决跨域/路径重写）&lt;/li>
&lt;li>热更新：&lt;code>hmr&lt;/code>（心跳检测/协议配置）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="d533018" class="language-javascript ">
 &lt;code>示例配置结构：
// vite.config.js
export default defineConfig({
 build: {
 minify: &amp;#39;terser&amp;#39;, // 压缩引擎选择
 rollupOptions: {
 output: { manualChunks: (id) =&amp;gt; {...} } // 自定义代码分割
 }
 },
 server: {
 port: 3000, // 端口锁定
 https: { // HTTPS配置
 key: fs.readFileSync(&amp;#39;key.pem&amp;#39;),
 cert: fs.readFileSync(&amp;#39;cert.pem&amp;#39;)
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆开发/生产环境配置（如将server配置用于build）&lt;/li>
&lt;li>手动配置Rollup导致Vite默认优化失效&lt;/li>
&lt;li>误用HTTP/2协议导致代理失效&lt;/li>
&lt;li>未配置CORS策略直接访问第三方API&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite的配置系统通过&lt;code>build&lt;/code>和&lt;code>server&lt;/code>两大模块分别处理构建和开发环境：&lt;/p></description></item><item><title>Vite环境变量配置方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-10/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-10/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察候选人对Vite环境变量管理机制的理解，重点评估以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化配置能力&lt;/strong>：理解Vite多环境配置文件的命名规范与加载规则&lt;/li>
&lt;li>&lt;strong>安全边界意识&lt;/strong>：掌握客户端环境变量的暴露规则与敏感信息防护&lt;/li>
&lt;li>&lt;strong>构建流程理解&lt;/strong>：清楚不同构建模式下（开发/生产）环境变量的优先级逻辑&lt;/li>
&lt;li>&lt;strong>运行时机制&lt;/strong>：熟悉&lt;code>import.meta.env&lt;/code>的底层实现原理&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>环境变量文件命名规范（.env.[mode]）&lt;/li>
&lt;li>多环境文件加载优先级逻辑&lt;/li>
&lt;li>VITE_前缀变量的注入机制&lt;/li>
&lt;li>开发/生产模式下的变量隔离策略&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>环境文件加载顺序&lt;/strong>：模式特定文件 &amp;gt; 通用文件&lt;/li>
&lt;li>&lt;strong>变量暴露规则&lt;/strong>：仅VITE_前缀变量注入客户端&lt;/li>
&lt;li>&lt;strong>模式识别机制&lt;/strong>：基于NODE_ENV自动识别开发/生产模式&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过dotenv解析.env文件，加载顺序遵循：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8a0064a" class="language-bash ">
 &lt;code>.env.${mode}.local &amp;gt; .env.${mode} &amp;gt; .env.local &amp;gt; .env&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>（例：生产模式下&lt;code>.env.production.local&lt;/code>优先级最高）&lt;/p>
&lt;p>客户端通过&lt;code>import.meta.env&lt;/code>访问变量时，Vite会：&lt;/p>
&lt;ol>
&lt;li>过滤非VITE_前缀变量&lt;/li>
&lt;li>将合法变量注入import.meta.env对象&lt;/li>
&lt;li>在构建时通过字符串替换方式硬编码到产物中&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误将敏感信息放入无VITE_前缀的变量&lt;/li>
&lt;li>错误认为.env.local仅适用于特定模式&lt;/li>
&lt;li>混淆process.env（Node端）与import.meta.env（客户端）&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中配置环境变量：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>创建.env文件&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>通用配置：&lt;code>.env&lt;/code>&lt;/li>
&lt;li>开发模式：&lt;code>.env.development&lt;/code>&lt;/li>
&lt;li>生产模式：&lt;code>.env.production&lt;/code>&lt;/li>
&lt;li>本地覆盖：&lt;code>.env.local&lt;/code>（被Git忽略）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>变量访问&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="642a08d" class="language-javascript ">
 &lt;code>// 仅暴露以VITE_开头的变量
console.log(import.meta.env.VITE_API_URL)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>优先级规则&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="70e8ad4" class="language-text ">
 &lt;code>开发模式：.env.development.local &amp;gt; .env.development &amp;gt; .env.local &amp;gt; .env
生产模式：.env.production.local &amp;gt; .env.production &amp;gt; .env.local &amp;gt; .env&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="99b9beb" class="language-bash ">
 &lt;code># .env.production
VITE_API_URL=https://api.example.com
VITE_CDN_HOST=cdn.prod.com

# .env.development
VITE_API_URL=http://localhost:3000&lt;/code>
 &lt;/pre>
 &lt;/div>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="58cedb1" class="language-javascript ">
 &lt;code>// 组件中使用
const config = {
 api: {
 baseURL: import.meta.env.VITE_API_URL,
 timeout: 5000
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="安全建议">安全建议 &lt;a href="#%e5%ae%89%e5%85%a8%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>敏感变量（如数据库密码）必须使用无VITE_前缀的变量&lt;/li>
&lt;li>通过GitIgnore排除.local文件&lt;/li>
&lt;li>使用服务器端渲染时进行二次验证&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何自定义构建模式？&lt;/strong>&lt;/p></description></item><item><title>Vite对CSS预处理器的支持</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-11/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-11/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工程化配置能力&lt;/strong>：Vite工具链的扩展机制及对CSS预处理器的支持方式&lt;/li>
&lt;li>&lt;strong>依赖管理理解&lt;/strong>：识别不同预处理器所需的npm依赖包&lt;/li>
&lt;li>&lt;strong>构建流程认知&lt;/strong>：Vite在开发/生产环境下处理预处理器的差异&lt;/li>
&lt;li>&lt;strong>配置调试技能&lt;/strong>：通过vite.config.js实现定制化样式处理逻辑&lt;/li>
&lt;/ol>
&lt;p>技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite内置CSS处理能力范围&lt;/li>
&lt;li>预处理器依赖包的选择与安装&lt;/li>
&lt;li>CSS预处理器配置选项的正确使用&lt;/li>
&lt;li>源码到产物的编译链路理解&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Sass &amp;gt; Less &amp;gt; Stylus &amp;gt; Vite构建流程 &amp;gt; 预处理器配置&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>内置支持&lt;/strong>：Vite通过&lt;code>@vitejs/plugin-vue&lt;/code>等官方插件内置了主流CSS预处理器支持，但需要显式安装对应编译器&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>编译时机&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>开发环境：通过浏览器原生ESM请求触发实时编译&lt;/li>
&lt;li>生产环境：使用Rollup进行统一编译优化&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>配置层级&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4008f25" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 css: {
 preprocessorOptions: {
 scss: {
 additionalData: `$primary-color: #1890ff;` // 全局注入
 }
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为需要额外安装Vite专用插件&lt;/li>
&lt;li>混淆dependencies与devDependencies的安装位置&lt;/li>
&lt;li>未处理嵌套导入导致的路径错误&lt;/li>
&lt;li>生产环境忘记安装对应处理器导致构建失败&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过&lt;strong>原生ESM导入&lt;/strong>实现CSS预处理器的按需编译。需安装对应编译器：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6447984" class="language-bash ">
 &lt;code># Sass
npm install -D sass

# Less
npm install -D less

# Stylus
npm install -D stylus&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>配置示例（Sass）：&lt;/p></description></item><item><title>Vite静态资源处理策略</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-12/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-12/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>核心能力维度&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：Vite静态资源处理机制与构建流程的关联&lt;/li>
&lt;li>&lt;strong>工程化配置能力&lt;/strong>：配置扩展与优化静态资源处理策略&lt;/li>
&lt;li>&lt;strong>资源加载策略决策&lt;/strong>：不同引用方式的适用场景判断&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>import&lt;/code>资源处理流程与构建优化特性&lt;/li>
&lt;li>&lt;code>public&lt;/code>目录的特殊处理机制&lt;/li>
&lt;li>资源指纹与缓存控制实现&lt;/li>
&lt;li>路径解析规则差异&lt;/li>
&lt;li>构建体积与性能优化权衡&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>资源处理器 &amp;gt; 路径解析 &amp;gt; 构建优化 &amp;gt; 缓存策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>import资源模式&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Vite通过&lt;code>@rollup/plugin-image&lt;/code>等插件处理JS模块导入的静态资源&lt;/li>
&lt;li>资源被转换为ES模块并返回解析后的URL（如&lt;code>import img from './a.png'&lt;/code>）&lt;/li>
&lt;li>构建时自动添加哈希指纹实现长期缓存（Cache Busting）&lt;/li>
&lt;li>支持?url原始引入、?raw源码引入等查询参数&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>public目录模式&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>位于项目根目录的&lt;code>public&lt;/code>文件夹直接映射到构建输出根目录&lt;/li>
&lt;li>资源通过绝对路径访问（如&lt;code>/robots.txt&lt;/code>）&lt;/li>
&lt;li>不经过构建管道，保留原始结构与文件名&lt;/li>
&lt;li>适用于必须保持名称不变的场景（如favicon.ico）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>路径解析差异&lt;/strong>：&lt;/p>
&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="8a526d7" class="language-javascript ">
 &lt;code>// import方式（相对路径）
import logo from &amp;#39;@/assets/logo.png&amp;#39; // 输出为/assets/logo.6d5c82.png

// public方式（绝对路径）
&amp;lt;img src=&amp;#34;/logo.png&amp;#34;&amp;gt; // 对应public/logo.png原始文件&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误将public资源用相对路径引用&lt;/li>
&lt;li>混淆开发环境与生产环境的路径基准&lt;/li>
&lt;li>对大文件使用import导致构建缓慢&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过两种机制处理静态资源：&lt;/p>
&lt;p>&lt;strong>1. 配置方式&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7ca39d4" class="language-javascript ">
 &lt;code>// vite.config.js
export default {
 assetsInclude: [&amp;#39;**/*.gltf&amp;#39;], // 扩展支持格式
 build: {
 assetsDir: &amp;#39;static&amp;#39;, // 修改输出目录
 assetsInlineLimit: 4096 // 调整base64内联阈值
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>2. 引用方式对比&lt;/strong>：&lt;/p></description></item><item><title>Vite的Gzip与代码分割配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-13/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-13/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;strong>核心能力维度&lt;/strong>：工程化构建优化能力、Vite配置实践能力、Rollup底层原理理解&lt;/li>
&lt;li>&lt;strong>技术评估点&lt;/strong>：
&lt;ol>
&lt;li>构建工具插件集成能力（vite-plugin-compression使用）&lt;/li>
&lt;li>Rollup代码分割配置实践（manualChunks策略）&lt;/li>
&lt;li>压缩算法选择与阈值控制&lt;/li>
&lt;li>构建产物优化策略（预压缩与动态压缩对比）&lt;/li>
&lt;li>性能优化平衡点把控（请求数量vs缓存效率）&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;code>vite-plugin-compression&lt;/code> &amp;gt; Rollup代码分割 &amp;gt; 动态导入语法&lt;/li>
&lt;li>&lt;strong>Gzip预压缩&lt;/strong>：通过构建时预生成.gz文件，降低服务端实时压缩开销&lt;/li>
&lt;li>&lt;strong>代码分割策略&lt;/strong>：基于路由分割、依赖分析、模块复用率三种主流方案&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Gzip压缩通过识别重复字节降低传输体积，Vite通过Rollup的&lt;code>generateBundle&lt;/code>钩子插入压缩逻辑。代码分割通过Rollup的&lt;code>output.manualChunks&lt;/code>配置实现模块分组，结合动态导入语法&lt;code>import()&lt;/code>触发自动分割。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>开发环境启用压缩（应仅在prod使用）&lt;/li>
&lt;li>分割粒度过于细碎（HTTP/2下仍需控制并发）&lt;/li>
&lt;li>忽略已有CDN压缩策略（需确认服务端配置）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>Gzip压缩配置&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>安装插件：&lt;code>npm i vite-plugin-compression&lt;/code>&lt;/li>
&lt;li>配置阈值与算法：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ac196ea" class="language-javascript ">
 &lt;code>// vite.config.js
import viteCompression from &amp;#39;vite-plugin-compression&amp;#39;

export default {
 plugins: [
 viteCompression({
 threshold: 10240, // 10KB以上文件进行压缩
 algorithm: &amp;#39;gzip&amp;#39;
 })
 ]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>代码分割优化&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>动态导入路由组件：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4b9b065" class="language-javascript ">
 &lt;code>// 自动触发代码分割
const Home = () =&amp;gt; import(&amp;#39;./views/Home.vue&amp;#39;)&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>自定义分割策略：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="cdaf031" class="language-javascript ">
 &lt;code>// vite.config.js
export default {
 build: {
 rollupOptions: {
 output: {
 manualChunks(id) {
 if (id.includes(&amp;#39;node_modules&amp;#39;)) {
 if (id.includes(&amp;#39;lodash&amp;#39;)) {
 return &amp;#39;vendor-lodash&amp;#39;
 }
 return &amp;#39;vendor&amp;#39;
 }
 }
 }
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="c0421bc" class="language-javascript ">
 &lt;code>// 高级配置示例
import { defineConfig } from &amp;#39;vite&amp;#39;
import viteCompression from &amp;#39;vite-plugin-compression&amp;#39;

export default defineConfig({
 plugins: [
 viteCompression({
 verbose: true,
 disable: false,
 threshold: 10240,
 deleteOriginFile: false // 保留原始文件供未支持服务使用
 })
 ],
 build: {
 rollupOptions: {
 output: {
 manualChunks(id) {
 // 将超过50KB的npm包单独打包
 if (id.includes(&amp;#39;node_modules&amp;#39;)) {
 const lib = id.split(&amp;#39;node_modules/&amp;#39;)[1].split(&amp;#39;/&amp;#39;)[0]
 if (lib === &amp;#39;react&amp;#39;) return &amp;#39;react-vendor&amp;#39;
 return lib.length &amp;gt; 20 ? &amp;#39;misc&amp;#39; : lib
 }
 }
 }
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="扩展性建议">扩展性建议 &lt;a href="#%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>大流量场景&lt;/strong>：开启Brotli压缩（需配置&lt;code>algorithm: 'brotliCompress'&lt;/code>）&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：降低分割粒度避免内存溢出&lt;/li>
&lt;li>&lt;strong>混合部署&lt;/strong>：同时生成gzip与br格式，通过&lt;code>Accept-Encoding&lt;/code>头自动适配&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何验证Gzip压缩效果？&lt;/strong>&lt;/p></description></item><item><title>Vite多页应用与懒加载实现</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-14/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-14/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具深度使用能力&lt;/strong>：Vite多页应用配置涉及Rollup构建机制的掌握&lt;/li>
&lt;li>&lt;strong>模块化工程化思维&lt;/strong>：动态导入语法与代码分割的实际应用&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：通过懒加载实现资源加载优化&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite多入口配置方案&lt;/li>
&lt;li>Rollup输入输出配置原理&lt;/li>
&lt;li>动态import()的编译结果与HTTP/2推送机制&lt;/li>
&lt;li>代码分割(Code Splitting)与预加载策略&lt;/li>
&lt;li>模块依赖解析规则&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Rollup输入配置 &amp;gt; 动态导入语法 &amp;gt; 分包策略优化&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>多页应用(MPA)配置&lt;/strong>：
Vite通过&lt;code>build.rollupOptions.input&lt;/code>配置多入口，每个入口对应独立HTML文件。构建时生成多个独立bundle，通过文件系统约定式路由自动关联入口模块。&lt;/p>
&lt;p>&lt;strong>动态导入机制&lt;/strong>：
使用&lt;code>import()&lt;/code>语法触发代码分割，Vite会：&lt;/p>
&lt;ol>
&lt;li>解析动态导入路径&lt;/li>
&lt;li>生成独立chunk文件&lt;/li>
&lt;li>注入预加载标签&lt;code>&amp;lt;link rel=&amp;quot;modulepreload&amp;quot;&amp;gt;&lt;/code>&lt;/li>
&lt;li>在浏览器空闲时按需加载&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆传统多页应用与SPA路由配置&lt;/li>
&lt;li>动态导入路径使用变量导致无法静态分析&lt;/li>
&lt;li>忽略公共模块提取导致的重复打包&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>多页应用配置&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>创建&lt;code>pages&lt;/code>目录存放各页面&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="20f1243" class="language- ">
 &lt;code>/src
 /pages
 /home
 index.html
 main.js
 /about
 index.html
 main.js&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>配置&lt;code>vite.config.js&lt;/code>：&lt;/p>
&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1470e1d" class="language-javascript ">
 &lt;code>export default {
 build: {
 rollupOptions: {
 input: {
 home: &amp;#39;/src/pages/home/index.html&amp;#39;,
 about: &amp;#39;/src/pages/about/index.html&amp;#39;
 }
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>组件懒加载实现&lt;/strong>：&lt;/p></description></item><item><title>Vite插件机制与常见Hook</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-15/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-15/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：Vite底层机制理解、工程化扩展能力、构建工具原理掌握&lt;br>
&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>对Vite与Rollup架构关系的理解&lt;/li>
&lt;li>插件系统兼容性实现原理&lt;/li>
&lt;li>Vite独有Hook的应用场景&lt;/li>
&lt;li>开发环境与生产构建的差异处理&lt;/li>
&lt;li>HMR热更新机制结合&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Rollup Plugin API &amp;gt; Vite Plugin Interface &amp;gt; 构建/开发双模式差异 &amp;gt; HMR集成&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过分层架构实现插件兼容：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建时&lt;/strong>：直接使用Rollup的插件系统，暴露&lt;code>build.rollupOptions.plugins&lt;/code>配置项&lt;/li>
&lt;li>&lt;strong>开发时&lt;/strong>：实现Rollup格式的插件容器（Plugin Container），模拟&lt;code>resolveId/load/transform&lt;/code>等核心Hook&lt;/li>
&lt;li>&lt;strong>扩展机制&lt;/strong>：通过&lt;code>enforce: 'pre'|'post'&lt;/code>控制插件执行顺序，Vite特有Hook在插件容器中被优先处理&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>执行流程示例&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ec4e615" class="language- ">
 &lt;code>启动阶段：
config -&amp;gt; configureServer -&amp;gt; configurePreviewServer

请求处理阶段：
resolveId -&amp;gt; load -&amp;gt; transform -&amp;gt; handleHotUpdate&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为所有Rollup插件可直接用于开发环境（实际需考虑ESM兼容性）&lt;/li>
&lt;li>混淆&lt;code>transform&lt;/code>在开发/构建阶段的不同执行时机&lt;/li>
&lt;li>忽略&lt;code>enforce&lt;/code>参数对插件执行顺序的影响&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过创建与Rollup兼容的插件容器实现生态复用，开发时模拟Rollup核心Hook，构建时直接调用Rollup。特有Hook包括：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>config&lt;/strong>：修改Vite配置（修改前生效）&lt;/li>
&lt;li>&lt;strong>configureServer&lt;/strong>：操作开发服务器（添加中间件）&lt;/li>
&lt;li>&lt;strong>transform&lt;/strong>：实时转换代码（支持HMR）&lt;/li>
&lt;li>&lt;strong>handleHotUpdate&lt;/strong>：自定义热更新逻辑&lt;/li>
&lt;li>&lt;strong>configResolved&lt;/strong>：读取最终配置（修改后生效）&lt;/li>
&lt;/ol>
&lt;p>示例场景：&lt;/p>
&lt;ul>
&lt;li>使用&lt;code>config&lt;/code>设置全局SCSS变量&lt;/li>
&lt;li>通过&lt;code>configureServer&lt;/code>添加接口代理&lt;/li>
&lt;li>利用&lt;code>transform&lt;/code>实现按需加载&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="4ea71f4" class="language-javascript ">
 &lt;code>// vite.config.js
export default {
 plugins: [{
 name: &amp;#39;custom-plugin&amp;#39;,
 enforce: &amp;#39;pre&amp;#39;,
 
 // 修改配置
 config(config) {
 return { resolve: { alias: { &amp;#39;@&amp;#39;: &amp;#39;/src&amp;#39; } } }
 },

 // 配置开发服务器
 configureServer(server) {
 server.middlewares.use((req, res, next) =&amp;gt; {
 console.log(`Request: ${req.url}`)
 next()
 })
 },

 // 代码转换
 transform(code, id) {
 if (/\.vue$/.test(id)) {
 return code.replace(/__VERSION__/g, &amp;#39;1.0.0&amp;#39;)
 }
 }
 }]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="扩展性建议">扩展性建议 &lt;a href="#%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>使用&lt;code>enforce&lt;/code>控制插件顺序&lt;/li>
&lt;li>通过&lt;code>apply: 'serve'|'build'&lt;/code>区分环境&lt;/li>
&lt;li>复杂转换逻辑使用缓存提升性能&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何实现开发/构建环境条件判断？&lt;/strong>&lt;br>
答：检查&lt;code>config.command&lt;/code>取值&amp;rsquo;serve&amp;rsquo;或&amp;rsquo;build'&lt;/p></description></item><item><title>自定义Vite插件开发与执行顺序</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-16/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-16/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：Vite插件体系理解、构建工具原理认知、生命周期控制能力&lt;br>
&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>插件基本结构及生命周期钩子的使用&lt;/li>
&lt;li>enforce属性的作用原理与执行阶段控制&lt;/li>
&lt;li>插件执行顺序的优先级规则&lt;/li>
&lt;li>Rollup插件体系与Vite的集成关系&lt;/li>
&lt;li>不同场景下的插件配置策略（开发/生产环境）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>关键知识点&lt;/strong>：插件结构 &amp;gt; enforce机制 &amp;gt; 执行阶段控制&lt;/p>
&lt;p>Vite插件本质是包含特定生命周期钩子的对象，通过&lt;code>enforce: 'pre'|'post'&lt;/code>控制同类型钩子的执行顺序。执行流程分为三个阶段：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pre插件&lt;/strong>：处理基础逻辑（如环境变量注入）&lt;/li>
&lt;li>&lt;strong>Normal插件&lt;/strong>：标准处理流程（如Vite内置插件）&lt;/li>
&lt;li>&lt;strong>Post插件&lt;/strong>：最终处理（如代码压缩）&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>原理剖析&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>插件执行顺序由&lt;code>enforce&lt;/code>和配置数组顺序共同决定，同enforce级别按配置顺序执行&lt;/li>
&lt;li>核心钩子如&lt;code>transform&lt;/code>会在模块处理时触发，此时pre插件的钩子会先于normal插件执行&lt;/li>
&lt;li>通过源码中的&lt;code>sortUserPlugins&lt;/code>方法对插件进行分组排序&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>误以为&lt;code>enforce&lt;/code>控制整个插件的执行顺序（实际控制具体钩子的阶段）&lt;/li>
&lt;li>混淆Rollup钩子与Vite特有钩子的执行机制&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>自定义Vite插件开发步骤&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>导出工厂函数返回插件对象&lt;/li>
&lt;li>声明&lt;code>name&lt;/code>标识插件&lt;/li>
&lt;li>通过&lt;code>enforce&lt;/code>指定执行阶段&lt;/li>
&lt;li>在对应生命周期钩子中添加逻辑&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>示例代码&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="6b7b577" class="language-javascript ">
 &lt;code>// vite.config.js
export default function myPlugin() {
 return {
 name: &amp;#39;custom-plugin&amp;#39;,
 enforce: &amp;#39;pre&amp;#39;, // 控制执行阶段
 
 // 修改配置
 config(config) {
 return { 
 optimizeDeps: { 
 exclude: [&amp;#39;lodash&amp;#39;] 
 }
 }
 },

 // 转换模块内容
 transform(code, id) {
 if (id.endsWith(&amp;#39;.vue&amp;#39;)) {
 return code.replace(&amp;#39;debugger&amp;#39;, &amp;#39;&amp;#39;)
 }
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优先级规则&lt;/strong>：&lt;/p></description></item><item><title>扩展Rollup配置的实践</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-17/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-17/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考核以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：对Vite与Rollup的协作关系及模块打包机制的理解&lt;/li>
&lt;li>&lt;strong>配置扩展能力&lt;/strong>：通过官方API实现定制化构建配置的实践能力&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：平衡框架默认配置与自定义需求的协调能力&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite配置体系与Rollup的对接方式&lt;/li>
&lt;li>output格式变更对现代/传统模块系统的适配&lt;/li>
&lt;li>Rollup插件在Vite中的兼容性处理&lt;/li>
&lt;li>配置合并策略与默认值覆盖风险&lt;/li>
&lt;li>构建产物优化配置技巧&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Rollup集成机制 &amp;gt; 配置项合并策略 &amp;gt; 插件系统扩展 &amp;gt; 输出格式优化&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过&lt;code>build.rollupOptions&lt;/code>暴露Rollup配置接口，在内部使用&lt;code>rollup.defineConfig&lt;/code>时进行深度合并。配置处理流程为：&lt;/p>
&lt;ol>
&lt;li>Vite加载基础配置&lt;/li>
&lt;li>合并用户自定义的rollupOptions&lt;/li>
&lt;li>注入Vite必需插件（如CSS处理、预编译依赖）&lt;/li>
&lt;li>启动Rollup构建流程&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>直接覆盖而非合并plugins数组导致Vite核心插件丢失&lt;/li>
&lt;li>混淆Rollup输出格式（如误用IIFE格式导致ES模块失效）&lt;/li>
&lt;li>忽略Vite环境变量注入对配置的影响（如&lt;code>process.env&lt;/code>替换）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中扩展Rollup配置应通过&lt;code>vite.config.js&lt;/code>的&lt;code>build.rollupOptions&lt;/code>属性实现。配置方式分为：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>基础配置&lt;/strong> - 直接对象合并&lt;/li>
&lt;li>&lt;strong>函数式配置&lt;/strong> - 接收默认配置进行扩展&lt;/li>
&lt;li>&lt;strong>条件配置&lt;/strong> - 根据环境变量动态调整&lt;/li>
&lt;/ol>
&lt;p>示例声明：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1b3b55f" class="language-javascript ">
 &lt;code>// vite.config.js
import legacy from &amp;#39;@vitejs/plugin-legacy&amp;#39;

export default defineConfig({
 build: {
 rollupOptions: (defaultOptions) =&amp;gt; ({
 ...defaultOptions,
 output: {
 format: &amp;#39;es&amp;#39;, // 修改输出格式为ES模块
 manualChunks: (id) =&amp;gt; customChunkStrategy(id) // 自定义代码分割策略
 },
 plugins: [
 ...defaultOptions.plugins,
 legacy({ targets: [&amp;#39;defaults&amp;#39;] }) // 安全扩展插件
 ]
 })
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7329083" class="language-javascript ">
 &lt;code>// vite.config.js
import { defineConfig } from &amp;#39;vite&amp;#39;
import imageOptimize from &amp;#39;rollup-plugin-image-optimize&amp;#39; // 示例插件

export default defineConfig({
 build: {
 rollupOptions: {
 // 修改输出配置
 output: {
 entryFileNames: &amp;#39;[name]-[hash].js&amp;#39;,
 chunkFileNames: &amp;#39;chunks/[name]-[hash].js&amp;#39;, // 分块文件命名
 assetFileNames: &amp;#39;assets/[name]-[hash][extname]&amp;#39; // 静态资源命名
 },
 // 插件扩展（保留默认插件）
 plugins: [
 imageOptimize({
 /* 图片优化配置 */
 })
 ]
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>动态加载配置&lt;/strong>：通过&lt;code>mode&lt;/code>参数区分开发/生产环境配置&lt;/li>
&lt;li>&lt;strong>插件封装&lt;/strong>：将复杂配置封装为preset插件复用&lt;/li>
&lt;li>&lt;strong>性能优化&lt;/strong>：使用&lt;code>build.sourcemap&lt;/code>和&lt;code>build.minify&lt;/code>组合优化输出体积&lt;/li>
&lt;li>&lt;strong>兼容处理&lt;/strong>：通过&lt;code>@vitejs/plugin-legacy&lt;/code>处理传统浏览器支持&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何确保自定义Rollup插件与Vite的兼容性？&lt;/strong>&lt;br>
&lt;em>提示：检查插件钩子是否冲突Vite核心流程&lt;/em>&lt;/p></description></item><item><title>实用Vite插件举例</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-18/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-18/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工具链掌握程度&lt;/strong>：对Vite生态常用插件的了解及实际应用能力&lt;/li>
&lt;li>&lt;strong>工程化思维&lt;/strong>：理解现代构建工具如何通过插件机制解决具体工程问题&lt;/li>
&lt;li>&lt;strong>兼容性方案设计&lt;/strong>：掌握不同场景下的兼容性解决方案设计思路&lt;/li>
&lt;/ol>
&lt;p>技术评估点：&lt;/p>
&lt;ul>
&lt;li>浏览器兼容性方案的实现原理&lt;/li>
&lt;li>PWA核心功能的集成方式&lt;/li>
&lt;li>资源优化策略的实施手段&lt;/li>
&lt;li>插件配置的深度定制能力&lt;/li>
&lt;li>构建工具扩展机制的理解&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>浏览器降级方案（@vitejs/plugin-legacy）&lt;/li>
&lt;li>PWA支持（vite-plugin-pwa）&lt;/li>
&lt;li>资源优化（vite-plugin-compression）&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>@vitejs/plugin-legacy&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>基于&lt;code>babel-preset-env&lt;/code>转换ES6+语法&lt;/li>
&lt;li>生成新旧双版本Bundle，通过&lt;code>&amp;lt;script nomodule&amp;gt;&lt;/code>和&lt;code>&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code>实现差异化加载&lt;/li>
&lt;li>自动注入&lt;code>core-js&lt;/code>polyfill和&lt;code>regenerator-runtime&lt;/code>&lt;/li>
&lt;li>通过&lt;code>SystemJS&lt;/code>实现动态加载polyfill&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>vite-plugin-pwa&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>集成Workbox构建Service Worker&lt;/li>
&lt;li>自动生成Web App Manifest配置&lt;/li>
&lt;li>实现资源预缓存（Precaching）和运行时缓存（Runtime Caching）&lt;/li>
&lt;li>支持离线回退(offline fallback)策略&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>vite-plugin-compression&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>采用&lt;code>gzip&lt;/code>/&lt;code>brotli&lt;/code>算法压缩静态资源&lt;/li>
&lt;li>服务端配合&lt;code>Content-Encoding&lt;/code>头实现浏览器自动解压&lt;/li>
&lt;li>通过threshold参数控制压缩阈值&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误认为legacy插件仅处理语法转换，忽略polyfill注入&lt;/li>
&lt;li>混淆Service Worker注册与资源缓存策略配置&lt;/li>
&lt;li>未配置Nginx等服务器解压规则导致压缩失效&lt;/li>
&lt;/ul>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>@vitejs/plugin-legacy&lt;/strong>&lt;br>
通过双构建策略解决旧版浏览器ES语法兼容问题，自动注入必要的polyfill。现代浏览器加载原生ESM模块，旧浏览器加载转译后的脚本及polyfill。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>vite-plugin-pwa&lt;/strong>&lt;br>
集成Workbox生成Service Worker，实现离线缓存、资源预加载和更新管理。自动生成manifest配置实现PWA安装功能，显著提升Web应用可靠性和用户体验。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>vite-plugin-compression&lt;/strong>&lt;br>
使用gzip/brotli算法压缩文本类资源，减少传输体积。通过服务端协商机制实现高效传输，提升低带宽环境下的加载速度，降低首屏渲染时间。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="f700d2d" class="language-javascript ">
 &lt;code>// vite.config.js
import legacy from &amp;#39;@vitejs/plugin-legacy&amp;#39;
import { VitePWA } from &amp;#39;vite-plugin-pwa&amp;#39;
import compression from &amp;#39;vite-plugin-compression&amp;#39;

export default {
 plugins: [
 legacy({
 targets: [&amp;#39;defaults&amp;#39;, &amp;#39;not IE 11&amp;#39;], // 目标浏览器定义
 modernPolyfills: true // 按需加载polyfill
 }),
 VitePWA({
 manifest: {
 name: &amp;#39;My PWA&amp;#39;,
 theme_color: &amp;#39;#ffffff&amp;#39;
 },
 workbox: {
 runtimeCaching: [/* 自定义缓存策略 */]
 }
 }),
 compression({
 algorithm: &amp;#39;brotliCompress&amp;#39;, // 压缩算法选择
 threshold: 1024 // 1KB以下不压缩
 })
 ]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Legacy插件如何实现按需polyfill？&lt;/strong>&lt;br>
通过&lt;code>browserslist&lt;/code>匹配目标环境，结合&lt;code>core-js&lt;/code>的API特性检测实现精准注入。&lt;/p></description></item><item><title>Vite对Vue/React的深度支持</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-19/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-19/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：工具链原理理解、框架级优化实现、模块化工程能力&lt;/p>
&lt;ol>
&lt;li>&lt;strong>SFC编译机制&lt;/strong>：解析Vue单文件组件的构建流程及HMR实现&lt;/li>
&lt;li>&lt;strong>React Fast Refresh集成&lt;/strong>：状态保留热更新与编译体系结合方式&lt;/li>
&lt;li>&lt;strong>ESM动态编译优化&lt;/strong>：按需编译与浏览器原生模块的协同工作&lt;/li>
&lt;li>&lt;strong>插件体系扩展&lt;/strong>：框架特定功能如何通过插件实现（如@vitejs/plugin-vue）&lt;/li>
&lt;li>&lt;strong>生产环境优化&lt;/strong>：开发/生产差异处理（如Rollup打包优化）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vue SFC编译链 &amp;gt; ESM动态加载 &amp;gt; HMR协议 &amp;gt; React Fast Refresh运行时注入&lt;/p>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>&lt;strong>Vue SFC支持&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>通过&lt;code>@vitejs/plugin-vue&lt;/code>插件，使用&lt;code>vue/compiler-sfc&lt;/code>解析&lt;code>.vue&lt;/code>文件&lt;/li>
&lt;li>拆分为&lt;code>&amp;lt;script&amp;gt;&lt;/code>、&lt;code>&amp;lt;template&amp;gt;&lt;/code>、&lt;code>&amp;lt;style&amp;gt;&lt;/code>三个虚拟模块，分别对应不同处理：
&lt;ul>
&lt;li>模板编译为渲染函数（性能优化关键）&lt;/li>
&lt;li>样式通过PostCSS处理并注入CSS-in-JS&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>HMR实现：通过&lt;code>import.meta.hot&lt;/code>API，在文件修改时比对组件树差异，仅更新受影响模块&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>React Fast Refresh&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>依赖&lt;code>@vitejs/plugin-react&lt;/code>插件，内部集成&lt;code>react-refresh/babel&lt;/code>&lt;/li>
&lt;li>Babel转换时自动添加&lt;code>$RefreshReg$&lt;/code>运行时函数，建立组件注册表&lt;/li>
&lt;li>热更新时通过比对组件签名，保留state等运行时状态&lt;/li>
&lt;/ol>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ul>
&lt;li>错误认为Vite仅适用于开发环境（实际生产构建使用Rollup优化）&lt;/li>
&lt;li>混淆HMR与Live Reload（HMR精准更新模块，不刷新页面）&lt;/li>
&lt;li>忽略框架插件必要性（如未配置React插件导致Fast Refresh失效）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过插件架构深度优化框架支持：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Vue SFC处理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>使用&lt;code>@vitejs/plugin-vue&lt;/code>解析&lt;code>.vue&lt;/code>文件，编译模板为高效渲染函数&lt;/li>
&lt;li>样式通过CSS模块化处理，支持Scoped CSS等特性&lt;/li>
&lt;li>HMR时通过虚拟模块差异比对实现局部更新&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>React Fast Refresh&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>@vitejs/plugin-react&lt;/code>在Babel转换阶段注入状态保持逻辑&lt;/li>
&lt;li>通过组件签名校验确保安全的热替换，避免状态丢失&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>核心优化&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>开发环境利用浏览器原生ESM实现按需编译，消除打包瓶颈&lt;/li>
&lt;li>生产构建切换Rollup进行Tree-shaking、代码分割等深度优化&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例vue-sfc处理流程">编码示例（Vue SFC处理流程） &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8bvue-sfc%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="39bb297" class="language-javascript ">
 &lt;code>// vite.config.js
import { defineConfig } from &amp;#39;vite&amp;#39;
import vue from &amp;#39;@vitejs/plugin-vue&amp;#39;

export default defineConfig({
 plugins: [
 vue({
 // 启用响应性语法糖
 reactivityTransform: true 
 })
 ]
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化说明&lt;/strong>：&lt;/p></description></item><item><title>Vite服务端渲染（SSR）实现</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-20/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-20/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察以下核心能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>SSR原理理解&lt;/strong>：是否清晰服务端渲染(SSR)的运行时机制，包括客户端激活(hydration)、双端构建等核心概念&lt;/li>
&lt;li>&lt;strong>Vite生态实践&lt;/strong>：对Vite插件体系及SSR适配方案的配置能力，特别是如何利用ESM特性优化构建&lt;/li>
&lt;li>&lt;strong>同构应用架构&lt;/strong>：能否正确处理双端代码差异，实现共享逻辑与平台特定逻辑的分离&lt;/li>
&lt;li>&lt;strong>构建流程优化&lt;/strong>：是否掌握SSR项目的特殊构建配置（如external配置、产物处理等）&lt;/li>
&lt;/ol>
&lt;p>具体评估点包括：&lt;/p>
&lt;ul>
&lt;li>双入口配置与构建产物管理&lt;/li>
&lt;li>数据预取与状态同步机制&lt;/li>
&lt;li>客户端激活(hydration)的实现原理&lt;/li>
&lt;li>开发模式与生产模式的差异处理&lt;/li>
&lt;li>第三方库的SSR兼容性处理&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite的SSR构建模式 &amp;gt; 客户端/服务端双入口 &amp;gt; 同构路由系统 &amp;gt; 数据预取&lt;/li>
&lt;li>&lt;code>vite-plugin-ssr&lt;/code>的自动注入机制 &amp;gt; Nuxt 3的文件约定路由 &amp;gt; 构建产物分发包&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite SSR通过&lt;code>ssrLoadModule&lt;/code>实现服务端直接加载ES模块，相比传统打包方案具有更快的冷启动速度。构建时分别生成：&lt;/p>
&lt;ul>
&lt;li>客户端包：包含静态资源和水合逻辑&lt;/li>
&lt;li>服务端包：生成可执行的Node.js渲染器&lt;/li>
&lt;/ul>
&lt;p>&lt;code>vite-plugin-ssr&lt;/code>的工作流程：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1be12a4" class="language- ">
 &lt;code>客户端请求
→ Node服务器渲染首屏
→ 返回包含预取数据的HTML
→ 客户端加载JS进行水合
→ 后续交互转为CSR模式&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆&lt;code>hydrate&lt;/code>与&lt;code>render&lt;/code>的使用场景&lt;/li>
&lt;li>未正确处理异步数据导致的客户端闪屏&lt;/li>
&lt;li>服务端构建未external Node内置模块&lt;/li>
&lt;li>开发环境未配置SSR中间件导致HMR失效&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中实现SSR的两种典型方案：&lt;/p>
&lt;p>&lt;strong>方案一：&lt;code>vite-plugin-ssr&lt;/code>&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>安装插件：&lt;code>npm install vite-plugin-ssr&lt;/code>&lt;/li>
&lt;li>配置&lt;code>vite.config.ts&lt;/code>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="00182e0" class="language-javascript ">
 &lt;code>import ssr from &amp;#39;vite-plugin-ssr&amp;#39;

export default {
 plugins: [ssr({
 prerender: true // 启用预渲染
 })]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>创建服务端入口&lt;code>/pages/_default.page.server.js&lt;/code>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="1b45ea8" class="language-javascript ">
 &lt;code>export { render }
import { renderToHtml } from &amp;#39;vite-plugin-ssr&amp;#39;

async function render(pageContext) {
 const appHtml = await renderToHtml(pageContext)
 return { 
 documentHtml: `&amp;lt;div&amp;gt;${appHtml}&amp;lt;/div&amp;gt;`,
 pageContext: { /* 初始状态 */ }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>方案二：Nuxt 3集成&lt;/strong>&lt;/p></description></item><item><title>Vite的TypeScript处理机制</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-21/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-21/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考察以下核心维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：对比Vite与Webpack的底层工作机制差异&lt;/li>
&lt;li>&lt;strong>编译工具链认知&lt;/strong>：掌握esbuild的核心优势及与传统工具链差异&lt;/li>
&lt;li>&lt;strong>开发体验优化&lt;/strong>：理解现代构建工具如何通过架构创新提升开发效率&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite的按需编译机制&lt;/li>
&lt;li>esbuild在转译性能上的突破&lt;/li>
&lt;li>TypeScript处理流程的工程化差异&lt;/li>
&lt;li>工具链配置的简化逻辑&lt;/li>
&lt;/ul>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>ESModule原生支持 &amp;gt; 按需编译 &amp;gt; 冷启动优化 &amp;gt; 类型检查分离&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过浏览器原生ESM实现开发环境秒级启动：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>依赖预构建&lt;/strong>：使用esbuild将CommonJS转换为ESM并缓存&lt;/li>
&lt;li>&lt;strong>源文件处理&lt;/strong>：*.ts文件请求时通过esbuild实时转译为JS（仅移除类型注解）&lt;/li>
&lt;li>&lt;strong>类型安全&lt;/strong>：通过IDE插件/VSCode背景进程独立处理类型检查&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2977823" class="language-text ">
 &lt;code>请求流程示例：
浏览器 -&amp;gt; 请求App.vue -&amp;gt; Vite服务器 -&amp;gt; 识别到包含TS代码 -&amp;gt; 调用esbuild实时编译 -&amp;gt; 返回编译后JS&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为esbuild实现完整TS类型检查（实际仅做语法转换）&lt;/li>
&lt;li>混淆生产构建与开发构建的TS处理方式（生产环境使用Rollup+@rollup/plugin-typescript）&lt;/li>
&lt;li>错误配置ts-loader导致工具链冗余&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过三层架构处理TypeScript：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>开发环境&lt;/strong>：基于esbuild实时转译.ts文件，移除类型注解但不做类型检查，实现毫秒级编译&lt;/li>
&lt;li>&lt;strong>生产构建&lt;/strong>：使用Rollup的TypeScript插件进行完整编译&lt;/li>
&lt;li>&lt;strong>类型安全&lt;/strong>：依赖IDE扩展进行独立类型验证&lt;/li>
&lt;/ol>
&lt;p>相比Webpack的ts-loader方案：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>速度优势&lt;/strong>：esbuild用Go编写，并行编译速度比TS编译器快20-100倍&lt;/li>
&lt;li>&lt;strong>架构优势&lt;/strong>：按需编译避免全量构建，配合浏览器缓存机制减少重复工作
不需要配置ts-loader，Vite已内置ESBuild转换器。但需注意类型检查需通过&lt;code>tsc --noEmit&lt;/code>或IDE工具独立完成。&lt;/li>
&lt;/ul>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="配置示例viteconfigjs">配置示例（vite.config.js） &lt;a href="#%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8bviteconfigjs" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2e08af1" class="language-javascript ">
 &lt;code>export default defineConfig({
 plugins: [
 // 类型检查通过vite-plugin-checker实现
 checker({
 typescript: true // 背景进程类型检查
 })
 ]
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="性能优化">性能优化 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>开发阶段&lt;/strong>：禁用生产环境类型检查（&lt;code>build.typescript: { noEmit: true }&lt;/code>）&lt;/li>
&lt;li>&lt;strong>构建优化&lt;/strong>：对node_modules进行预编译缓存&lt;/li>
&lt;li>&lt;strong>增量更新&lt;/strong>：利用SWC编译器实现HMR加速&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="如何实现tsx的按需编译">如何实现TSX的按需编译？ &lt;a href="#%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0tsx%e7%9a%84%e6%8c%89%e9%9c%80%e7%bc%96%e8%af%91" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>答：通过esbuild的transform API实时转换&lt;/p></description></item><item><title>Vite集成WebAssembly</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-22/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-22/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>工具链掌握&lt;/strong>：对Vite构建工具特性的理解与配置能力&lt;/li>
&lt;li>&lt;strong>WebAssembly集成&lt;/strong>：Wasm模块在现代化工具链中的使用方式&lt;/li>
&lt;li>&lt;strong>异步资源处理&lt;/strong>：掌握浏览器与构建工具中的Wasm加载机制&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Vite对Wasm文件的默认处理机制&lt;/li>
&lt;li>WebAssembly.instantiateStreaming API的正确使用&lt;/li>
&lt;li>构建配置中资源类型的声明方式&lt;/li>
&lt;li>开发环境与生产环境的差异处理&lt;/li>
&lt;li>WASM模块的异步初始化流程&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Vite的WASM支持&lt;/strong>：Vite 4+内置&lt;code>.wasm&lt;/code>文件处理，无需插件&lt;/li>
&lt;li>&lt;strong>实例化机制&lt;/strong>：&lt;code>WebAssembly.instantiateStreaming&lt;/code> &amp;gt; &lt;code>WebAssembly.instantiate&lt;/code>&lt;/li>
&lt;li>&lt;strong>构建配置&lt;/strong>：&lt;code>assetsInclude&lt;/code>声明资源类型&lt;/li>
&lt;li>&lt;strong>模块导入语法&lt;/strong>：通过&lt;code>?init&lt;/code>后缀获取初始化函数&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过转换&lt;code>import wasmModule from 'file.wasm?init'&lt;/code>为封装函数，该函数内部：&lt;/p>
&lt;ol>
&lt;li>发起网络请求获取WASM二进制&lt;/li>
&lt;li>使用&lt;code>WebAssembly.instantiateStreaming&lt;/code>进行流式编译（开发环境）&lt;/li>
&lt;li>生产构建时转换为Base64内联或独立chunk&lt;/li>
&lt;/ol>
&lt;p>开发服务器默认配置&lt;code>application/wasm&lt;/code> MIME类型，确保浏览器正确解析。通过动态&lt;code>import()&lt;/code>实现按需加载，避免阻塞主线程。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>直接使用&lt;code>fetch()&lt;/code>手动加载，忽略Vite的封装优势&lt;/li>
&lt;li>混淆&lt;code>?init&lt;/code>后缀的作用，错误使用默认导入&lt;/li>
&lt;li>未处理SSR场景下的Node.js兼容问题&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中集成WASM模块需三个步骤：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>配置声明&lt;/strong>&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="c276ca3" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 assetsInclude: [&amp;#39;**/*.wasm&amp;#39;] // 确保WASM文件被识别为资源
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>&lt;strong>模块导入&lt;/strong>&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="02b8b01" class="language-javascript ">
 &lt;code>// 带初始化函数的导入语法
import initWasm from &amp;#39;/src/lib/math.wasm?init&amp;#39;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>&lt;strong>异步初始化&lt;/strong>&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="2fbc81a" class="language-javascript ">
 &lt;code>const { exports } = await initWasm({
 // 可传递内存等导入对象
 imports: { 
 importedFunc: () =&amp;gt; console.log(&amp;#39;Callback from JS&amp;#39;)
 }
})

// 调用WASM导出方法
exports.add(2, 3) &lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9d8b2a2" class="language-javascript ">
 &lt;code>// utils/wasm-loader.js
export const loadWasm = async (url, imports = {}) =&amp;gt; {
 try {
 const init = await import(/* @vite-ignore */ `${url}?init`)
 const { instance } = await init.default({
 imports: {
 env: {
 memory: new WebAssembly.Memory({ initial: 256 }),
 ...imports
 }
 }
 })
 return instance.exports
 } catch ((e) {
 console.error(&amp;#39;WASM加载失败:&amp;#39;, e)
 throw new Error(&amp;#39;WASM模块初始化异常&amp;#39;)
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>性能优化&lt;/strong>：预加载关键WASM模块加速首屏&lt;/li>
&lt;li>&lt;strong>兼容方案&lt;/strong>：低端设备降级为纯JS实现&lt;/li>
&lt;li>&lt;strong>内存管理&lt;/strong>：监控WebAssembly.Memory使用情况&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="如何实现wasm模块的热更新">如何实现WASM模块的热更新？ &lt;a href="#%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0wasm%e6%a8%a1%e5%9d%97%e7%9a%84%e7%83%ad%e6%9b%b4%e6%96%b0" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>通过&lt;code>import.meta.hot&lt;/code>监听模块变化，重新初始化实例&lt;/li>
&lt;/ul>
&lt;h3 id="ssr场景如何处理">SSR场景如何处理？ &lt;a href="#ssr%e5%9c%ba%e6%99%af%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>使用&lt;code>typeof window&lt;/code>判断环境，服务端跳过WASM加载&lt;/li>
&lt;/ul>
&lt;h3 id="如何调试wasm">如何调试WASM？ &lt;a href="#%e5%a6%82%e4%bd%95%e8%b0%83%e8%af%95wasm" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>使用Chrome DevTools的WASM调试标签页&lt;/li>
&lt;li>编译时保留DWARF调试信息&lt;/li>
&lt;/ul></description></item><item><title>Vite调试独立文件的方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-23/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-23/</guid><description>&lt;h2 id="回答">回答 &lt;a href="#%e5%9b%9e%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>该问题主要考察候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：Vite核心工作机制与传统打包工具差异&lt;/li>
&lt;li>&lt;strong>模块热替换(HMR)机制&lt;/strong>：动态更新策略与实现原理&lt;/li>
&lt;li>&lt;strong>开发环境优化实践&lt;/strong>：如何利用现代浏览器特性提升开发体验&lt;/li>
&lt;li>&lt;strong>调试技巧掌握&lt;/strong>：Vite调试配置与问题定位能力&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>ESM动态加载与按需编译原理&lt;/li>
&lt;li>文件监听与HMR工作流程&lt;/li>
&lt;li>模块依赖图维护策略&lt;/li>
&lt;li>浏览器通信机制（WebSocket）&lt;/li>
&lt;li>缓存策略与增量更新&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>&lt;strong>ESM动态加载&lt;/strong> &amp;gt; &lt;strong>模块热替换&lt;/strong> &amp;gt; &lt;strong>文件监听&lt;/strong>&lt;/li>
&lt;li>&lt;strong>依赖图维护&lt;/strong> &amp;gt; &lt;strong>增量编译&lt;/strong> &amp;gt; &lt;strong>通信机制&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>Vite通过以下机制实现高效调试：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>按需编译&lt;/strong>：启动时创建模块依赖图，浏览器通过&lt;code>&amp;lt;script type=&amp;quot;module&amp;quot;&amp;gt;&lt;/code>按需请求源码&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>文件监听&lt;/strong>：开发服务器使用chokidar监听文件变动，建立文件路径到模块的映射关系&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>增量编译&lt;/strong>：变更文件触发即时编译，仅处理受影响模块（时间复杂度O(1)）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>HMR协议&lt;/strong>：通过WebSocket推送更新消息，格式示例：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="d56c854" class="language-javascript ">
 &lt;code>{
 type: &amp;#39;update&amp;#39;,
 updates: [
 {
 type: &amp;#39;js-update&amp;#39;,
 path: &amp;#39;/src/App.vue&amp;#39;,
 timestamp: 1629823456
 }
 ]
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>浏览器处理&lt;/strong>：通过&lt;code>import.meta.hot&lt;/code>API实现局部模块热替换&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>错误认为HMR需要手动配置（Vite默认集成）&lt;/li>
&lt;li>混淆完整刷新与局部更新边界条件&lt;/li>
&lt;li>忽略CSS模块的特殊处理逻辑&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>在Vite项目中调试单个文件无需重建整个项目，其核心机制是：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>按需编译&lt;/strong>：开发服务器基于浏览器ESM请求实时编译单个文件&lt;/li>
&lt;li>&lt;strong>精准HMR&lt;/strong>：文件修改触发依赖图分析，仅重新编译变更模块及其依赖链&lt;/li>
&lt;li>&lt;strong>增量通信&lt;/strong>：通过WebSocket推送最小变更集，浏览器执行热替换&lt;/li>
&lt;/ol>
&lt;p>开发服务器实时更新流程：&lt;/p>
&lt;ol>
&lt;li>文件监听器检测到修改事件&lt;/li>
&lt;li>确定受影响模块及其依赖边界&lt;/li>
&lt;li>增量编译生成更新内容&lt;/li>
&lt;li>通过HMR API推送变更通知&lt;/li>
&lt;li>客户端执行动态模块替换（保留应用状态）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="调试配置示例">调试配置示例 &lt;a href="#%e8%b0%83%e8%af%95%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="df6a9e5" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 server: {
 watch: {
 // 优化监听性能
 usePolling: true,
 interval: 100
 }
 },
 build: {
 // 关闭生产模式代码混淆方便调试
 minify: false
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h4 id="优化策略">优化策略 &lt;a href="#%e4%bc%98%e5%8c%96%e7%ad%96%e7%95%a5" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>&lt;strong>缓存复用&lt;/strong>：对&lt;code>node_modules&lt;/code>使用强缓存（Status Code 304）&lt;/li>
&lt;li>&lt;strong>增量构建&lt;/strong>：采用Rollup的增量编译算法&lt;/li>
&lt;li>&lt;strong>请求合并&lt;/strong>：模块请求批处理降低网络开销&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>HMR失效场景如何处理？&lt;/strong>&lt;/p></description></item><item><title>Vite启动与构建性能优化</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-24/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-24/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>构建工具原理掌握（Vite工作机制理解）&lt;/li>
&lt;li>性能优化策略实施能力（缓存/pgk拆分/代码分析）&lt;/li>
&lt;li>工程化配置经验（插件系统/依赖管理）&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>预构建依赖机制及二次启动优化&lt;/li>
&lt;li>浏览器缓存与文件系统缓存的差异应用&lt;/li>
&lt;li>插件对构建流程的性能影响评估&lt;/li>
&lt;li>代码分割策略与Tree-shaking实现&lt;/li>
&lt;li>现代化构建工具链组合使用（esbuild/Rollup）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>预构建优化 &amp;gt; 缓存策略 &amp;gt; 插件精简 &amp;gt; 构建工具链调优&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>预构建依赖&lt;/strong>：
Vite通过esbuild将CommonJS模块转换为ESM格式，合并分散的模块请求（lodash类库）。首次启动扫描&lt;code>node_modules&lt;/code>生成缓存文件（_metadata.json），二次启动时通过&lt;code>optimizeDeps.force&lt;/code>控制重建条件。预构建产物存储在&lt;code>node_modules/.vite&lt;/code>目录。&lt;/p>
&lt;p>&lt;strong>缓存策略&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>浏览器缓存：通过HTTP头&lt;code>Cache-Control: max-age=31536000,immutable&lt;/code>缓存预构建资源&lt;/li>
&lt;li>文件系统缓存：&lt;code>build.cacheDir&lt;/code>配置项控制构建缓存目录（默认&lt;code>node_modules/.vite&lt;/code>）&lt;/li>
&lt;li>哈希校验：文件内容哈希值变更时自动失效旧缓存&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>插件优化&lt;/strong>：
每个插件都会增加Rollup构建钩子处理耗时，特别是transform阶段的AST操作。官方插件经过性能优化，第三方插件可能包含冗余操作。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误关闭预构建导致瀑布式请求&lt;/li>
&lt;li>缓存目录误设为易失性存储介质（如Docker临时容器）&lt;/li>
&lt;li>混合使用不同包管理器（pnpm/npm）导致缓存失效&lt;/li>
&lt;li>过度依赖全量构建插件（如babel-plugin-import）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>优化Vite性能可从三个层面切入：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>预构建调优&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>使用&lt;code>optimizeDeps.include&lt;/code>预加载动态导入的依赖&lt;/li>
&lt;li>配置&lt;code>optimizeDeps.exclude&lt;/code>避免重复构建&lt;/li>
&lt;li>添加&lt;code>npm run dev --force&lt;/code>强制刷新依赖图谱&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>缓存策略&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>部署服务器配置immutable资源长期缓存&lt;/li>
&lt;li>保持&lt;code>package.json&lt;/code>中dependencies结构稳定&lt;/li>
&lt;li>复用CI/CD中的.vite目录作为构建缓存&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>插件精简&lt;/strong>：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>使用&lt;code>vite-plugin-inspect&lt;/code>分析插件耗时&lt;/li>
&lt;li>优先使用Vite原生支持的配置项替代插件&lt;/li>
&lt;li>非生产环境禁用SSR相关插件&lt;/li>
&lt;/ul>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="a1ca4ab" class="language-javascript ">
 &lt;code>// vite.config.js 优化示例
export default defineConfig({
 optimizeDeps: {
 include: [&amp;#39;lodash-es/debounce&amp;#39;], // 显式包含深层次依赖
 exclude: [&amp;#39;vue-demi&amp;#39;] // 排除已兼容的库
 },
 build: {
 cacheDir: &amp;#39;./.vite&amp;#39;, // 自定义缓存目录
 rollupOptions: {
 output: {
 manualChunks: (id) =&amp;gt; { // 代码分割优化
 if (id.includes(&amp;#39;node_modules&amp;#39;)) return &amp;#39;vendor&amp;#39;
 }
 }
 }
 },
 plugins: [ /* 仅保留必要插件 */ ]
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码优化">编码优化 &lt;a href="#%e7%bc%96%e7%a0%81%e4%bc%98%e5%8c%96" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7387796" class="language-javascript ">
 &lt;code>// 动态加载非关键依赖
const heavyModule = () =&amp;gt; import(&amp;#39;./heavy&amp;#39;)

// 使用现代语法避免转译开销
&amp;lt;script setup&amp;gt;...&amp;lt;/script&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="扩展性建议">扩展性建议 &lt;a href="#%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>超大仓库&lt;/strong>：采用&lt;code>--force&lt;/code>预构建+分布式缓存（如Bazel远程缓存）&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：设置&lt;code>build: { minify: 'esbuild' }&lt;/code>加速压缩&lt;/li>
&lt;li>&lt;strong>CI环境&lt;/strong>：缓存&lt;code>.vite&lt;/code>目录并设置&lt;code>NODE_ENV=production&lt;/code>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>&lt;strong>如何定位构建性能瓶颈&lt;/strong>？&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>使用&lt;code>vite-plugin-inspect&lt;/code>分析模块耗时分布&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>esbuild与Rollup的优化取舍&lt;/strong>？&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>esbuild负责预构建（约快10x），Rollup处理最终打包&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>动态导入对构建的影响&lt;/strong>？&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>合理分割可提升首屏加载，但过度使用会增加chunk请求&lt;/li>
&lt;/ul></description></item><item><title>Vite构建性能分析工具</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-25/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-25/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;strong>核心能力维度&lt;/strong>：构建工具深度使用、性能优化能力、插件扩展机制理解&lt;/li>
&lt;li>技术评估点：
&lt;ol>
&lt;li>Vite插件系统集成能力（rollup插件与vite插件区别）&lt;/li>
&lt;li>构建分析工具配置熟练度（环境变量控制、报表生成方式）&lt;/li>
&lt;li>包体积优化方法论（代码分割策略、依赖分析能力）&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>现代构建工具工作原理理解（Rollup与Vite的协作机制）&lt;/li>
&lt;li>可视化分析工具使用场景认知（Treemap解读、性能瓶颈定位）&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Rollup可视化分析 &amp;gt; Vite插件机制 &amp;gt; 构建环境配置 &amp;gt; 包体积优化策略&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite生产构建基于Rollup，通过集成&lt;code>rollup-plugin-visualizer&lt;/code>实现包分析。该插件在构建结束后生成交互式Treemap图，展示各模块体积占比。配置时需要区分开发/生产环境，通常通过环境变量控制插件加载。&lt;/p>
&lt;p>典型配置流程：&lt;/p>
&lt;ol>
&lt;li>安装分析插件（如rollup-plugin-visualizer）&lt;/li>
&lt;li>创建Vite环境变量（如&lt;code>ANALYZE=true&lt;/code>）&lt;/li>
&lt;li>条件式加载插件配置&lt;/li>
&lt;li>执行构建命令生成报表&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>错误使用webpack系分析工具导致兼容问题&lt;/li>
&lt;li>未处理SSR场景下的双重打包分析&lt;/li>
&lt;li>忽略gzip压缩后的体积显示配置&lt;/li>
&lt;li>将开发环境与生产构建分析混淆&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>使用&lt;code>rollup-plugin-visualizer&lt;/code>分析Vite构建性能的步骤如下：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>安装插件&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="e3454cc" class="language-bash ">
 &lt;code>npm install --save-dev rollup-plugin-visualizer&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="2">
&lt;li>&lt;strong>配置vite.config.js&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="b807789" class="language-javascript ">
 &lt;code>import { defineConfig } from &amp;#39;vite&amp;#39;
import visualizer from &amp;#39;rollup-plugin-visualizer&amp;#39;

export default defineConfig({
 build: {
 rollupOptions: {
 plugins: [
 // 根据环境变量控制插件加载
 process.env.ANALYZE &amp;amp;&amp;amp; visualizer({
 open: true,
 filename: &amp;#39;stats.html&amp;#39;,
 gzipSize: true,
 brotliSize: true
 })
 ].filter(Boolean)
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="3">
&lt;li>&lt;strong>添加NPM脚本&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ffcde70" class="language-json ">
 &lt;code>{
 &amp;#34;scripts&amp;#34;: {
 &amp;#34;build:analyze&amp;#34;: &amp;#34;ANALYZE=true vite build&amp;#34;
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;ol start="4">
&lt;li>&lt;strong>执行分析构建&lt;/strong>：&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="f451d61" class="language-bash ">
 &lt;code>npm run build:analyze&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>执行后自动生成&lt;code>stats.html&lt;/code>并打开浏览器展示模块体积分布图，通过色块大小直观识别大依赖。&lt;/p></description></item><item><title>Vite持久化缓存机制</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-26/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-26/</guid><description>&lt;h2 id="回答要求">回答要求 &lt;a href="#%e5%9b%9e%e7%ad%94%e8%a6%81%e6%b1%82" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>此问题主要考察候选人对现代前端构建工具原理的掌握程度及性能优化思维，核心围绕以下维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具机制理解&lt;/strong>：Vite核心特性与Webpack等传统工具的本质差异&lt;/li>
&lt;li>&lt;strong>缓存策略应用&lt;/strong>：持久化缓存的实现原理与工程化价值&lt;/li>
&lt;li>&lt;strong>调试能力&lt;/strong>：命令行参数对构建流程的影响及实际场景应用&lt;/li>
&lt;li>&lt;strong>包管理认知&lt;/strong>：依赖版本锁定与构建缓存的关联性&lt;/li>
&lt;/ol>
&lt;p>技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite依赖预构建（Dependency Pre-Bundling）机制&lt;/li>
&lt;li>文件指纹比对策略（如内容哈希）&lt;/li>
&lt;li>冷启动与热启动的性能差异原理&lt;/li>
&lt;li>强制构建的场景识别与使用方法&lt;/li>
&lt;/ul>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>依赖预构建 &amp;gt; 2. 文件系统缓存 &amp;gt; 3. 哈希校验 &amp;gt; 4. 构建流程控制&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>Vite的&lt;code>.vite&lt;/code>目录存储了以下缓存资产：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>预构建依赖&lt;/strong>：通过esbuild将CommonJS模块转换为ESM格式并打包，存储于&lt;code>_deps&lt;/code>子目录&lt;/li>
&lt;li>&lt;strong>源码转换结果&lt;/strong>：JSX/TS/Vue单文件组件等资源的编译结果&lt;/li>
&lt;li>&lt;strong>强缓存文件&lt;/strong>：基于文件内容生成的哈希标识，如&lt;code>__vite_package_version__&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>二次构建时通过以下机制提升速度：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="80949b3" class="language-text ">
 &lt;code>1. 检查package.json的dependencies版本
2. 比对文件哈希值（使用fs.stat的mtimeMs优化性能）
3. 匹配缓存标识的依赖图谱
4. 跳过未变更模块的重复构建&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ul>
&lt;li>误认为所有node_modules依赖都会被缓存（实际上仅预构建声明的dependencies）&lt;/li>
&lt;li>混淆开发模式HMR与生产构建缓存的差异&lt;/li>
&lt;li>错误使用&amp;ndash;force导致CI/CD环境构建性能下降&lt;/li>
&lt;/ul>
&lt;h3 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过&lt;code>.vite&lt;/code>目录实现持久化缓存，主要存储预构建依赖包和已编译资源。二次构建时跳过未变更模块的AST解析、依赖分析等耗时操作，通过比对文件哈希和依赖版本快速复用缓存，可提升50%-70%构建速度。使用&lt;code>vite build --force&lt;/code>或&lt;code>vite optimize --force&lt;/code>可强制清除缓存并重新构建，常用于依赖项源码变更但版本未更新、缓存损坏等场景。&lt;/p>
&lt;h3 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="缓存验证逻辑示例">缓存验证逻辑示例 &lt;a href="#%e7%bc%93%e5%ad%98%e9%aa%8c%e8%af%81%e9%80%bb%e8%be%91%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="0e5c6db" class="language-javascript ">
 &lt;code>// 伪代码：Vite缓存校验逻辑
function shouldUseCache(dependenciesChanged() // 检查package.json依赖版本
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h4 id="性能优化建议">性能优化建议 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>将&lt;code>.vite&lt;/code>目录加入Docker镜像层缓存&lt;/li>
&lt;li>CI环境中通过缓存卷复用node_modules和.vite&lt;/li>
&lt;li>使用&lt;code>vite-plugin-package-config&lt;/code>锁定依赖版本&lt;/li>
&lt;/ol>
&lt;h3 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>
&lt;p>如何验证特定文件是否命中缓存？&lt;/p></description></item><item><title>Vite包体积优化策略</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-27/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-27/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：工程化构建能力、模块化理解、性能优化意识&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Tree Shaking机制&lt;/strong>：考核对ES Module静态分析原理及Dead Code Elimination的掌握&lt;/li>
&lt;li>&lt;strong>代码分割策略&lt;/strong>：理解动态导入语法与构建产物分块逻辑的关系&lt;/li>
&lt;li>&lt;strong>按需加载实现&lt;/strong>：考察组件/模块级别的精准加载能力及插件体系运用&lt;/li>
&lt;li>&lt;strong>Vite特性认知&lt;/strong>：区别于Webpack的优化手段，如基于ESBuild的预打包优化&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Tree Shaking &amp;gt; 代码分割 &amp;gt; 按需加载 &amp;gt; 预编译依赖 &amp;gt; 资源压缩&lt;/p>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Tree Shaking&lt;/strong>&lt;br>
基于ES Module的静态结构分析，Vite在构建阶段通过&lt;code>ESBuild&lt;/code>/&lt;code>Rollup&lt;/code>进行模块依赖图谱分析，通过&lt;code>import/export&lt;/code>路径追踪，标记未使用的export并移除。需注意&lt;code>sideEffects&lt;/code>配置防止误删有副作用的模块。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>代码分割&lt;/strong>&lt;br>
通过动态&lt;code>import()&lt;/code>语法触发代码分割点，Vite的Rollup配置会将异步模块拆分为独立chunk。浏览器级缓存优化：修改业务代码不影响第三方库chunk的hash值。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>按需加载&lt;/strong>&lt;br>
组件库级别通过babel插件转换命名导入为路径导入（如&lt;code>import { Button } from 'antd'&lt;/code>转换为&lt;code>import Button from 'antd/es/button'&lt;/code>），搭配&lt;code>unplugin-auto-import&lt;/code>实现自动按需加载。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ul>
&lt;li>误以为CommonJS模块可Tree Shaking&lt;/li>
&lt;li>动态导入过多导致HTTP/2多路复用优势被抵消&lt;/li>
&lt;li>第三方库未提供ES版本导致Tree Shaking失效&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite项目包体积优化的三种核心策略：&lt;/p>
&lt;p>&lt;strong>1. Tree Shaking&lt;/strong>&lt;br>
基于ES Module静态分析，构建时移除未使用的export代码。需确保依赖库提供ES版本，配置&lt;code>sideEffects: false&lt;/code>或指定文件白名单。&lt;/p>
&lt;p>&lt;strong>2. 代码分割&lt;/strong>&lt;br>
使用动态&lt;code>import()&lt;/code>语法实现路由级/组件级分割，Vite通过Rollup自动生成独立chunk。可通过配置&lt;code>build.rollupOptions.output.manualChunks&lt;/code>细化分割策略。&lt;/p>
&lt;p>&lt;strong>3. 按需加载&lt;/strong>&lt;br>
对组件库使用&lt;code>unplugin-vue-components&lt;/code>等插件自动转换全量引入为路径引入。配合&lt;code>vite-plugin-style-import&lt;/code>实现样式文件按需加载。&lt;/p>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="99b4a25" class="language-javascript ">
 &lt;code>// vite.config.js
import autoImport from &amp;#39;unplugin-auto-import/vite&amp;#39;

export default defineConfig({
 plugins: [
 autoImport({
 imports: [&amp;#39;vue&amp;#39;, &amp;#39;vue-router&amp;#39;],
 dts: true // 自动生成类型声明
 })
 ],
 build: {
 rollupOptions: {
 output: {
 manualChunks: {
 lodash: [&amp;#39;lodash-es&amp;#39;],
 ui: [&amp;#39;antd&amp;#39;]
 }
 }
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化策略">优化策略 &lt;a href="#%e4%bc%98%e5%8c%96%e7%ad%96%e7%95%a5" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>复杂度控制&lt;/strong>：通过&lt;code>rollup-plugin-visualizer&lt;/code>分析chunk占比，合并碎片化模块&lt;/li>
&lt;li>&lt;strong>缓存策略&lt;/strong>：分离稳定依赖为单独chunk，利用长效缓存&lt;/li>
&lt;li>&lt;strong>服务端配合&lt;/strong>：开启Brotli压缩，头配置&lt;code>Content-Encoding: br&lt;/code>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何检测未使用的代码？&lt;/strong>&lt;br>
使用&lt;code>@vue/compiler-sfc&lt;/code>分析模板中实际使用的组件&lt;/p></description></item><item><title>Vite生产环境优化配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-28/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-28/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考察候选人对以下维度的掌握：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理&lt;/strong>：Vite底层Rollup构建机制与生产优化关联性&lt;/li>
&lt;li>&lt;strong>工程化能力&lt;/strong>：CDN部署、资源压缩、分包策略等生产环境必备配置&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：首屏加载优化、缓存策略、现代浏览器特性利用&lt;/li>
&lt;/ol>
&lt;p>具体评估点：&lt;/p>
&lt;ul>
&lt;li>基础路径配置与CDN资源定位&lt;/li>
&lt;li>代码压缩算法选择（ESBuild vs Terser）&lt;/li>
&lt;li>静态资源处理策略（文件名哈希、体积阈值）&lt;/li>
&lt;li>代码分割与异步加载优化&lt;/li>
&lt;li>预渲染/预加载机制配置&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>构建基础配置 &amp;gt; 资源压缩 &amp;gt; 代码分割 &amp;gt; 预加载优化 &amp;gt; 部署适配&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite生产构建基于Rollup，通过&lt;code>build&lt;/code>配置项控制：&lt;/p>
&lt;ul>
&lt;li>&lt;code>base&lt;/code>：设置部署基础路径，确保CDN资源路径正确解析（如&lt;code>&amp;lt;script src=&amp;quot;/assets/index.123abc.js&amp;quot;&amp;gt;&lt;/code>）&lt;/li>
&lt;li>&lt;code>build.minify&lt;/code>：使用ESBuild（默认）进行快速压缩，或切换Terser保证更好兼容性&lt;/li>
&lt;li>&lt;code>build.rollupOptions.output&lt;/code>：配置chunk拆分策略，结合动态导入实现按需加载&lt;/li>
&lt;li>&lt;code>build.assetsInlineLimit&lt;/code>：控制资源内联阈值，小文件转base64减少请求&lt;/li>
&lt;/ul>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误将开发环境配置带入生产（如未关闭sourcemap）&lt;/li>
&lt;li>忽略现代浏览器特性配置（如build.target设置）&lt;/li>
&lt;li>压缩配置与兼容性需求不匹配（如ESBuild不处理ES5语法）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>典型Vite生产优化配置方案应包含：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>部署适配&lt;/strong>：通过&lt;code>base&lt;/code>指定CDN根路径，&lt;code>build.assetsDir&lt;/code>规范资源目录结构&lt;/li>
&lt;li>&lt;strong>代码压缩&lt;/strong>：启用&lt;code>build.minify&lt;/code>（默认ESBuild），需要ES5兼容时改用terser&lt;/li>
&lt;li>&lt;strong>资源优化&lt;/strong>：配置&lt;code>build.assetsInlineLimit&lt;/code>（默认4KB）控制内联阈值&lt;/li>
&lt;li>&lt;strong>代码分割&lt;/strong>：在&lt;code>build.rollupOptions&lt;/code>中设置manualChunks拆分策略&lt;/li>
&lt;li>&lt;strong>预加载优化&lt;/strong>：使用&lt;code>build.modulePreload&lt;/code>配置资源预加载策略&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="cb53b4e" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 base: &amp;#39;https://cdn.example.com/project/&amp;#39;, // CDN基础路径
 build: {
 minify: &amp;#39;terser&amp;#39;, // 需要ES5兼容时切换
 sourcemap: true, // 按需开启
 assetsInlineLimit: 4096, // 4KB以下资源内联
 rollupOptions: {
 output: {
 manualChunks: {
 react: [&amp;#39;react&amp;#39;, &amp;#39;react-dom&amp;#39;], // 拆分第三方库
 utils: [&amp;#39;lodash-es&amp;#39;, &amp;#39;axios&amp;#39;]
 },
 chunkFileNames: &amp;#39;js/[name].[hash].js&amp;#39;,
 assetFileNames: &amp;#39;assets/[name].[hash][extname]&amp;#39;
 }
 },
 terserOptions: {
 compress: {
 drop_console: true // 移除console
 }
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>大流量场景&lt;/strong>：结合&lt;code>build.reportCompressedSize&lt;/code>分析包体积，启用HTTP/2 Server Push&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：配置&lt;code>build.target: 'es2015'&lt;/code>，增加@vitejs/plugin-legacy处理polyfill&lt;/li>
&lt;li>&lt;strong>增量更新&lt;/strong>：使用&lt;code>build.cssCodeSplit&lt;/code>保持CSS模块化，配合持久化缓存&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="可能追问1如何实现路由级按需加载">可能追问1：如何实现路由级按需加载？ &lt;a href="#%e5%8f%af%e8%83%bd%e8%bf%bd%e9%97%ae1%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e8%b7%af%e7%94%b1%e7%ba%a7%e6%8c%89%e9%9c%80%e5%8a%a0%e8%bd%bd" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>提示&lt;/strong>：使用动态导入&lt;code>() =&amp;gt; import()&lt;/code>语法，配合路由懒加载实现代码分割&lt;/p></description></item><item><title>Vite与Webpack/Rollup对比</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-29/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-29/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人对现代构建工具原理及工程化能力的理解，核心评估维度包括：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>模块化构建原理&lt;/strong>：ES Modules原生支持与打包机制差异&lt;/li>
&lt;li>&lt;strong>开发体验优化&lt;/strong>：冷启动速度/HMR效率/调试友好性&lt;/li>
&lt;li>&lt;strong>生态适配能力&lt;/strong>：插件系统设计/历史项目兼容性&lt;/li>
&lt;li>&lt;strong>工程场景判断&lt;/strong>：SPA/Library/多页应用的适用场景选择&lt;/li>
&lt;/ol>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点优先级">关键知识点优先级 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9%e4%bc%98%e5%85%88%e7%ba%a7" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>浏览器原生ESM &amp;gt; 打包器架构设计 &amp;gt; 增量编译机制 &amp;gt; Tree-shaking实现&lt;/p>
&lt;h3 id="核心机制对比">核心机制对比 &lt;a href="#%e6%a0%b8%e5%bf%83%e6%9c%ba%e5%88%b6%e5%af%b9%e6%af%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>Vite&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>开发环境基于浏览器原生ESM实现按需编译（无需打包）&lt;/li>
&lt;li>生产构建使用Rollup，通过预编译优化输出&lt;/li>
&lt;li>热更新基于ESM动态导入，实现毫秒级响应&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Webpack&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>基于静态分析构建依赖图谱，全量打包&lt;/li>
&lt;li>通过HMR Runtime实现模块热替换&lt;/li>
&lt;li>支持代码分割/ynamic import等复杂场景&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Rollup&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>基于ESM标准的静态分析打包器&lt;/li>
&lt;li>通过Tree-shaking生成更精简的库文件&lt;/li>
&lt;li>支持输出多种模块格式（ESM/CommonJS/UMD）&lt;/li>
&lt;/ul>
&lt;h3 id="典型误解">典型误解 &lt;a href="#%e5%85%b8%e5%9e%8b%e8%af%af%e8%a7%a3" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为Vite生产构建性能优于Webpack（实际与Rollup相当）&lt;/li>
&lt;li>混淆Rollup的Tree-shaking与Webpack的实现差异&lt;/li>
&lt;li>低估Webpack在处理复杂资源类型（如CSS Modules）时的优势&lt;/li>
&lt;/ol>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>从四个维度对比：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>开发体验&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Vite：冷启动秒级响应，基于浏览器ESM实现按需编译。模块热替换延迟&amp;lt;50ms&lt;/li>
&lt;li>Webpack：启动速度随项目规模线性增长，HMR需要重建部分bundle&lt;/li>
&lt;li>Rollup：专注生产构建，开发体验需配合其他工具&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>构建速度&lt;/strong>：&lt;/p>
&lt;pre class="mermaid">graph TD
开发环境速度--&amp;gt;Vite:毫秒级
开发环境速度--&amp;gt;Webpack:10秒&amp;#43; for大型项目
生产构建速度--&amp;gt;Rollup≈Vite&amp;gt;Webpack
&lt;/pre>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>插件生态&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Webpack：3000+官方认证插件，支持复杂工程需求&lt;/li>
&lt;li>Rollup：专注ESM打包，插件数量约500+&lt;/li>
&lt;li>Vite：兼容Rollup插件体系，核心插件覆盖主流框架&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>适用场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>Vite：SPA/现代浏览器优先项目/快速原型开发&lt;/li>
&lt;li>Webpack：企业级应用/遗留系统维护/多类型资源打包&lt;/li>
&lt;li>Rollup：npm库开发/生成严格符合ESM规范的包&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="解决方案示例">解决方案示例 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="库打包配置rollup">库打包配置（Rollup） &lt;a href="#%e5%ba%93%e6%89%93%e5%8c%85%e9%85%8d%e7%bd%aerollup" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="887262d" class="language-javascript ">
 &lt;code>// rollup.config.js
import { terser } from &amp;#39;rollup-plugin-terser&amp;#39;;

export default {
 input: &amp;#39;src/index.js&amp;#39;,
 output: [{
 file: &amp;#39;dist/bundle.esm.js&amp;#39;,
 format: &amp;#39;esm&amp;#39;
 }],
 plugins: [
 terser() // 代码压缩优化
 ]
 // 通过external排除peerDependencies
 external: [&amp;#39;react&amp;#39;] 
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="性能优化建议">性能优化建议 &lt;a href="#%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite项目开启依赖预构建（optimizeDeps）&lt;/li>
&lt;li>Webpack使用cache-loader进行构建缓存&lt;/li>
&lt;li>大型库打包使用Rollup的代码分割（experimental）&lt;/li>
&lt;/ol>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何选择Vite插件的开发策略？&lt;/strong>&lt;/p></description></item><item><title>Vite对CommonJS模块的支持</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-30/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-30/</guid><description>&lt;h2 id="回答">回答 &lt;a href="#%e5%9b%9e%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>本题主要考察以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具原理理解&lt;/strong>：Vite底层工作机制与模块化处理能力&lt;/li>
&lt;li>&lt;strong>模块规范差异处理&lt;/strong>：CommonJS与ES Modules的互操作机制&lt;/li>
&lt;li>&lt;strong>工程化配置实践&lt;/strong>：预构建流程的实际应用与优化策略&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>Vite预构建阶段的核心作用&lt;/li>
&lt;li>CJS转ESM的底层实现原理&lt;/li>
&lt;li>依赖解析与路径优化机制&lt;/li>
&lt;li>动态导入语句的转换处理&lt;/li>
&lt;li>兼容性问题的解决方案&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;h4 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>&lt;strong>预构建机制（Pre-Bundling）&lt;/strong>&lt;/li>
&lt;li>&lt;strong>ESBuild转换器（CJS to ESM）&lt;/strong>&lt;/li>
&lt;li>&lt;strong>模块缓存策略（node_modules/.vite）&lt;/strong>&lt;/li>
&lt;li>&lt;strong>依赖扫描算法&lt;/strong>&lt;/li>
&lt;li>&lt;strong>浏览器兼容处理&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h4 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;p>Vite通过两阶段构建解决CJS兼容问题：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>依赖扫描阶段&lt;/strong>：通过静态分析&lt;code>require/import&lt;/code>语句，识别所有CJS模块依赖&lt;/li>
&lt;li>&lt;strong>ESBuild转换&lt;/strong>：将CJS模块转换为包含命名导出的ESM格式，处理流程包含：
&lt;ul>
&lt;li>替换&lt;code>module.exports&lt;/code>为&lt;code>export default&lt;/code>&lt;/li>
&lt;li>将&lt;code>require()&lt;/code>转换为动态&lt;code>import()&lt;/code>&lt;/li>
&lt;li>注入&lt;code>__esModule&lt;/code>兼容标记&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>合并依赖&lt;/strong>：将分散的模块合并为单个文件，优化HTTP请求&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="566c3ed" class="language-javascript ">
 &lt;code>// 转换前（CJS）
const lodash = require(&amp;#39;lodash&amp;#39;);
module.exports = { sum: (a,b) =&amp;gt; a&amp;#43;b }

// 转换后（ESM）
import lodash from &amp;#39;lodash&amp;#39;;
const _export = { sum: (a,b) =&amp;gt; a&amp;#43;b };
export default _export;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h4 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h4>&lt;ol>
&lt;li>误认为浏览器原生支持CJS模块&lt;/li>
&lt;li>混淆预构建与生产构建的差异&lt;/li>
&lt;li>忽略动态&lt;code>require&lt;/code>的特殊处理&lt;/li>
&lt;li>未正确配置&lt;code>optimizeDeps.include&lt;/code>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过预构建机制支持CommonJS模块，具体流程如下：&lt;/p></description></item><item><title>Vite插件生态与Rollup兼容性</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-31/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-31/</guid><description>&lt;h2 id="二考察点分析">二、考察点分析 &lt;a href="#%e4%ba%8c%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：构建工具原理理解、插件系统适配能力、框架生态实践能力&lt;br>
&lt;strong>技术评估点&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>Vite插件体系与Rollup的继承关系&lt;/li>
&lt;li>&lt;code>rollupOptions&lt;/code>配置项的正确使用场景&lt;/li>
&lt;li>专属插件对Vite特有功能（如HMR、预构建）的支持方式&lt;/li>
&lt;li>通用Rollup插件在开发/生产模式下的兼容差异&lt;/li>
&lt;li>插件执行顺序控制策略&lt;/li>
&lt;/ol>
&lt;h2 id="三技术解析">三、技术解析 &lt;a href="#%e4%b8%89%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite插件API &amp;gt; Rollup插件规范 &amp;gt; 构建生命周期差异&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite基于Rollup核心实现构建能力，通过扩展Rollup插件接口形成自己的插件系统。关键技术差异点：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>双模式差异&lt;/strong>：开发模式使用Koa中间件架构，生产打包复用Rollup&lt;/li>
&lt;li>&lt;strong>插件结构&lt;/strong>：Vite插件需实现&lt;code>enforce: 'pre'|'post'&lt;/code>控制执行顺序，并支持&lt;code>apply: 'build'|'serve'&lt;/code>区分模式&lt;/li>
&lt;li>&lt;strong>特有钩子&lt;/strong>：如&lt;code>configureServer&lt;/code>处理开发服务器，&lt;code>transformIndexHtml&lt;/code>修改入口HTML&lt;/li>
&lt;li>&lt;strong>兼容机制&lt;/strong>：通过&lt;code>rollupOptions.inputPlugins&lt;/code>显式声明Rollup插件&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="f87f58c" class="language-javascript ">
 &lt;code>// vite.config.js
export default {
 plugins: [vitePlugin1, vitePlugin2],
 build: {
 rollupOptions: {
 plugins: [rollupPlugin1(), rollupPlugin2()] // Rollup专属插件
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>盲目混用插件导致构建错误（如同时使用&lt;code>@vitejs/plugin-react&lt;/code>和&lt;code>@rollup/plugin-babel&lt;/code>）&lt;/li>
&lt;li>未正确处理SSR场景下的插件配置&lt;/li>
&lt;li>开发模式下误用Rollup专有阶段钩子&lt;/li>
&lt;/ol>
&lt;h2 id="四问题解答">四、问题解答 &lt;a href="#%e5%9b%9b%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite插件生态已形成完整的工具链体系，覆盖框架支持（React/Vue）、CSS处理、静态资源加载等场景。通过&lt;code>build.rollupOptions.plugins&lt;/code>数组可注入Rollup插件，但需注意：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>专属插件差异&lt;/strong>：&lt;br>
Vite插件可直接处理HMR、环境变量注入等特性（如&lt;code>@vitejs/plugin-vue&lt;/code>），而Rollup插件（如&lt;code>rollup-plugin-image&lt;/code>）主要处理资源加载等通用任务&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用示例&lt;/strong>：&lt;/p>
&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="7762525" class="language-javascript ">
 &lt;code>// vite.config.js
import image from &amp;#39;@rollup/plugin-image&amp;#39;

export default {
 plugins: [/* Vite插件 */],
 build: {
 rollupOptions: {
 plugins: [image()] // Rollup插件
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h2 id="五解决方案">五、解决方案 &lt;a href="#%e4%ba%94%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="514aa2e" class="language-javascript ">
 &lt;code>// 自定义Vite插件示例
const viteCustomPlugin = () =&amp;gt; ({
 name: &amp;#39;vite-custom&amp;#39;,
 // Vite专属钩子
 configureServer(server) {
 server.middlewares.use((req, res, next) =&amp;gt; {
 console.log(&amp;#39;Request:&amp;#39;, req.url)
 next()
 })
 },
 // 通用钩子
 transform(code, id) {
 if (/\.vue$/.test(id)) {
 return code.replace(/__VERSION__/g, &amp;#39;3.2.0&amp;#39;)
 }
 }
})

// Rollup插件示例（需通过rollupOptions注入）
const rollupAssetPlugin = {
 name: &amp;#39;rollup-asset&amp;#39;,
 transform(code, id) {
 if (/\.custom$/.test(id)) {
 return `export default ${JSON.stringify(code)}`
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="可扩展性建议">可扩展性建议 &lt;a href="#%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>环境判断&lt;/strong>：通过&lt;code>process.env.NODE_ENV&lt;/code>区分插件加载&lt;/li>
&lt;li>&lt;strong>按需加载&lt;/strong>：动态导入大型插件（如&lt;code>vite-plugin-pwa&lt;/code>）&lt;/li>
&lt;li>&lt;strong>性能优化&lt;/strong>：开发模式禁用耗时的构建插件&lt;/li>
&lt;/ol>
&lt;h2 id="六深度追问">六、深度追问 &lt;a href="#%e5%85%ad%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何处理Vite插件和Rollup插件的执行顺序？&lt;/strong>&lt;br>
答：通过&lt;code>enforce&lt;/code>字段控制插件执行阶段（pre/normal/post）&lt;/p></description></item><item><title>Vite开发服务器HTTPS配置</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-32/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-32/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>核心能力维度&lt;/strong>：工具链配置能力、Node.js API运用、开发环境安全配置&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Vite配置体系理解&lt;/strong>：是否熟悉vite.config.js结构及server配置项&lt;/li>
&lt;li>&lt;strong>HTTPS服务配置&lt;/strong>：掌握Node.js原生https模块的证书加载方式&lt;/li>
&lt;li>&lt;strong>安全文件处理&lt;/strong>：正确使用文件系统API读取证书文件&lt;/li>
&lt;li>&lt;strong>开发环境调试&lt;/strong>：了解自签名证书的浏览器兼容处理&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Node.js &lt;code>https.createServer&lt;/code>选项格式&lt;/li>
&lt;li>&lt;code>fs.readFileSync&lt;/code>同步文件读取&lt;/li>
&lt;li>Vite开发服务器配置结构&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite开发服务器底层使用Connect中间件框架，当配置&lt;code>server.https&lt;/code>时会透传参数给Node.js的&lt;code>https.createServer&lt;/code>方法。证书文件需通过文件系统API加载为Buffer或字符串，配置示例：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="ce2e858" class="language-javascript ">
 &lt;code>// 典型配置结构
import { defineConfig } from &amp;#39;vite&amp;#39;

export default defineConfig({
 server: {
 https: {
 key: fs.readFileSync(&amp;#39;path/to/key.pem&amp;#39;),
 cert: fs.readFileSync(&amp;#39;path/to/cert.pem&amp;#39;)
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>路径处理错误&lt;/strong>：未使用&lt;code>path&lt;/code>模块导致相对路径异常&lt;/li>
&lt;li>&lt;strong>同步异步混淆&lt;/strong>：在动态加载配置时错误使用异步读取&lt;/li>
&lt;li>&lt;strong>证书格式误解&lt;/strong>：将PEM格式密钥与CRT格式混淆&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>配置Vite开发服务器HTTPS需在&lt;code>vite.config.js&lt;/code>中设置&lt;code>server.https&lt;/code>选项。通过Node.js的&lt;code>fs.readFileSync&lt;/code>同步读取SSL证书文件，具体步骤如下：&lt;/p>
&lt;ol>
&lt;li>导入&lt;code>fs&lt;/code>和&lt;code>path&lt;/code>模块处理文件路径&lt;/li>
&lt;li>使用绝对路径加载证书文件避免路径错误&lt;/li>
&lt;li>将证书内容作为&lt;code>key&lt;/code>和&lt;code>cert&lt;/code>属性传入配置对象&lt;/li>
&lt;/ol>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="5b6187a" class="language-javascript ">
 &lt;code>import { defineConfig } from &amp;#39;vite&amp;#39;
import fs from &amp;#39;node:fs&amp;#39;
import path from &amp;#39;node:path&amp;#39;

export default defineConfig({
 server: {
 https: {
 // 使用path.resolve处理跨平台路径问题
 key: fs.readFileSync(path.resolve(__dirname, &amp;#39;localhost-key.pem&amp;#39;)),
 cert: fs.readFileSync(path.resolve(__dirname, &amp;#39;localhost.pem&amp;#39;))
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="b6d3aa7" class="language-javascript ">
 &lt;code>// vite.config.js
import { defineConfig } from &amp;#39;vite&amp;#39;
import fs from &amp;#39;node:fs&amp;#39;
import path from &amp;#39;node:path&amp;#39;

export default defineConfig({
 server: {
 port: 443, // 标准HTTPS端口
 https: {
 // 支持同时加载多个域名证书
 key: [
 fs.readFileSync(path.join(__dirname, &amp;#39;ssl/domain1.key&amp;#39;)),
 fs.readFileSync(path.join(__dirname, &amp;#39;ssl/domain2.key&amp;#39;))
 ],
 cert: [
 fs.readFileSync(path.join(__dirname, &amp;#39;ssl/domain1.crt&amp;#39;)),
 fs.readFileSync(path.join(__dirname, &amp;#39;ssl/domain2.crt&amp;#39;))
 ]
 }
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化建议&lt;/strong>：&lt;/p></description></item><item><title>Vite全局常量定义方法</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-33/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-33/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人对前端工程化工具链的掌握程度，具体评估以下维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>编译时替换机制&lt;/strong>：理解Vite的define配置本质是编译期的字符串替换&lt;/li>
&lt;li>&lt;strong>环境变量处理&lt;/strong>：区分import.meta.env与编译常量的使用场景&lt;/li>
&lt;li>&lt;strong>类型安全&lt;/strong>：处理全局常量时的TypeScript支持方案&lt;/li>
&lt;li>&lt;strong>安全实践&lt;/strong>：避免XSS攻击的JSON.stringify正确用法&lt;/li>
&lt;li>&lt;strong>多环境适配&lt;/strong>：不同编译模式下常量值的动态配置&lt;/li>
&lt;/ol>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite的define配置 &amp;gt; 环境变量 &amp;gt; 类型声明文件&lt;/li>
&lt;li>编译时替换与运行时注入的本质区别&lt;/li>
&lt;li>字符串替换的安全处理方式&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite的define配置通过esbuild的define功能实现编译时替换。在代码压缩阶段，所有匹配的标识符会被直接替换为指定的JSON值。例如配置&lt;code>define: { __VERSION__: '&amp;quot;1.0.0&amp;quot;' }&lt;/code>，代码中的&lt;code>__VERSION__&lt;/code>会被替换为字符串&amp;quot;1.0.0&amp;quot;。&lt;/p>
&lt;p>&lt;strong>常见误区&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>直接赋值非JSON序列化值（如&lt;code>__VERSION__: 1.0.0&lt;/code>）导致替换后出现未定义标识符&lt;/li>
&lt;li>混淆import.meta.env（环境变量）与编译时常量的使用场景&lt;/li>
&lt;li>未声明TypeScript类型导致类型检查报错&lt;/li>
&lt;/ul>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中通过&lt;code>define&lt;/code>配置项注入全局常量：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="19e31bc" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 define: {
 __VERSION__: JSON.stringify(&amp;#39;1.0.0&amp;#39;), // 正确序列化字符串
 &amp;#39;import.meta.env.APP_MODE&amp;#39;: JSON.stringify(process.env.NODE_ENV)
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>该配置会在编译阶段将代码中的&lt;code>__VERSION__&lt;/code>直接替换为&lt;code>&amp;quot;1.0.0&amp;quot;&lt;/code>，同时确保字符串类型的正确性。对于TypeScript项目，需添加类型声明：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="80f0840" class="language-typescript ">
 &lt;code>// global.d.ts
declare const __VERSION__: string;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码示例">编码示例 &lt;a href="#%e7%bc%96%e7%a0%81%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="da4d22f" class="language-javascript ">
 &lt;code>// 安全注入含敏感信息的常量
const pkg = require(&amp;#39;./package.json&amp;#39;)

export default defineConfig({
 define: {
 __APP_VERSION__: JSON.stringify(pkg.version), // 动态读取版本号
 __BUILD_TIMESTAMP__: Date.now().toString(), // 编译时间戳
 __FEATURE_FLAGS__: JSON.stringify({
 experimental: process.env.DEBUG === &amp;#39;true&amp;#39;
 })
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>优化建议&lt;/strong>：&lt;/p></description></item><item><title>Vite的base配置项作用</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-34/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-34/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该题目主要考查候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具配置理解&lt;/strong>：对Vite核心配置项的掌握程度&lt;/li>
&lt;li>&lt;strong>部署场景适配能力&lt;/strong>：处理CDN加速、子目录部署等生产环境需求的实际经验&lt;/li>
&lt;li>&lt;strong>路径解析机制&lt;/strong>：理解静态资源路径生成逻辑与HTML基础路径的关系&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点包括：&lt;/p>
&lt;ul>
&lt;li>base配置对资源路径的改写规则&lt;/li>
&lt;li>CDN部署时的路径拼接策略&lt;/li>
&lt;li>子目录部署时与路由系统的联动配置&lt;/li>
&lt;li>开发环境与生产环境的路径差异处理&lt;/li>
&lt;li>与public目录静态资源的协同工作机制&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>基础路径计算逻辑&lt;/li>
&lt;li>资源路径解析优先级&lt;/li>
&lt;li>路由系统联动配置&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite的&lt;code>base&lt;/code>配置项用于定义应用部署的基础路径，其核心作用类似于webpack的&lt;code>publicPath&lt;/code>。当资源路径包含以下情况时，路径会被自动改写：&lt;/p>
&lt;ul>
&lt;li>通过&lt;code>import&lt;/code>导入的模块&lt;/li>
&lt;li>CSS中的&lt;code>url()&lt;/code>引用&lt;/li>
&lt;li>&lt;code>public&lt;/code>目录下的静态资源&lt;/li>
&lt;li>通过&lt;code>new URL()&lt;/code>构造的绝对路径&lt;/li>
&lt;/ul>
&lt;p>部署时路径计算遵循公式：&lt;code>最终路径 = base + 相对路径&lt;/code>。例如配置&lt;code>base: '/sub/'&lt;/code>时，&lt;code>src/assets/logo.png&lt;/code>会被解析为&lt;code>/sub/assets/logo.png&lt;/code>。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆开发环境与生产环境的路径处理（开发环境默认不应用base）&lt;/li>
&lt;li>未同步配置Vue Router的base选项导致路由失效&lt;/li>
&lt;li>在动态拼接路径时忘记手动添加base前缀&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite的&lt;code>base&lt;/code>配置项用于定义项目部署的基础路径，主要解决以下场景：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>子目录部署&lt;/strong>：当应用部署在&lt;code>https://domain.com/sub-path/&lt;/code>时，需设置&lt;code>base: '/sub-path/'&lt;/code>，此时所有资源路径自动添加该前缀&lt;/li>
&lt;li>&lt;strong>CDN加速&lt;/strong>：部署至&lt;code>https://cdn.domain.com/&lt;/code>时配置&lt;code>base: 'https://cdn.domain.com/project/'&lt;/code>，确保资源从CDN加载&lt;/li>
&lt;/ol>
&lt;p>示例配置：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="85c6eca" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 base: process.env.NODE_ENV === &amp;#39;production&amp;#39; 
 ? &amp;#39;/sub-path/&amp;#39; 
 : &amp;#39;/&amp;#39;
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>路由同步配置（以Vue Router为例）：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="970ba8d" class="language-javascript ">
 &lt;code>const router = createRouter({
 history: createWebHistory(import.meta.env.BASE_URL), // 自动读取Vite的base配置
 routes: [...]
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="cdn部署配置示例">CDN部署配置示例 &lt;a href="#cdn%e9%83%a8%e7%bd%b2%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="9f40994" class="language-javascript ">
 &lt;code>// vite.config.js
export default defineConfig({
 base: process.env.CDN_URL 
 ? `${process.env.CDN_URL}/` 
 : &amp;#39;/&amp;#39;,
 build: {
 assetsDir: &amp;#39;static&amp;#39; // 规范资源目录结构
 }
})&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>关键优化：&lt;/p></description></item><item><title>Vite开发与生产构建差异</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-35/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-35/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察候选人以下能力维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>构建工具工作原理&lt;/strong>：理解现代前端工具链的差异化设计&lt;/li>
&lt;li>&lt;strong>模块化演进认知&lt;/strong>：识别ESM与传统打包模式的适用场景差异&lt;/li>
&lt;li>&lt;strong>性能优化意识&lt;/strong>：掌握开发体验与生产性能的平衡策略&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>开发模式下的ESM动态编译机制&lt;/li>
&lt;li>生产构建阶段的静态分析与优化手段&lt;/li>
&lt;li>预构建（Pre-Bundling）的核心作用&lt;/li>
&lt;li>热更新（HMR）的实现差异&lt;/li>
&lt;li>Rollup特性在构建阶段的深度应用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>ESM动态编译 &amp;gt; Rollup优化管道 &amp;gt; 预构建机制 &amp;gt; HMR实现差异&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>开发模式&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>通过&lt;code>esbuild&lt;/code>进行依赖预构建，将CommonJS模块转换为ESM格式并缓存&lt;/li>
&lt;li>浏览器请求触发按需编译，利用ESM的&lt;code>import&lt;/code>语句实现模块按需加载&lt;/li>
&lt;li>模块热更新通过WebSocket建立实时通信，仅更新变更模块的依赖链&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>生产构建&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>采用Rollup进行全量打包，利用其静态分析能力实现：
&lt;ul>
&lt;li>Tree-shaking消除无效代码&lt;/li>
&lt;li>Scope hoisting提升运行性能&lt;/li>
&lt;li>代码分割(Code Splitting)优化加载速度&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>资源处理流程标准化：
&lt;ul>
&lt;li>CSS提取与压缩&lt;/li>
&lt;li>资源哈希指纹生成&lt;/li>
&lt;li>异步模块的自动分割&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆开发环境的热更新与生产构建的打包逻辑&lt;/li>
&lt;li>误以为生产构建完全禁用ESM特性（实际支持动态导入）&lt;/li>
&lt;li>忽略预构建阶段对第三方库的优化处理&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite在开发与生产环境的核心差异体现在模块处理策略：&lt;/p>
&lt;p>&lt;strong>开发模式&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>基于浏览器原生ESM实现毫秒级启动&lt;/li>
&lt;li>请求驱动编译（编译开销分摊到整个会话周期）&lt;/li>
&lt;li>完整的SourceMap支持实现精准调试&lt;/li>
&lt;li>通过&lt;code>esbuild&lt;/code>预构建解决依赖层级爆炸问题&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>生产构建&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>采用Rollup进行全量打包，通过静态分析实现：
&lt;ul>
&lt;li>深度Tree-shaking消除冗余代码&lt;/li>
&lt;li>作用域提升优化执行性能&lt;/li>
&lt;li>自动化分包策略控制包体积&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>集成CSS压缩、资源指纹等生产级优化&lt;/li>
&lt;li>启用更严格的语法转换保证浏览器兼容性&lt;/li>
&lt;/ul>
&lt;p>本质差异：开发环境采用&lt;strong>动态编译&lt;/strong>保障开发体验，生产环境通过&lt;strong>静态优化&lt;/strong>确保运行性能。&lt;/p>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="配置示例">配置示例 &lt;a href="#%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8b" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="84ee34b" class="language-javascript ">
 &lt;code>// vite.config.js
export default {
 build: {
 // 生产构建专用配置
 rollupOptions: {
 output: {
 manualChunks: (id) =&amp;gt; { // 自定义分包策略
 if (id.includes(&amp;#39;node_modules&amp;#39;)) return &amp;#39;vendor&amp;#39;
 }
 }
 },
 terserOptions: { // 代码压缩配置
 compress: { drop_console: true }
 }
 },
 optimizeDeps: { // 开发环境预构建配置
 include: [&amp;#39;lodash-es&amp;#39;] 
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="扩展建议">扩展建议 &lt;a href="#%e6%89%a9%e5%b1%95%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>大流量场景：配置&lt;code>brotli&lt;/code>压缩提升传输效率&lt;/li>
&lt;li>低端设备：通过&lt;code>@vitejs/plugin-legacy&lt;/code>注入polyfill&lt;/li>
&lt;li>复杂项目：拆分&lt;code>vendor&lt;/code>包时采用哈希稳定性策略&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>&lt;strong>如何验证Tree-shaking效果？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>使用&lt;code>rollup-plugin-visualizer&lt;/code>分析产物构成&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>&lt;strong>ESM动态加载如何避免瀑布请求？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>预构建扁平化依赖关系，合并细碎模块&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>开发模式如何保持TypeScript类型安全？&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>采用&lt;code>vite-plugin-checker&lt;/code>实现实时类型检查&lt;/li>
&lt;/ul></description></item><item><title>Vite按需加载实现方案</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-36/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-36/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;strong>核心能力维度&lt;/strong>：工程化构建能力、框架机制理解、性能优化意识&lt;/li>
&lt;li>&lt;strong>技术评估点&lt;/strong>：
&lt;ol>
&lt;li>动态&lt;code>import()&lt;/code>语法在ES Module中的运用&lt;/li>
&lt;li>Vite底层基于Rollup的代码分割机制&lt;/li>
&lt;li>路由懒加载实现方案&lt;/li>
&lt;li>构建产物分析与优化策略&lt;/li>
&lt;li>动态模块与静态模块的区分能力&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>动态导入语法 &amp;gt; Rollup代码分割 &amp;gt; 路由懒加载模式&lt;/li>
&lt;li>Vite使用浏览器原生ESM特性，在开发环境实现按需编译，生产环境基于Rollup进行构建&lt;/li>
&lt;li>动态&lt;code>import()&lt;/code>会被编译为分离的chunk文件，配合&lt;code>preload&lt;/code>指令实现智能预加载&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;pre class="mermaid">graph TD
 A[动态import()] --&amp;gt; B(Vite开发服务器)
 B --&amp;gt; C{生产环境?}
 C -- 是 --&amp;gt; D[Rollup代码分割]
 C -- 否 --&amp;gt; E[浏览器直接请求ES模块]
 D --&amp;gt; F[生成独立chunk文件]
 E --&amp;gt; G[按需编译模块]
&lt;/pre>
&lt;p>动态导入在构建时会触发以下过程：&lt;/p>
&lt;ol>
&lt;li>语法解析阶段识别动态导入语句&lt;/li>
&lt;li>创建独立模块依赖图&lt;/li>
&lt;li>生成带有哈希值的chunk文件&lt;/li>
&lt;li>自动注入预加载逻辑（通过&lt;code>&amp;lt;link rel=&amp;quot;modulepreload&amp;quot;&amp;gt;&lt;/code>）&lt;/li>
&lt;/ol>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误将动态导入路径写成变量导致无法分割&lt;/li>
&lt;li>混淆静态导入与动态导入的加载时机&lt;/li>
&lt;li>未正确处理异步加载的Loading状态&lt;/li>
&lt;li>错误配置splitChunks导致过度分割&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>Vite通过动态&lt;code>import()&lt;/code>语法实现按需加载，其核心机制分为两个层面：&lt;/p>
&lt;p>&lt;strong>开发环境&lt;/strong>：利用浏览器原生ESM能力，在代码执行到动态导入语句时才发起网络请求，实现真正的按需编译。&lt;/p>
&lt;p>&lt;strong>生产环境&lt;/strong>：通过Rollup将动态导入的模块拆分为独立chunk，配合&lt;code>modulepreload&lt;/code>提示进行智能预加载。路由配置示例：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="de3908e" class="language-javascript ">
 &lt;code>// 路由配置示例（Vue3）
const routes = [
 {
 path: &amp;#39;/dashboard&amp;#39;,
 component: () =&amp;gt; import(&amp;#39;./views/Dashboard.vue&amp;#39;) // 动态导入触发代码分割
 }
]&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>构建后会生成类似&lt;code>Dashboard-abc123.js&lt;/code>的独立chunk，仅在访问&lt;code>/dashboard&lt;/code>路由时加载该模块。&lt;/p></description></item><item><title>Vite自定义路由解析扩展</title><link>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-37/</link><pubDate>Wed, 05 Mar 2025 10:37:25 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/vite/vite-37/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>该问题主要考核以下核心维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Vite插件开发能力&lt;/strong>：是否掌握Vite插件系统的工作机制，特别是服务器中间件的扩展方式&lt;/li>
&lt;li>&lt;strong>构建工具集成理解&lt;/strong>：能否区分开发时和生产环境下不同的路由处理方式（Rollup配置与服务器中间件）&lt;/li>
&lt;li>&lt;strong>请求拦截原理&lt;/strong>：对Connect中间件体系的理解及在Vite中的实践应用&lt;/li>
&lt;li>&lt;strong>动态路由处理策略&lt;/strong>：如何处理SPA应用中的路由重定向和动态参数解析&lt;/li>
&lt;/ol>
&lt;p>评估重点包括：&lt;/p>
&lt;ul>
&lt;li>configureServer钩子的使用场景&lt;/li>
&lt;li>中间件顺序对请求处理的影响&lt;/li>
&lt;li>虚拟模块在路由配置生成中的应用&lt;/li>
&lt;li>开发环境与生产环境路由处理的差异&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>Vite插件系统 &amp;gt; Connect中间件 &amp;gt; 虚拟模块&lt;/li>
&lt;li>开发服务器扩展 &amp;gt; 构建时配置 &amp;gt; 生产部署策略&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>Vite通过Connect中间件架构提供开发服务器扩展能力。&lt;code>configureServer&lt;/code>钩子允许注入自定义中间件，这些中间件会在Vite内置中间件之前执行（可通过&lt;code>order: 'pre'&lt;/code>调整顺序）。当请求到达时，中间件通过判断&lt;code>req.url&lt;/code>决定是否进行重定向（通过设置&lt;code>res.statusCode&lt;/code>和&lt;code>Location&lt;/code>头）或返回自定义响应。&lt;/p>
&lt;p>构建阶段通过&lt;code>resolveId&lt;/code>和&lt;code>load&lt;/code>钩子创建虚拟模块，可动态生成路由配置文件。生产环境需要配合SSR或静态资源服务器配置实现完整路由支持。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>混淆开发中间件与构建插件的应用场景&lt;/li>
&lt;li>未正确处理中间件执行顺序导致拦截失效&lt;/li>
&lt;li>忽略客户端路由库（如vue-router）与服务端重定向的协同工作&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>在Vite中扩展路由解析逻辑可通过两种方式实现：&lt;/p>
&lt;p>&lt;strong>开发环境&lt;/strong>：创建Vite插件，通过&lt;code>configureServer&lt;/code>注入中间件拦截请求。示例插件结构：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="c948792" class="language-javascript ">
 &lt;code>export default function redirectPlugin() {
 return {
 name: &amp;#39;vite-plugin-custom-router&amp;#39;,
 configureServer(server) {
 server.middlewares.use((req, res, next) =&amp;gt; {
 if (req.url.startsWith(&amp;#39;/users/&amp;#39;)) {
 const userId = req.url.split(&amp;#39;/&amp;#39;)[2]
 res.setHeader(&amp;#39;Location&amp;#39;, `/profile/${userId}`)
 res.statusCode = 302
 res.end()
 return
 }
 next()
 })
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>生产构建&lt;/strong>：通过&lt;code>@rollup/plugin-virtual&lt;/code>生成动态路由配置：&lt;/p></description></item></channel></rss>