解读 @angular/core 公开 API 全景:基于 Angular 仓库 Public API Goldens 清单的深度技术导览
本文以 Angular 官方仓库中的核心包公开 API 清单 goldens/public-api/core/index.api.md 为主线,系统梳理 @angular/core 对外暴露的全部公共符号——从信号体系、资源异步加载、依赖注入,到组件指令、应用引导与变更检测。读者读完本文后,将能像阅读 API 报告一样快速定位任一核心 API 的签名、状态(@public / @deprecated)与职责边界,并理解这份清单如何通过 API Extractor 与 Bazel 测试守护 Angular 的公共 API 稳定性。
一、这份文档是什么:API Report 与 Public API Golden 机制
goldens/public-api/core/index.api.md 本质上是 API Extractor 自动生成的 API Report 文件(文档头部明确标注 "Do not edit this file. It is a report generated by API Extractor")。它的作用是:
- 充当公共 API 的"黄金快照"(Golden):
goldens/目录下按包组织(如 animations、common、router 等),每个包的公开符号签名都固化在这里; - 驱动 API 守卫测试:仓库根目录的 goldens/public-api/manage.js 通过 Bazel 查询
kind(js_test, //packages/...) intersect attr("tags", "api_guard", //packages/...)收集所有api_guard测试目标,并提供accept(接受新基线)与test(校验当前代码与基线一致)两个命令。也就是说,任何人改动@angular/core的公开 API 签名,都必须同步更新这份清单并通过测试,否则构建失败; - 作为开发者/工具链的权威索引:文档、编译器插件、代码生成器都可以基于它判断哪些符号属于稳定的公开契约。
文档中每个条目带有的 // @public、// @deprecated 注释,正是 API Extractor 对 API 可见性与生命周期的标注,它们是阅读这份清单的第一把钥匙。
二、信号体系:从 signal 到 effect 的响应式核心
@angular/core 的信号 API 是当前(Zone 可选的)响应式模型基石,清单中呈现了完整家族:
2.1 基础三件套:signal / computed / effect
// @public
export function signal<T>(initialValue: T, options?: CreateSignalOptions<T>): WritableSignal<T>;
// @public
export function computed<T>(computation: () => T, options?: CreateComputedOptions<T>): Signal<T>;
// @public
export function effect(effectFn: (onCleanup: EffectCleanupRegisterFn) => void, options?: CreateEffectOptions): EffectRef;
WritableSignal<T>提供set、update、asReadonly三个写入/投影方法,底层是packages/core/primitives/signals/src/signal.ts中的createSignal工厂——它基于SIGNAL_NODE原型创建响应式节点,存储value与equal比较函数,配合producerAccessed、producerNotifyConsumers等图算法完成依赖追踪;CreateSignalOptions<T>/CreateComputedOptions<T>均支持debugName(便于 DevTools 调试)与equal(自定义相等性判定,默认defaultEquals);effect的回调接收EffectCleanupRegisterFn(注册清理函数),CreateEffectOptions支持injector、manualCleanup、debugName,其中的allowSignalWrites已被标记@deprecated——说明信号写入限制的新模型已经成熟;EffectRef暴露唯一的destroy()用于手动销毁副作用。
2.2 派生信号:linkedSignal 与 untracked
// @public
export function linkedSignal<D>(computation: () => D, options?: {...}): WritableSignal<D>;
// @public
export function linkedSignal<S, D>(options: { source: () => S; computation: (source, previous?) => D; ... }): WritableSignal<D>;
// @public
export function untracked<T>(nonReactiveReadsFn: () => T): T;
linkedSignal 提供了"由其他信号派生、又允许被外部写入"的可写信号,previous 参数可拿到上一次的 source 与 value,适合实现"重置式"状态;untracked 则用于在响应式上下文中执行一次不建立依赖关系的读取,避免多余的重算。
2.3 渲染后钩子:afterRender / afterNextRender / afterRenderEffect
// @public
export function afterNextRender(callback: VoidFunction, options?: AfterRenderOptions): AfterRenderRef;
// @public
export function afterNextRender<E, W, M>(spec: { earlyRead?; write?; mixedReadWrite?; read? }, options?): AfterRenderRef;
// @public
export function afterEveryRender(callback: VoidFunction, options?: AfterRenderOptions): AfterRenderRef;
// @public
export function afterRenderEffect(callback: (onCleanup) => void, options?: AfterRenderOptions): AfterRenderRef;
afterNextRender只在下一次渲染完成后执行一次,适合操作 DOM 或测量布局;afterEveryRender则每次渲染后都会执行;- 带
spec的重载把回调划分为earlyRead(最早读取)、write(写 DOM)、mixedReadWrite、read四个阶段,配合ɵFirstAvailable类型保证阶段间数据可用性,这是 Angular 为规避"读写抖动"(layout thrashing)提供的显式阶段模型; afterRenderEffect让副作用在渲染后以信号响应式方式运行;AfterRenderOptions支持injector与manualCleanup,返回值AfterRenderRef通过destroy()手动注销。
2.4 查询信号:viewChild / viewChildren / contentChild / contentChildren
清单同时保留了传统的 ViewChild / ViewChildren / ContentChild / ContentChildren 装饰器,以及新一代的函数式信号查询:
// @public
export const viewChild: ViewChildFunction;
// @public
export function viewChildren<LocatorT>(locator: ProviderToken<LocatorT> | string, opts?): Signal<ReadonlyArray<LocatorT>>;
// @public
export const contentChild: ContentChildFunction;
函数式查询返回 Signal<T | undefined>,并提供 .required 变体(确保非空,缺失即报错);ViewChildFunction.required 直接返回 Signal<T>。信号查询与装饰器查询可混合使用,是逐步迁移到 signal-based 风格的官方路径。
2.5 信号化输入输出:input / output / model
// @public
export const input: InputFunction; // input<T>(), input(initialValue, opts), input.required<T>()
// @public
export function output<T = void>(opts?: OutputOptions): OutputEmitterRef<T>;
// @public
export const model: ModelFunction; // 双向绑定信号
InputFunction的重载覆盖了"无初值可空"、"带初值"、"带 transform"(InputOptionsWithTransform)等场景,InputOptions支持alias、debugName、transform;input返回的InputSignal/InputSignalWithTransform本质是Signal<T>的子类型(文档可见其品牌属性[SIGNAL]、[ɵINPUT_SIGNAL_BRAND_READ_TYPE]);ModelSignal<T>同时实现WritableSignal<T>、InputSignal<T>、OutputRef<T>,一个符号集齐"可读、可写、可对外发射"三种能力,配合model.required<T>()使用;- 传统的
Input/Output装饰器依旧保留(InputDecorator、OutputDecorator,Output仅alias一个配置项),OutputEmitterRef提供emit与subscribe,其订阅返回OutputRefSubscription(含unsubscribe)。
三、异步与资源加载:resource、debounced 与 onIdle
这是清单中信息量最大的领域之一,反映了 Angular 将异步数据获取纳入响应式信号体系的最新设计:
3.1 resource 与 ResourceRef
// @public
export function resource<T, R>(options: ResourceOptions<T, R> & { defaultValue: NoInfer<T> }): ResourceRef<T>;
// @public
export function resource<T, R>(options: ResourceOptions<T, R>): ResourceRef<T | undefined>;
Resource<T>暴露value、error、isLoading、status、snapshot五个只读信号,status取值枚举为'idle' | 'error' | 'loading' | 'reloading' | 'resolved' | 'local'(ResourceStatus类型);ResourceOptions是PromiseResourceOptions(loader: ResourceLoader<T,R>)与StreamingResourceOptions(stream: ResourceStreamingLoader<T,R>)的联合,二者互斥(loader?: never/stream?: never);ResourceLoaderParams<R>提供abortSignal(销毁或请求变更时自动取消在途加载)、params、previous;源码 packages/core/src/resource/resource.ts 的注释明确说明:resource面向读操作,加载基于AbortSignal取消,且其实现依赖PendingTasks、DestroyRef、TransferState与linkedSignal协同;ResourceRef额外提供set/update/reload/asReadonly/destroy,reload(): boolean用于手动刷新;- 派生辅助:
debounced(source, wait, options)对资源做防抖,wait可为毫秒数或函数(value, lastValue) => ...(DebounceTimer<T>);resourceFromSnapshots(source)从既有资源的snapshot派生出新资源,实现资源链式传递; - 错误模型:
ResourceDependencyError(携带dependency字段)用于资源间依赖异常,ResourceParamsStatus.IDLE / LOADING描述参数计算状态。
3.2 onIdle 与 IdleService
// @public
export function onIdle(options?: { timeout?: number }): Promise<void>;
// @public
export interface IdleService {
requestOnIdle(callback: (deadline?: IdleDeadline) => void, options?: IdleRequestOptions): number;
cancelOnIdle(id: number): void;
}
onIdle 返回在浏览器空闲时段 resolve 的 Promise,可配 timeout 兜底;IdleService 提供基于 ID 的注册/取消(适合批量注册后统一清理),并可通过 provideIdleServiceWith(useExisting) 注入自定义实现。它们常被用于在空闲时执行非关键的初始化或上报任务。
3.3 injectAsync 与预取
// @public
export function injectAsync<T>(loader: () => Promise<ProviderToken<T>>, options?: InjectAsyncOptions): () => Promise<T>;
// @public
export interface InjectAsyncOptions { prefetch?: PrefetchTrigger; }
// @public
export type PrefetchTrigger = () => Promise<void>;
injectAsync 支持"先注册后异步解析"的注入方式,prefetch 允许在真正取值前提前触发加载(如 injectAsync 配合模块级预取以摊平加载延迟)。
四、依赖注入体系
4.1 inject 与 Injector
// @public
export function inject<T>(token: ProviderToken<T>): T;
// @public
export function inject<T>(token: ProviderToken<T>, options: InjectOptions): T | null;
// @public
export function inject(token: HostAttributeToken): string;
// @public
export abstract class Injector {
static create(options: { providers: Array<Provider | StaticProvider>; parent?: Injector; name?: string }): DestroyableInjector;
static NULL: Injector;
static THROW_IF_NOT_FOUND: {};
}
inject的重载覆盖常规、可选、宿主属性(HostAttributeToken)三种场景,InjectOptions支持host/optional/self/skipSelf四个可见性开关;Injector.create的新签名返回DestroyableInjector(带destroy()),旧式create(providers, parent)已标记@deprecated;- 上下文断言:
assertInInjectionContext、assertNotInReactiveContext、runInInjectionContext(injector, fn)用于确保代码运行在正确的注入/响应式上下文。
4.2 令牌与 Provider 全家桶
InjectionToken<T>构造函数支持providedIn: Type<any> | 'root' | 'platform' | 'any' | null与factory,清单中的内置令牌包括APP_ID、APP_BOOTSTRAP_LISTENER、APP_INITIALIZER(已废弃)、DOCUMENT、LOCALE_ID、PLATFORM_ID、CSP_NONCE、DEFAULT_CURRENCY_CODE、ANIMATION_MODULE_TYPE、HOST_TAG_NAME、REQUEST、REQUEST_CONTEXT、RESPONSE_INIT、TRANSLATIONS、TRANSLATIONS_FORMAT、MAX_ANIMATION_TIMEOUT、COMPILER_OPTIONS等;- Provider 类型体系完整呈现:
ValueProvider/ClassProvider/ConstructorProvider/ExistingProvider/FactoryProvider(以及各自的*SansProvider底层形态),全部支持multi?: boolean;StaticProvider是上述五类的子集并含any[];Provider则是TypeProvider | ValueProvider | ... | any[]的联合; EnvironmentProviders作为品牌类型(ɵbrand: 'EnvironmentProviders')存在,makeEnvironmentProviders、importProvidersFrom、mergeApplicationConfig用于组装环境级 Provider。
4.3 生命周期与作用域
DestroyRef提供onDestroy(callback): () => void(返回退订函数)与destroyed标志,是组件/服务级清理的标准入口;EnvironmentInjector提供destroy()与按令牌解析的重载;- 装饰器
Inject/Optional/Self/SkipSelf/Host与HostAttributeToken(读取宿主元素属性值)并存,forwardRef/resolveForwardRef处理循环引用。
4.4 类装饰器的新形态
// @public
export const Injectable: InjectableDecorator;
// @public
export const Service: ServiceDecorator;
Injectable支持providedIn: Type<any> | 'root' | 'platform' | 'any' | null;- 新出现的
Service装饰器提供autoProvided(默认 true)与factory选项,autoProvided: false时声明"不自动注入"——从签名推断这是面向新型依赖解析方式(如属性化服务)的入口,属于较新 API。
五、组件、指令、管道与查询
5.1 装饰器与元数据
// @public
export interface Component extends Directive {
changeDetection?: ChangeDetectionStrategy;
encapsulation?: ViewEncapsulation;
imports?: (Type<any> | ReadonlyArray<any>)[];
standalone?: boolean;
styles?: string | string[];
styleUrl?: string;
styleUrls?: string[];
template?: string;
templateUrl?: string;
viewProviders?: Provider[];
// @deprecated animations?: any[];
}
// @public
export interface Directive {
selector?: string; exportAs?: string;
host?: { [key: string]: string };
hostDirectives?: (Type<unknown> | { directive; inputs?; outputs? })[];
inputs?: ({ name; alias?; required?; transform? } | string)[];
outputs?: string[]; providers?: Provider[]; standalone?: boolean; jit?: true;
}
// @public
export interface Pipe { name: string; pure?: boolean; standalone?: boolean; }
要点:
Component.inputs的完整对象语法(name+alias+required+transform)说明装饰器与信号化input()共享同一套元数据语义;ChangeDetectionStrategy枚举包含Default = 1(已废弃)、Eager = 1、OnPush = 0,Eager是Default的新名称;ViewEncapsulation枚举为Emulated = 0、ExperimentalIsolatedShadowDom = 4、None = 2、ShadowDom = 3;HostBinding/HostListener装饰器对应hostPropertyName与eventName + args;PipeTransform要求实现transform(value, ...args)。
5.2 生命周期钩子
清单完整列出全部钩子接口:OnChanges(ngOnChanges(changes: SimpleChanges))、OnInit、DoCheck、OnDestroy、AfterContentInit、AfterContentChecked、AfterViewInit、AfterViewChecked,以及模块引导接口 DoBootstrap(ngDoBootstrap(appRef))。SimpleChange<T> 携带 previousValue / currentValue / firstChange 与 isFirstChange(),SimpleChanges 类型还针对 signal input 做了键类型推导(通过 ɵINPUT_SIGNAL_BRAND_READ_TYPE 提取值类型)。
5.3 视图与渲染引用
ViewContainerRef:createComponent(支持index、injector、environmentInjector、projectableNodes、directives、bindings)、createEmbeddedView、insert/move/detach/remove/clear、get/indexOf/length、element/injector;TemplateRef<C>:createEmbeddedView(context, injector?)与elementRef;ComponentRef<C>:instance、location、injector、hostView、changeDetectorRef、componentType,setInput(name, value)与onDestroy(callback);ViewRef extends ChangeDetectorRef,EmbeddedViewRef<C>增加context与rootNodes;QueryList<T>提供changes可观察对象及first/last/length/toArray/filter/find/map/reduce/some/forEach等集合操作;reflectComponentType返回ComponentMirror<C>,可反射读取selector、inputs(含transform与isSignal)、outputs、isStandalone、ngContentSelectors、type。
5.4 动态创建与渲染器
createComponent(component, options)需要显式传入environmentInjector,这是独立于组件树的命令式创建入口;Renderer2抽象类列出全部渲染原语(createElement/createText/setProperty/setAttribute/listen/setStyle/selectRootElement等),listen支持ListenerOptions(capture/once/passive);RendererFactory2负责创建渲染器;RendererStyleFlags2含Important = 1、DashCase = 2;Sanitizer(sanitize(context, value))配合SecurityContext枚举(NONE=0、HTML=1、STYLE=2、SCRIPT=3、URL=4、RESOURCE_URL=5、ATTRIBUTE_NO_BINDING=6)构成安全清洗模型。
六、应用引导、平台与稳定性
6.1 引导 API
ApplicationRef:bootstrap<C>(component, options?)(新重载支持hostElement、directives、bindings)、attachView/detachView、tick()、destroy()、onDestroy、isStable/whenStable、viewCount、components、componentTypes、injector;PlatformRef:bootstrapModule/bootstrapModuleFactory(已废弃)、destroy、onDestroy、injector;platformCore创建核心平台;assertPlatform、getPlatform、createPlatform、createPlatformFactory、destroyPlatform组成平台生命周期工具集;ApplicationConfig仅含providers: Array<Provider | EnvironmentProviders>,mergeApplicationConfig(...configs)按顺序合并多个配置;ApplicationInitStatus(done、donePromise)与ApplicationModule是内部引导机制的一部分。
6.2 初始化与特性提供函数
清单罗列了一批 provide* 函数,构成了"特性化配置"的标准形态:
| 函数 | 签名要点 | 用途 |
|---|---|---|
provideZonelessChangeDetection |
(): EnvironmentProviders |
关闭 Zone.js,启用基于信号的变更检测 |
provideZoneChangeDetection |
(options?: NgZoneOptions): EnvironmentProviders |
保留 Zone,eventCoalescing / runCoalescing 控制合并策略 |
provideAppInitializer |
(initializerFn): EnvironmentProviders |
应用初始化(替代已废弃的 APP_INITIALIZER) |
provideEnvironmentInitializer |
(initializerFn: () => void) |
环境级初始化 |
providePlatformInitializer |
(initializerFn: () => void): StaticProvider |
平台级初始化 |
provideCheckNoChangesConfig |
({ exhaustive: false }) 或 ({ interval?, exhaustive: true }) |
配置变更检测校验(无 Zone 模式下的定期校验) |
provideBrowserGlobalErrorListeners |
(): EnvironmentProviders |
注册浏览器全局错误监听 |
provideStabilityDebugging |
(): EnvironmentProviders |
稳定性调试辅助 |
provideNgReflectAttributes |
(): EnvironmentProviders |
暴露 Ng 反射属性 |
provideIdleServiceWith |
(useExisting: AbstractType<IdleService> | InjectionToken<IdleService>) |
自定义空闲服务实现 |
provideExperimentalWebMcpTools |
(tools: WebMcpToolDescriptor[]) |
向页面注入实验性 Web MCP 工具 |
NgZone 类提供 run / runGuarded / runOutsideAngular / runTask 及 isStable、onMicrotaskEmpty、onStable、onError 等事件;NgZoneOptions 与 BootstrapOptions(ngZone、事件/运行合并,均已废弃)共同构成 Zone 兼容面。
6.3 稳定性与状态传递
PendingTasks:add(): () => void与run(fn: () => Promise<unknown>): void,用于把异步任务挂到"应用稳定"判定上(whenStable会等待);TransferState:set/get/hasKey/remove/onSerialize/toJson/isEmpty,配合makeStateKey<T>(key): StateKey<T>完成 SSR 状态从服务端到客户端的序列化传递(StateKey是带品牌标记的字符串类型);enableProdMode()、isDevMode()、enableProfiling()(返回停止函数)控制运行模式;ErrorHandler.handleError是全局错误处理扩展点;VERSION(Version类:full/major/minor/patch)供运行时读取版本信息。
七、工具函数与类型守卫
- 属性转换:
booleanAttribute(value): boolean(HTML 布尔属性语义:存在即 true)、numberAttribute(value, fallbackValue?): number; - 类型工具:
Type<T>、AbstractType<T>、ProviderToken<T>、DefaultExport<T>、ValueEqualityFn<T>、TrackByFunction<T>、Predicate<T>、NgIterable<T>; - 断言与状态:
isSignal、isWritableSignal、isStandalone、isDevMode; - 测试与调试:
DebugElement/DebugNode/DebugEventListener、getDebugNode、asNativeElements、setTestabilityGetter、Testability/TestabilityRegistry、GetTestability(用于 AngularJS 桥接与 E2E 稳定性检测); - 变更检测差异器:
IterableDiffers/KeyValueDiffers及其 ChangeRecord/Changes 接口、DefaultIterableDiffer(已废弃); - 事件发射:
EventEmitter<T>(实现Subject<T>与OutputRef<T>,构造函数isAsync控制异步发射); - 模式开关:
ChangeDetectionStrategy、MissingTranslationStrategy(Error=0、Warning=1、Ignore=2)、NO_ERRORS_SCHEMA/CUSTOM_ELEMENTS_SCHEMA、Attribute装饰器。
八、已废弃 API 速查(迁移避坑清单)
文档中的 @deprecated 标注直接指向应避免的新代码写法:
APP_INITIALIZER→ 使用provideAppInitializer;ENVIRONMENT_INITIALIZER→provideEnvironmentInitializer;PLATFORM_INITIALIZER→providePlatformInitializer;Compiler/CompilerFactory/NgModuleFactory/getModuleFactory/PlatformRef.bootstrapModuleFactory→ 现代 Ivy 已不需要显式编译器,createNgModule即可;BootstrapOptions(含ngZone字段)→ 由provideZonelessChangeDetection/provideZoneChangeDetection取代;ChangeDetectionStrategy.Default→ 更名为Eager(枚举值仍为 1);EffectOptions.allowSignalWrites→ 信号写入限制机制已演进;Injector.create(providers, parent)旧签名 → 使用对象签名以支持DestroyableInjector;EnvironmentInjector.runInContext与字符串令牌式get→ 由新签名取代;DefaultIterableDiffer、Component.animations、InjectionToken的providedIn: 'any'组合亦在废弃之列。
九、如何高效使用这份清单
- 作为 API 检索表:按符号名快速查找签名。文档按字母序排列,搜索
export function、export class、export const即可定位目标; - 判断 API 生命周期:看条目上方注释——
@public表示稳定契约,@deprecated表示已进入淘汰流程,无@packageDocumentation注释说明包级文档缺失(文档结尾有明确标注); - 对照源码加深理解:例如信号实现可深入 packages/core/primitives/signals/src/signal.ts(
createSignal的响应式节点与相等性比较逻辑),资源 API 可深入 packages/core/src/resource/resource.ts(其 JSDoc 明确resource仅面向读操作、基于AbortSignal取消在途请求,且标注@publicApi 22.0表明该 API 的公开版本起点); - 参与 API 治理:改动
@angular/core公开签名后,通过 goldens/public-api/manage.js 运行node goldens/public-api/manage.js test校验、node goldens/public-api/manage.js accept更新基线; - 按模块延伸阅读:同目录下还提供了 errors.api.md(核心错误码)、testing.api.md、rxjs-interop(
toObservable/toSignal)、primitives/signals 与 primitives/di 等子包清单,可拼出完整的 core 公共面。
十、结语
goldens/public-api/core/index.api.md 不仅是 CI 守护公共 API 的"黄金基线",更是一份按字母序组织的、可机器检索的 @angular/core 能力总览。它以 2178 行精炼签名浓缩了信号体系、资源加载、依赖注入、组件渲染、应用引导与平台抽象的完整契约——理解它,就等于拿到了阅读整个 Angular 核心源码与迁移新版本文档的索引地图。后续阅读任何 Angular 新特性时,先回到这份清单确认 API 的状态与签名,再深入对应源码,是最高效的研究路径。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0631
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00