<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ESM on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/esm/</link><description>Recent content in ESM 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/esm/index.xml" rel="self" type="application/rss+xml"/><item><title>Webpack的Tree Shaking机制</title><link>https://fe-interview.pangcy.cn/docs/engineering/webpack/webpack-14/</link><pubDate>Wed, 05 Mar 2025 09:59:05 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/engineering/webpack/webpack-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>：ES Modules的静态结构特性与Tree Shaking的关系&lt;/li>
&lt;li>&lt;strong>编译原理应用&lt;/strong>：AST静态分析在代码消除中的具体实现&lt;/li>
&lt;li>&lt;strong>工程化配置&lt;/strong>：Webpack优化配置项的作用原理及组合使用&lt;/li>
&lt;li>&lt;strong>代码规范意识&lt;/strong>：副作用控制与模块编写最佳实践&lt;/li>
&lt;/ol>
&lt;p>评估点包括：ES模块与CJS模块差异理解、DCE优化原理、Side Effects处理、Webpack构建流程中的标记-消除两阶段机制。&lt;/p>
&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>ES Modules静态结构&lt;/strong>：&lt;code>import/export&lt;/code>语句必须在顶层作用域，依赖关系在编译时确定&lt;/li>
&lt;li>&lt;strong>副作用标记&lt;/strong>：&lt;code>package.json&lt;/code>的&lt;code>sideEffects&lt;/code>字段控制模块行为&lt;/li>
&lt;li>&lt;strong>标记阶段&lt;/strong>：Webpack通过&lt;code>usedExports&lt;/code>标记未使用的export&lt;/li>
&lt;li>&lt;strong>消除阶段&lt;/strong>：Terser等压缩工具实际删除死代码&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>Webpack的Tree Shaking分为两个阶段：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>标记阶段&lt;/strong>：构建依赖图时通过静态分析识别未被引用的export
&lt;ul>
&lt;li>基于ESTree规范的AST分析，识别有效引用链&lt;/li>
&lt;li>通过&lt;code>harmony export&lt;/code>等标记记录导出使用情况&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>消除阶段&lt;/strong>：在压缩阶段通过Terser等工具移除标记代码
&lt;ul>
&lt;li>依赖&lt;code>/*#__PURE__*/&lt;/code>等注释判断函数副作用&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>误认为开发模式也能完全Tree Shaking（实际需要生产模式+压缩）&lt;/li>
&lt;li>混合使用ESM和CJS导致分析失效&lt;/li>
&lt;li>忽略CSS等非JS资源的Side Effects&lt;/li>
&lt;li>误删含副作用的模块（如polyfill）&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>Webpack的Tree Shaking通过静态分析ES Modules的导入导出关系，标记未使用的代码并在压缩阶段移除。其生效需要三个条件：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>使用ES Modules规范&lt;/strong>：通过&lt;code>import/export&lt;/code>语句建立可静态分析的依赖关系树&lt;/li>
&lt;li>&lt;strong>启用生产模式优化&lt;/strong>：设置&lt;code>mode: 'production'&lt;/code>自动开启&lt;code>FlagDependencyUsagePlugin&lt;/code>等优化插件&lt;/li>
&lt;li>&lt;strong>正确配置副作用&lt;/strong>：在&lt;code>package.json&lt;/code>中通过&lt;code>sideEffects: false&lt;/code>声明模块无副作用，或指定有副作用的文件路径&lt;/li>
&lt;/ol>
&lt;p>典型配置示例：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="85fb5de" class="language-javascript ">
 &lt;code>// webpack.config.js
module.exports = {
 mode: &amp;#39;production&amp;#39;,
 optimization: {
 usedExports: true, // 启用导出使用标记
 minimize: true // 启用代码压缩删除
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>代码规范要求：&lt;/p></description></item></channel></rss>