<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>小红书 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%B0%8F%E7%BA%A2%E4%B9%A6/</link><description>Recent content in 小红书 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 01 Feb 2026 14:42:25 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%B0%8F%E7%BA%A2%E4%B9%A6/index.xml" rel="self" type="application/rss+xml"/><item><title>小红书-社招-5年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了前端基础知识，包括BFC、浮动元素、作用域、异步编程、Webpack、Vue等多方面的内容。题目涉及理论知识和代码实现。&lt;/p&gt;
&lt;p&gt;本轮共 18 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;1. BFC讲一下&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5c174882-c1e7-4c08-a71a-f4c991be552f"&gt;什么是BFC？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;BFC（Block Formatting Context）&lt;/strong&gt; 是 CSS 中一个重要的布局概念，它描述了一个块级元素的内部布局和外部布局之间的关系。BFC 主要用于处理元素的布局、浮动、边距合并等问题。&lt;/p&gt;
&lt;h3 id="bfc-的作用"&gt;BFC 的作用&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阻止外边距折叠&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;外边距折叠&lt;/strong&gt;：当两个块级元素垂直相邻时，它们的外边距会合并，形成一个更大的外边距。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：在 BFC 内部的元素的外边距不会影响到外部 BFC 的元素，避免了外边距折叠的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;包含浮动元素&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浮动元素&lt;/strong&gt;：通常会从其包含块中溢出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：具有 BFC 的元素可以包含其内部的浮动元素，确保其高度包括浮动元素的高度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;控制元素的布局&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：在 BFC 内部，元素的布局（如浮动、定位）会受到影响和控制，避免与外部元素发生冲突。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防止元素重叠&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BFC&lt;/strong&gt;：能够隔离不同的 BFC 区域，避免元素之间的重叠或干扰。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="如何触发-bfc"&gt;如何触发 BFC&lt;/h3&gt;
&lt;p&gt;BFC 会在以下情况中被触发：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;块级格式化上下文的创建&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元素的 &lt;code&gt;display&lt;/code&gt; 属性值为 &lt;code&gt;block&lt;/code&gt; 或 &lt;code&gt;inline-block&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;position&lt;/code&gt; 属性值为 &lt;code&gt;absolute&lt;/code&gt; 或 &lt;code&gt;fixed&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;float&lt;/code&gt; 属性值为 &lt;code&gt;left&lt;/code&gt; 或 &lt;code&gt;right&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;元素的 &lt;code&gt;overflow&lt;/code&gt; 属性值为 &lt;code&gt;hidden&lt;/code&gt;、&lt;code&gt;scroll&lt;/code&gt; 或 &lt;code&gt;auto&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;其他常见触发情况&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端基础知识，包括JavaScript的基本类型和引用类型的存储、闭包的内存泄漏、垃圾回收机制、事件循环、React框架的理解等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Promise、CDN原理、Class、数据类型、浏览器渲染过程&lt;/p&gt;
&lt;p&gt;本轮共 24 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;1. js中基本类型 和 引用类型的存储有什么不一样&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/ae4aa03a-06fe-41be-9c42-f53947f13f49"&gt;引用类型有哪些，有什么特点&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;在JavaScript中，引用类型是指非基本数据类型，它们是由对象、数组、函数等复杂数据结构组成的。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在JavaScript中，引用类型是指非基本数据类型，它们是由对象、数组、函数等复杂数据结构组成的。&lt;/p&gt;
&lt;p&gt;常见的引用类型包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;对象（Object）&lt;/code&gt;：对象是JavaScript中最基本的引用类型，它可以用来存储键值对，也可以通过原型链实现继承。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;数组（Array）&lt;/code&gt;：数组是一种有序的集合，可以存储任意类型的数据，它的长度是动态的，可以随时添加或删除元素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;函数（Function）&lt;/code&gt;：函数是一种可执行的对象，可以封装一段可重复使用的代码。函数可以接收参数并返回值。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;引用类型的特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;引用类型的值是可变的：引用类型的值是存储在堆内存中的，当我们修改一个引用类型的值时，实际上是修改了它在内存中的地址，而不是修改了该值本身。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型值的比较是引用的比较：当使用&amp;quot;==&amp;ldquo;或&amp;rdquo;===&amp;ldquo;运算符比较两个引用类型的值时，它们会进行引用的比较，即判断它们是否指向同一个内存地址。只有当两个引用指向同一个对象时，它们才被认为是相等的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以有自己的属性和方法：引用类型的值可以拥有自己的属性和方法。例如，数组对象有长度属性和一些常用的数组方法（例如push、pop、sort等），而函数对象有call、apply等方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;引用类型可以通过原型链实现继承：通过原型链，引用类型可以继承父类型的属性和方法。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本类型（如数字、字符串、布尔值）在JavaScript中是按值传递的，而引用类型是按引用传递的。&lt;/p&gt;
&lt;p&gt;这意味着当将一个引用类型的值赋给另一个变量时，实际上是将内存地址复制给了新的变量，两个变量引用的是同一对象。而基本类型的值赋给另一个变量时，会创建一个新的值并赋给新的变量。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;2. 闭包的内存泄漏应该如何监控和解决？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/6dd983d9-39fc-48ca-9e22-7599ab339f5b"&gt;如何检查Javascript中的内存泄漏？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h2 id="浏览器"&gt;浏览器&lt;/h2&gt;
&lt;p&gt;Chrome 浏览器查看内存占用，按照以下步骤操作。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/b822300b-cf04-4c9f-9d88-06bd331726c0.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1、打开开发者工具，选择 Timeline 面板
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2、在顶部的Capture字段里面勾选 Memory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3、点击左上角的录制按钮。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4、在页面上进行各种操作，模拟用户的使用情况。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;5、一段时间后，点击对话框的 stop 按钮，面板上就会显示这段时间的内存占用情况。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果内存占用基本平稳，接近水平，就说明不存在内存泄漏。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/5b616638-2dbc-49a7-9bde-97271ec206b1.png"&gt;&lt;/p&gt;
&lt;p&gt;反之，就是内存泄漏了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image.png" loading="lazy" src="https://static.ecool.fun//article/a05a6942-5cbe-42c8-a213-9122a9a851db.png"&gt;&lt;/p&gt;
&lt;h2 id="命令行"&gt;命令行&lt;/h2&gt;
&lt;p&gt;命令行可以使用 Node 提供的process.memoryUsage方法。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;process&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;memoryUsage&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// { rss: 27709440,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapTotal: 5685248,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// heapUsed: 3449392,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// external: 8772 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;process.memoryUsage返回一个对象，包含了 Node 进程的内存占用信息。该对象包含四个字段，单位是字节，含义如下。&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 1 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/"&gt;第 2 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了前端技术栈的深度和广度，包括CSS框架、响应式设计、渲染优化、Vue框架的高级特性、HTTP协议、浏览器渲染机制等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-aa8173c10147"&gt;1. 项目中为何选择 Tailwind CSS ？&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;灵活性, 可维护性, 现代前端工具链&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;Tailwind CSS 是一个高度可定制的低级 CSS 框架，它提供了大量的原子类，可以快速构建一致且响应式的布局。选择 Tailwind CSS 的原因可能包括其灵活性、可维护性以及与现代前端工具链的良好集成。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;2. Tailwind 是怎么解决样式冲突的？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/fa06c194-9fab-4cf0-8cc7-dda90c2c4f97"&gt;Tailwind 是怎么解决样式冲突的？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Tailwind 通过原子化 utility 类、统一选择器权重、避免层级嵌套、构建期生成样式以及可预测的覆盖规则，从架构层面降低样式冲突的发生概率。它不是依赖命名规范解决冲突，而是通过设计约束和单一职责类模型，使样式天然解耦，从而让冲突可控且可预测。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;这个问题如果只回答“因为类名不会冲突”是远远不够的。&lt;/p&gt;
&lt;p&gt;Tailwind 解决样式冲突，本质上是通过 &lt;strong&gt;设计约束 + 原子化模型 + 构建期生成策略&lt;/strong&gt;，从源头消除冲突的产生条件，而不是事后避免覆盖。&lt;/p&gt;
&lt;p&gt;下面从机制层面拆解。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="一传统-css-为什么容易冲突"&gt;一、传统 CSS 为什么容易冲突&lt;/h1&gt;
&lt;p&gt;传统样式冲突来自三个方面：&lt;/p&gt;
&lt;h3 id="1-选择器冲突"&gt;1. 选择器冲突&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;button&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;blue&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不同模块命名不规范会互相覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-层级嵌套带来的权重问题"&gt;2. 层级嵌套带来的权重问题&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; .&lt;span style="color:#a6e22e"&gt;btn&lt;/span&gt; { &lt;span style="color:#960050;background-color:#1e0010"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;权重升级，导致后续难以覆盖。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="3-样式全局污染"&gt;3. 样式全局污染&lt;/h3&gt;
&lt;p&gt;CSS 默认是全局作用域，没有隔离边界。&lt;/p&gt;</description></item><item><title>小红书-社招-5年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</link><pubDate>Sun, 01 Feb 2026 14:42:25 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-160/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/round-159/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-95/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 该轮面试主要考察了浏览器的工作原理、缓存策略、跨域、Vue生命周期、组件通信等方面的知识。题目涉及理论知识和实际应用场景。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;1. 详细讲一下从url输入网址到页面渲染的过程&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/5def10e9-7825-4bd4-a76e-6d7eb555a2ce"&gt;简单描述从输入网址到页面显示的过程&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;当输入URL到页面加载完成，发生了以下几个关键过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS解析&lt;/strong&gt;：浏览器将URL解析为对应的IP地址。这个过程涉及多级DNS服务器，从本地缓存开始，如果没有找到，则递归查询根域名服务器、顶级域名服务器，直到找到目标服务器的IP地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP连接&lt;/strong&gt;：浏览器通过三次握手与服务器建立TCP连接。一旦连接建立，浏览器可以发送HTTP请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP请求&lt;/strong&gt;：浏览器构建HTTP请求报文，通过TCP连接发送到服务器。请求报文包含请求行、请求头和请求正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务器处理请求&lt;/strong&gt;：服务器接收HTTP请求，解析请求内容，执行相应的处理（如数据库查询、文件读取等），并构建HTTP响应报文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP响应&lt;/strong&gt;：服务器将响应报文通过TCP连接发送回浏览器。响应报文包含状态码、响应头和响应正文。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器解析渲染&lt;/strong&gt;：浏览器接收到HTTP响应后，解析HTML文档构建DOM树，解析CSS构建CSSOM树，合并两者形成渲染树，然后开始渲染页面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接结束&lt;/strong&gt;：当浏览器完成页面渲染或收到服务器关闭连接的信号时，浏览器会发送TCP连接关闭的信号，服务器收到后，双方断开连接。&lt;/li&gt;
&lt;/ol&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;很多大公司面试喜欢问这样一道面试题，输入URL到看见页面发生了什么？&lt;/p&gt;
&lt;p&gt;简单来说，共有以下几个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS解析&lt;/li&gt;
&lt;li&gt;发起TCP连接&lt;/li&gt;
&lt;li&gt;发送HTTP请求&lt;/li&gt;
&lt;li&gt;服务器处理请求并返回HTTP报文&lt;/li&gt;
&lt;li&gt;浏览器解析渲染页面&lt;/li&gt;
&lt;li&gt;连接结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面我们来看看具体的细节。&lt;/p&gt;
&lt;h2 id="dns解析"&gt;DNS解析&lt;/h2&gt;
&lt;p&gt;DNS解析实际上就是寻找你所需要的资源的过程。假设你输入&lt;code&gt;www.baidu.com&lt;/code&gt;，而这个网址并不是百度的真实地址，互联网中每一台机器都有唯一标识的IP地址，这个才是关键，但是它不好记，乱七八糟一串数字谁记得住啊，所以就需要一个网址和IP地址的转换，也就是DNS解析。&lt;/p&gt;
&lt;p&gt;DNS解析其实是一个递归的过程。&lt;/p&gt;
&lt;p&gt;输入&lt;code&gt;www.google.com&lt;/code&gt;网址后，首先在本地的域名服务器中查找，没找到去根域名服务器查找，没有再去com顶级域名服务器查找，，如此的类推下去，直到找到IP地址，然后把它记录在本地，供下次使用。大致过程就是.-&amp;gt; .com -&amp;gt;google.com. -&amp;gt; &lt;a href="https://www.google.com"&gt;www.google.com&lt;/a&gt;.。 (最后这个.对应的就是根域名服务器，默认情况下所有的网址的最后一位都是.，为了方便用户，通常都会省略，浏览器在请求DNS的时候会自动加上)&lt;/p&gt;
&lt;h3 id="dns优化"&gt;DNS优化&lt;/h3&gt;
&lt;p&gt;既然已经懂得了解析的具体过程，我们可以看到上述一共经过了N个过程，每个过程有一定的消耗和时间的等待，因此我们得想办法解决一下这个问题！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS存在着多级缓存，从离浏览器的距离排序的话，有以下几种: 浏览器缓存，系统缓存，路由器缓存，ISP服务器缓存，根域名服务器缓存，顶级域名服务器缓存，主域名服务器缓存。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS负载均衡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如访问baidu.com的时候，每次响应的并非是同一个服务器（IP地址不同），一般大公司都有成百上千台服务器来支撑访问。DNS可以返回一个合适的机器的IP给用户，例如可以根据每台机器的负载量，该机器离用户地理位置的距离等等，这种过程就是DNS负载均衡。&lt;/p&gt;
&lt;h2 id="发起tcp连接"&gt;发起TCP连接&lt;/h2&gt;
&lt;p&gt;TCP提供一种可靠的传输，这个过程涉及到三次握手，四次挥手。&lt;/p&gt;
&lt;h3 id="三次握手"&gt;三次握手&lt;/h3&gt;
&lt;p&gt;&lt;img alt="三次握手示意图" loading="lazy" src="https://static.ecool.fun//article/f3f07532-8a7f-48f8-8f9e-d68ac149f9a2.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送syn包(Seq=x)到服务器，并进入SYN_SEND状态，等待服务器确认；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到syn包，必须确认客户的SYN（ack=x+1），同时自己也发送一个SYN包（Seq=y），即SYN+ACK包，此时服务器进入SYN_RECV状态；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第三次握手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端收到服务器的SYN＋ACK包，向服务器发送确认包ACK(ack=y+1)，此包发送完毕，客户端和服务器进入ESTABLISHED状态，完成三次握手。&lt;/p&gt;
&lt;p&gt;握手过程中传送的包里不包含数据，三次握手完毕后，客户端与服务器才正式开始传送数据。理想状态下，TCP连接一旦建立，在通信双方中的任何一方主动关闭连接之前，TCP 连接都将被一直保持下去。&lt;/p&gt;
&lt;h3 id="四次挥手"&gt;四次挥手&lt;/h3&gt;
&lt;p&gt;数据传输完毕后，双方都可释放连接。最开始的时候，客户端和服务器都是处于ESTABLISHED状态，假设客户端主动关闭，服务器被动关闭。&lt;/p&gt;
&lt;p&gt;&lt;img alt="四次挥手示意图" loading="lazy" src="https://static.ecool.fun//article/dbf0912c-a6df-48d0-8981-7224eae4492f.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;客户端发送一个FIN，用来关闭客户端到服务器的数据传送，也就是客户端告诉服务器：我已经不 会再给你发数据了(当然，在fin包之前发送出去的数据，如果没有收到对应的ack确认报文，客户端依然会重发这些数据)，但是，此时客户端还可以接受数据。&lt;/p&gt;
&lt;p&gt;FIN=1，其序列号为seq=u（等于前面已经传送过来的数据的最后一个字节的序号加1），此时，客户端进入FIN-WAIT-1（终止等待1）状态。 TCP规定，FIN报文段即使不携带数据，也要消耗一个序号。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第二次挥手：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;服务器收到FIN包后，发送一个ACK给对方并且带上自己的序列号seq，确认序号为收到序号+1（与SYN相同，一个FIN占用一个序号）。此时，服务端就进入了CLOSE-WAIT（关闭等待）状态。TCP服务器通知高层的应用进程，客户端向服务器的方向就释放了，这时候处于半关闭状态，即客户端已经没有数据要发送了，但是服务器若发送数据，客户端依然要接受。这个状态还要持续一段时间，也就是整个CLOSE-WAIT状态持续的时间。&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-156/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/"&gt;第 3 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的性能优化、核心监控指标、首屏时间的计算、业务价值验证、高频事件处理等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 11 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;1. 小程序性能优化做了哪些事情？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;题库原题：&lt;a href="https://fe.ecool.fun/topic/92e09b66-a9fc-435d-ad28-99011b2ddeaa"&gt;小程序可以做哪些性能优化？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序性能优化围绕逻辑层与视图层分离架构展开，重点是减少 setData 频率与数据体积，控制列表节点数量，优化首包体积与启动链路，并通过分包加载、WXS 与懒加载等手段降低渲染压力。核心原则是减少跨线程通信与避免无意义重渲染，从架构层面解决性能瓶颈。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的性能优化，不能只从“前端渲染”角度看。它的运行模型和 Web 不同，存在 &lt;strong&gt;逻辑层（JSCore）与视图层（WebView）分离&lt;/strong&gt; 的架构特征，核心瓶颈往往出在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨线程通信成本&lt;/li&gt;
&lt;li&gt;setData 传输体积&lt;/li&gt;
&lt;li&gt;渲染节点数量&lt;/li&gt;
&lt;li&gt;包体与启动链路&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优化必须围绕这些机制展开。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一理解运行架构是前提"&gt;一、理解运行架构是前提&lt;/h2&gt;
&lt;p&gt;以 微信小程序 为例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逻辑层：JS 执行环境&lt;/li&gt;
&lt;li&gt;视图层：WebView 渲染&lt;/li&gt;
&lt;li&gt;两层通过 JSON 序列化通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一次 &lt;code&gt;setData&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数据序列化&lt;/li&gt;
&lt;li&gt;线程间传输&lt;/li&gt;
&lt;li&gt;视图层 diff&lt;/li&gt;
&lt;li&gt;真实节点更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以小程序性能优化的第一原则是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;减少跨线程通信的数据量与次数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二控制-setdata-的粒度与频率"&gt;二、控制 setData 的粒度与频率&lt;/h2&gt;
&lt;h3 id="1-避免大对象全量更新"&gt;1. 避免大对象全量更新&lt;/h3&gt;
&lt;p&gt;错误方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;form&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;newFormObject&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果 form 很大，每次都会整体传输。&lt;/p&gt;
&lt;p&gt;正确方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;form.username&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用路径更新，最小化数据传输。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-合并多次-setdata"&gt;2. 合并多次 setData&lt;/h3&gt;
&lt;p&gt;多次调用：&lt;/p&gt;</description></item><item><title>小红书-社招-1年 · 第 2 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</link><pubDate>Sun, 01 Feb 2026 14:40:35 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-155/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/round-154/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-93/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了项目经验和技术选型，包括Vue3+TS的选择理由、UI框架的优势、TypeScript的应用、组件化方案、Canvas离屏渲染、Service Worker等内容。&lt;/p&gt;
&lt;p&gt;本轮共 14 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-5e97f1f58c95"&gt;1. 讲一下你觉的最有成就感的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;实际问题, 创新性, 用户价值, 项目背景, 技术选型, 实现过程, 最终效果, 亮点, 贡献&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;最有成就感的项目通常是那些能够解决实际问题、具有创新性并且对用户有显著价值的项目。在回答这个问题时，可以从项目的背景、目标、技术选型、实现过程以及最终效果等方面进行详细描述。重点突出项目的亮点和自己在其中的贡献。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-46188abebbf3"&gt;2. 项目为什么选择Vue3+TS而非React&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;Vue3 + TypeScript 的选择通常基于团队技术栈一致性、Composition API 带来的逻辑复用能力、与 TypeScript 的良好类型推导，以及在中后台场景中更成熟的生态和更低的工程复杂度，从而提升整体开发效率与可维护性。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;在技术选型阶段通常会综合考虑团队技术栈、项目复杂度以及开发效率等因素。对于以中后台系统或业务管理平台为主的项目，Vue3 在整体开发体验和约束能力上往往更容易形成统一规范。&lt;/p&gt;
&lt;p&gt;首先是框架设计层面的差异。Vue3 通过 Composition API 将逻辑拆分为可组合的函数单元，在复杂业务场景下可以很好地解决 Options API 中逻辑分散的问题，同时又保留了模板语法，使得结构、逻辑、样式之间的职责划分更加清晰。对于需要长期维护的业务项目，这种组织方式通常更容易理解和维护。&lt;/p&gt;
&lt;p&gt;其次是 TypeScript 的结合程度。Vue3 在框架层面对 TypeScript 做了较深的适配，例如 &lt;code&gt;defineComponent&lt;/code&gt;、&lt;code&gt;setup&lt;/code&gt;、&lt;code&gt;ref&lt;/code&gt;、&lt;code&gt;reactive&lt;/code&gt; 等 API 都有较完整的类型推导能力，配合 &lt;code&gt;&amp;amp;lt;script setup&amp;amp;gt;&lt;/code&gt; 可以获得较好的类型提示和开发体验。在大型项目中，类型系统能够帮助提前暴露接口契约问题，提高代码的可维护性。&lt;/p&gt;
&lt;p&gt;另外在生态与工程效率方面，Vue3 在国内中后台领域的组件生态较成熟，例如组件库、低代码平台以及相关工具链都比较完善，能够快速搭建业务系统。对于团队成员技术背景主要偏 Vue 的情况下，可以降低学习成本和沟通成本，提高整体开发效率。&lt;/p&gt;
&lt;p&gt;从工程复杂度角度看，React 在灵活性上更强，但很多能力需要通过生态组合实现，例如状态管理、表单方案等，需要额外制定规范。Vue3 本身提供了较完整的开发范式，在团队规模较大的情况下更容易形成统一的代码风格。&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-6d85386cc446"&gt;3. NutUI在营销活动中相比其他UI框架有什么优势&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;移动端, 轻量, 高性能, 易于使用, 组件库, 用户体验, 开发效率, 按需加载, 应用体积&lt;/p&gt;</description></item><item><title>小红书-社招-3年 · 第 3 轮 · 技术面试</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</link><pubDate>Sun, 01 Feb 2026 14:42:08 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-158/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/round-157/"&gt;第 2 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-94/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮概述：&lt;/strong&gt; 这一轮主要考察了小程序的低代码设计架构、Web Worker的使用、中台系统的微前端拆分策略等方面的知识。&lt;/p&gt;
&lt;p&gt;本轮共 4 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-002c3370fca7"&gt;1. 讲一下你关于小程序的低代码设计架构&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;小程序低代码架构本质是配置驱动的运行时体系，核心包括 DSL 协议设计、组件注册机制、运行时解析与数据驱动更新；必须围绕 setData 性能约束进行差量更新与渲染优化；工程重点不在编辑器，而在运行时引擎的性能治理与扩展能力设计。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;小程序的低代码架构，本质是在&lt;strong&gt;受限运行环境下实现“可配置驱动 UI 与逻辑”&lt;/strong&gt;。核心不是拖拽能力，而是如何让页面结构、交互逻辑、数据流都由配置驱动，同时保证性能与可维护性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一整体架构分层"&gt;一、整体架构分层&lt;/h2&gt;
&lt;p&gt;小程序低代码一般分为四层：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编辑层 → DSL 层 → 运行时引擎 → 渲染层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑层负责产出结构化配置；DSL 层定义组件树与属性协议；运行时负责解析与调度；渲染层落在小程序原生组件体系之上（如 WXML + setData 机制，在 微信小程序 中即运行于其渲染框架内）。&lt;/p&gt;
&lt;p&gt;关键问题在于：小程序不是虚拟 DOM 模型，而是逻辑层与视图层分离，通过 JSON 数据桥接，因此架构必须围绕数据驱动。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二dsl-设计"&gt;二、DSL 设计&lt;/h2&gt;
&lt;p&gt;DSL 通常采用 JSON Schema 形式，核心包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件类型&lt;/li&gt;
&lt;li&gt;属性 props&lt;/li&gt;
&lt;li&gt;样式&lt;/li&gt;
&lt;li&gt;事件绑定&lt;/li&gt;
&lt;li&gt;数据源&lt;/li&gt;
&lt;li&gt;条件显示规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;低代码的关键在于“协议稳定性”，一旦 DSL 设计混乱，后续扩展成本会极高。因此会设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件注册机制&lt;/li&gt;
&lt;li&gt;属性校验规则&lt;/li&gt;
&lt;li&gt;默认值策略&lt;/li&gt;
&lt;li&gt;版本兼容策略&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="三运行时引擎"&gt;三、运行时引擎&lt;/h2&gt;
&lt;p&gt;运行时是核心。&lt;/p&gt;</description></item></channel></rss>