@angular/core 是 Angular 框架的核心包,提供完整的 MVC 架构、依赖注入和双向绑定功能。react 是一个专注于视图层的 JavaScript 库,通过虚拟 DOM 和组件化思想构建用户界面。vue 是一个渐进式框架,结合模板语法与组合式 API,旨在降低上手难度。@stencil/core 是一个编译器,用于生成标准的 Web 组件,常用于构建跨框架的设计系统。
这四个工具代表了前端开发的四种不同思路。@angular/core 是全能型框架,react 是灵活库,vue 是渐进式框架,而 @stencil/core 是组件编译器。它们解决的问题域有重叠,但核心定位不同。让我们从工程师视角深入对比。
@angular/core 最近引入了 Signals 机制,不再完全依赖 Zone.js。
signal 创建响应式状态。{{ }} 插值或新控制流语法更新。// angular: 使用 Signals
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-counter',
template: `<button (click)=\"count.update(v => v + 1)\">{{ count() }}</button>`
})
export class Counter {
count = signal(0);
}
react 基于虚拟 DOM 和 Fiber 架构。
useState 钩子管理状态。// react: 使用 Hooks
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
vue 基于代理(Proxy)的响应式系统。
ref 或 reactive 定义状态。<!-- vue: 使用 Composition API -->
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
<template>
<button @click=\"count++\">{{ count }}</button>
</template>
@stencil/core 编译为原生 Web Components。
@State 装饰器监听变化。// stencil: 使用装饰器
import { Component, State, h } from '@stencil/core';
@Component({ tag: 'my-counter' })
export class MyCounter {
@State() count = 0;
render() {
return <button onClick={() => this.count++}>{this.count}</button>;
}
}
@angular/core 强制使用 TypeScript 类。
@Component 定义元数据。// angular: 类组件
@Component({
selector: 'app-user',
template: `<div>{{ user.name }}</div>`
})
export class UserComponent {
user = { name: 'Alice' };
}
react 推荐使用函数组件。
// react: 函数组件
function User() {
const user = { name: 'Alice' };
return <div>{user.name}</div>;
}
vue 支持单文件组件(SFC)。
<template>、<script>、<style> 放在一个文件中。<!-- vue: 单文件组件 -->
<template>
<div>{{ user.name }}</div>
</template>
<script setup>
const user = { name: 'Alice' };
</script>
@stencil/core 使用 TypeScript 类与 JSX。
// stencil: 类组件
@Component({ tag: 'my-user' })
export class MyUser {
user = { name: 'Alice' };
render() {
return <div>{this.user.name}</div>;
}
}
@angular/core 提供多种封装模式。
ViewEncapsulation.ShadowDom 或 Emulated。// angular: 样式封装
@Component({
styles: [`button { color: red; }`],
encapsulation: ViewEncapsulation.ShadowDom
})
react 本身不提供样式封装。
// react: 依赖外部方案
import styles from './Button.module.css';
function Button() {
return <button className={styles.btn}>Click</button>;
}
vue 内置 scoped 样式支持。
<style> 标签添加 scoped 属性。<!-- vue: scoped 样式 -->
<style scoped>
button { color: red; }
</style>
@stencil/core 默认使用 Shadow DOM。
// stencil: 默认 Shadow DOM
@Component({
tag: 'my-btn',
styleUrl: 'button.css',
shadow: true
})
这是选择时最关键的区别。
@angular/core、react、vue 用于构建完整的应用程序。
@stencil/core 用于构建组件库。
| 特性 | @angular/core | react | vue | @stencil/core |
|---|---|---|---|---|
| 类型 | 完整框架 | UI 库 | 渐进式框架 | 组件编译器 |
| 语言 | TypeScript | JavaScript/TS | JavaScript/TS | TypeScript |
| 响应式 | Signals / Zone.js | Hooks / State | Proxy / Ref | @State / Decorators |
| 模板 | HTML + 指令 | JSX | HTML + 语法糖 | JSX |
| 样式 | 内置封装 | 需自行选择 | 内置 scoped | Shadow DOM |
| 输出 | 框架应用 | 框架应用 | 框架应用 | 标准 Web Components |
@angular/core 适合大型企业项目 —— 需要严格规范、完整工具链和长期维护保障的场景。如果你不想自己挑选路由或 HTTP 库,选它。
react 适合高度定制化项目 —— 需要灵活架构、复杂交互或跨平台(如 React Native)的场景。如果你想要最大的社区支持和自由度,选它。
vue 适合快速开发与平衡型项目 —— 希望上手快、文档友好且功能足够的场景。如果你需要在开发效率和性能之间找平衡,选它。
@stencil/core 适合设计系统团队 —— 需要构建一套组件供多个不同技术栈的项目复用。如果你不是开发应用,而是开发组件库,选它。
总结:不要混用定位。如果是做应用,在前三者中选;如果是做组件库供他人使用,考虑 Stencil。
选择 @angular/core 如果你需要企业级解决方案,包含路由、表单和 HTTP 客户端等全套工具。它适合大型团队和复杂业务系统,强调类型安全和结构化开发。其 Opinionated 特性能减少架构决策成本,但学习曲线较陡。
选择 @stencil/core 如果你需要构建跨框架的 Web 组件库或设计系统。它不适合直接开发完整应用,而是用于生成可在任何框架中使用的标准组件。适合需要一次编写、多处运行且对性能有极高要求的底层组件场景。
选择 react 如果你需要极高的灵活性和庞大的生态系统支持。它适合需要自定义架构、复杂交互或与服务端组件集成的项目。社区资源丰富,但需要自行选择路由和状态管理库。
选择 vue 如果你希望在易学性和功能强大之间取得平衡。它适合快速开发、中小型项目以及需要平滑迁移旧代码的场景。官方维护的路由和状态管理库提供了开箱即用的体验。
The sources for this package are in the main Angular repo. Please file issues and pull requests against that repo.
Usage information and reference details can be found in Angular documentation.
License: MIT