<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rollup集成 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/rollup%E9%9B%86%E6%88%90/</link><description>Recent content in Rollup集成 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/rollup%E9%9B%86%E6%88%90/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><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插件生态与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></channel></rss>