关于 reference-core
面向 Angular 开发者的参考技能,介绍 `packages/core` 的运行时架构。内容涵盖渲染、依赖注入、变更检测和响应式机制,并说明核心代码的修改思路。
主要功能
- 01Ivy 指令式渲染
- 02LView 与 TView 内存模型
- 03分层依赖注入
- 04变更检测与 Signals
- 05核心代码与测试指引
适用场景
- 01追踪模板如何更新 DOM
- 02理解注入器的解析过程
- 03评估对 LView 或 TView 的修改
- 04查找核心实现与测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ angular/ angular --skill reference-core安装后在 Claude Code 中输入/reference-core确认已加载。
详细介绍
Angular 核心(packages/core)心智模型
本文概述了 packages/core 的架构和心智模型。packages/core 是 Angular 框架的核心。
1. 高层架构
packages/core 包含 Angular 的运行时逻辑。其主要职责包括:
- 渲染(Ivy/Render3):将模板转换为 DOM 更新。
- 依赖注入(DI):管理对象的创建和生命周期。
- 变更检测:让模型与视图保持同步。
- 响应式:Signals 与 Zone.js 集成。
2. 渲染引擎(Ivy / Render3)
渲染引擎(位于 packages/core/src/render3)采用基于指令的方式。
关键概念
-
指令:Angular 编译器会将模板转换为一系列指令调用(例如
ɵɵelementStart、ɵɵtext、ɵɵproperty)。这些指令在运行时执行,用于创建和更新视图。- 位置:
packages/core/src/render3/instructions
- 位置:
-
LView(逻辑视图):一个数组,其中包含特定视图实例的_状态_。它包含:
- DOM 节点(
RElement、RText)。 - 绑定值(用于变更检测)。
- 指令/组件实例。
- 上下文:
packages/core/src/render3/interfaces/view.ts
- DOM 节点(
-
TView(模板视图):描述视图_静态结构_的对象;其对应数组为
TView.data。同一组件/模板的所有实例(LView)共享该对象。它包含:- 绑定的属性名。
- 节点关系信息。
- 编译后的指令定义。
- 上下文:
packages/core/src/render3/interfaces/view.ts
-
内存布局:
LView和TView.data是并行数组。LView中索引i处的内容对应TView.data中索引i处的元数据。HEADER:固定大小,包含上下文(父级、宿主等)。DECLS:静态节点(元素、文本、管道)。VARS:绑定值。EXPANDO:动态数据(宿主绑定、注入器)。
渲染周期
- 创建模式:指令创建 DOM 节点,并将其存储在
LView中。 - 更新模式:指令会将当前值与存储在
LView中的旧值进行比较。如果值发生变化,就会更新 DOM。
3. 依赖注入(DI)
Angular 中的 DI 具有层级结构,并分为两个相互协作的系统:
模块注入器(R3Injector)
- 通过
@NgModule.providers或providedIn: 'root'配置。 - 存储在由多个
R3Injector实例构成的层级结构中。 - 位置:
packages/core/src/di/r3_injector.ts
节点注入器
- 通过
@Component.providers或@Directive.providers配置。 - 不是类,而是嵌入在
LView(“Expando”部分)中的数据结构。 - 使用 布隆过滤器(
TView.data),在沿树向上遍历之前,快速检查特定节点索引处是否存在某个令牌。 - 从当前节点开始解析令牌,沿视图树向上遍历(元素注入器层级);如果未找到,则回退到模块注入器。
4. 变更检测
- 脏检查:Angular 会检查模板中绑定的值是否发生变化。
- 策略:
OnPush:默认策略。当输入发生变化、事件触发、模板 Signals 更新,或视图被显式标记为需要检查时进行检查。Eager:每当变更检测遍历到该组件时,就会进行检查。(Default是已弃用的Eager别名。)
- Signals:新型响应式原语。Signals 发生变化时会通知调度器,从而有可能实现细粒度更新(无 Zone)。
5. 需要了解的关键目录
src/render3:Ivy 渲染引擎。instructions:由编译代码调用的运行时指令。interfaces:LView、TView、TNode定义。
src/di:依赖注入系统。src/change_detection:变更检测逻辑。src/zone:Zone.js 集成。src/render3/reactivity:Signals 实现(signal、computed、effect),基于primitives/signals中的响应式图。
6. 约定与注意事项
- 前缀:私有/内部导出项通常以
ɵ开头。 - 全局状态:Ivy 在执行指令期间大量依赖全局状态(例如
getLView()),以避免在各处传递上下文参数。这是为了提升性能并减小代码体积。 - 性能:代码针对性能和内存进行了高度优化。你会看到代码使用数组而非对象、位掩码以及手动内存管理模式。请遵循这些模式。
7. 如何修改核心代码
- 理解指令:如果要修改运行时行为,请在
src/render3/instructions中找到对应的指令。 - 检查
LView/TView的影响:如果要添加状态,请了解它在LView数组中的位置。 - 测试:核心代码有大量测试。使用 Bazel 运行这些测试。
评论
支持 Markdown