1. 响应式系统 (Reactivity) —— 框架的“心脏”
你需要决定框架如何发现“数据变了”并通知 UI 更新。
-
机制选择:
- 基于 Diff (React 模式): 数据变了就重新执行函数,对比虚拟 DOM 树。优点是逻辑纯粹,缺点是需要优化手段(如
memo)。 - 基于侦听 (Vue/MobX 模式): 使用 Proxy 劫持属性,精准知道谁变了。优点是性能自动化,缺点是内存开销略大。
- 基于编译 (Svelte 模式): 在编译阶段就把变量和 DOM 操作绑定,没有运行时开销。
- 基于 Diff (React 模式): 数据变了就重新执行函数,对比虚拟 DOM 树。优点是逻辑纯粹,缺点是需要优化手段(如
-
更新粒度: 是组件级更新,还是像 Solid.js 那样实现极致的“细粒度更新”(直接修改具体的 DOM 节点)?
2. 渲染引擎 (Rendering) —— 框架的“手脚”
如何把你的状态变成用户看得见的 HTML?
-
表达方式:
- JSX: 灵活性极高,本质是 JS,对 IDE 和 AI 友好。
- Template: 约束性强,但方便编译器做静态提升(Static Hoisting)优化。
-
挂载策略:
- 虚拟 DOM (V-DOM): 在内存里算好差异,再批量操作真实 DOM。
- 离线 DOM: 或是像 Svelte 那样直接生成原生 DOM 操作代码。
3. 编译器 (Compiler) —— 框架的“大脑”
现代框架的竞争已经从“运行时”转移到了“编译时”。
- 静态分析: 编译器能不能识别出哪些 HTML 部分永远不会变(Static Content),从而在更新时直接跳过?
- 代码转换: 如何把你的自定义语法(比如
.neo文件)转换成浏览器认识的标准 JS/CSS。
4. 组件模型 (Component Model) —— 框架的“骨架”
开发者如何组织代码?
- 生命周期: 提供哪些钩子(Mount, Update, Unmount)?
- 逻辑复用: 是采用 Hooks 模式、Composition API 模式,还是传统的 Mixins?
- 样式封装: 是否内置 CSS-in-JS 或者类似 Scoped CSS 的方案?
5. 工程化与生态 (The "Unsexy" Part) —— 框架的“外壳”
一个框架能否流行,往往取决于这些“琐事”:
- 开发者工具 (DevTools): 必须能让开发者看见状态树和组件层级。
- 路由与状态管理: 是内置(如 Nuxt/Next.js 的思维),还是交给社区?
- 类型支持: 对 TypeScript 的原生支持(TSX)在 2026 年是必须项。
🚀 建议起步路径(MVP 阶段)
如果你想练手,建议按以下顺序尝试:
-
第一阶段: 实现一个简单的 信号系统 (Signals) 。
JavaScript
const [count, setCount] = signal(0); effect(() => console.log("Value changed:", count())); -
第二阶段: 实现一个简单的 JSX 解析器,并能将其转换为
document.createElement。 -
第三阶段: 把两者联动起来,实现“数据变了,页面上对应的数字自动变”。
vue原理
提到 Vue 的原理,我们通常是在讨论其**响应式系统(Reactivity)**以及它是如何将数据变化映射到视图上的。
Vue 的设计哲学是“渐进式”的,其底层逻辑可以概括为一个核心公式:UI=f(state) 。为了实现这个公式,Vue 主要依靠以下三大支柱:
1. 响应式系统 (Reactivity)
这是 Vue 的灵魂。Vue 3 使用了 ES6 的 Proxy 对象来实现数据劫持。
- 观察者模式: 当你把一个普通的 JavaScript 对象传入 Vue 实例时,Vue 会使用 Proxy 包装它。
- 依赖收集 (Track): 当组件渲染时,它会读取数据。此时 Vue 会记录下:“组件 A 使用了变量 X”。
- 派发更新 (Trigger): 当变量 X 发生变化时,Proxy 会捕捉到这个修改,并通知所有记录在案的依赖(组件 A),告诉它们该重新渲染了。
2. 虚拟 DOM (Virtual DOM) 与 Diff 算法
如果数据一变就直接操作真实 DOM,性能会非常差。Vue 在内存中维护了一棵“虚拟树”。
- 产生新树: 数据变化后,Vue 会生成一棵新的虚拟 DOM 树。
- 比对 (Diff): Vue 会将新树与旧树进行对比。Vue 的 Diff 算法非常聪明(采用了双端对比、静态提升等优化),它能快速找出真正发生变化的部分。
- 补丁 (Patch): 只有差异部分会被应用到真实的 DOM 上。这就像是局部手术,而不是全身换血。
3. 编译器 (Compiler)
Vue 的模板(Template)长得像 HTML,但浏览器并不认识它。编译器负责将其转换成 JS 代码。
- 静态标记 (Patch Flags): Vue 3 的编译器在解析模板时,会标记出哪些部分是动态的(比如
{{ msg }}),哪些是静态的(比如<div>Hello</div>)。 - 静态提升: 渲染时,静态节点会被提升到渲染函数之外,永远只创建一次。这样在更新时,Vue 可以直接跳过这些“雷打不动”的静态内容,性能极高。
4. 整体工作流程
我们可以把 Vue 的运行分为三个阶段:
- 初始化: 编译器将 Template 转化为 Render 函数。
- 挂载: 执行 Render 函数,触发响应式数据的
getter(依赖收集),生成虚拟 DOM,最后转换成真实 DOM。 - 更新: 数据被修改,触发
setter(派发更新)。Render 函数重新执行,生成新虚拟 DOM,经过 Diff 比对后,最小化更新真实 DOM。