<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>代码优化 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96/</link><description>Recent content in 代码优化 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/%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>