<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Angular的道法术器 on 雪狼的书斋</title>
    <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/</link>
    <description>Recent content in Angular的道法术器 on 雪狼的书斋</description>
    <generator>Hugo</generator>
    <language>zh-hans</language>
    <atom:link href="/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>01.Angular，工程之美</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/010-angular%E5%B7%A5%E7%A8%8B%E4%B9%8B%E7%BE%8E/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/010-angular%E5%B7%A5%E7%A8%8B%E4%B9%8B%E7%BE%8E/</guid>
      <description>&lt;p&gt;如果只能用一个词来概括 Angular 的优点，那我会选「工程化」；如果要换个文艺点的词，我会说 「大巧若工，大道至简」。这个诞生于一群 Google 工程师之手的框架，从一开始就打上了鲜明的「工程化」烙印。&lt;/p&gt;&#xA;&lt;p&gt;什么是工程化开发呢？它是和手工作坊式的开发相对而言的。主要的特征是需要多人、多时段的分工与配合，而不是一个超级程序员写完90%的代码，其他人只负责打下手。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./engineering_beauty_images/workshop_vs_pipeline.jpg&#34; alt=&#34;文生图：一个对比鲜明的场景。左边是一个混乱的手工作坊，工具和零件散落一地，一个工匠满头大汗。右边是一条整洁、明亮的自动化流水线，机械臂正在精确地组装一个复杂的产品。风格：扁平化概念插画。&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;但大中型系统面对的挑战不是靠超级程序员就能解决的。如果一个系统的复杂性逐渐累积，迟早会让它的维护成本越来越高，变成鸡肋一般的存在。要解决复杂性的问题，首要办法就是从架构层面上隔离系统的各个部分，让它们彼此之间相互独立，互不干扰，也就是说，分而治之，各个击破。然而这并不容易。&lt;/p&gt;&#xA;&lt;h2 id=&#34;多人开发最大的挑战就是如何分工协作&#34;&gt;多人开发最大的挑战就是如何分工协作。&lt;a class=&#34;anchor&#34; href=&#34;#%e5%a4%9a%e4%ba%ba%e5%bc%80%e5%8f%91%e6%9c%80%e5%a4%a7%e7%9a%84%e6%8c%91%e6%88%98%e5%b0%b1%e6%98%af%e5%a6%82%e4%bd%95%e5%88%86%e5%b7%a5%e5%8d%8f%e4%bd%9c&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在现代 Angular 中，支持分工协作的主要基础设施，是&lt;strong&gt;清晰的代码组织结构&lt;/strong&gt;与强大的&lt;strong&gt;依赖注入（DI）体系&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;在过去，我们严重依赖 &lt;code&gt;NgModule&lt;/code&gt; 来划分应用的「硬边界」。而在以&lt;strong&gt;独立组件&lt;/strong&gt;（Standalone Components）为主流的今天，这种边界感通过一种更灵活、更自然的方式得以实现。想象一个 Monorepo 工作区，我们通常会建立应用和库两类目录：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;库目录：这里存放的是可复用的「零件」，比如 &lt;code&gt;ui-kit&lt;/code&gt;（共享组件库）、&lt;code&gt;data-access&lt;/code&gt;（数据访问服务）、&lt;code&gt;utils&lt;/code&gt;（工具函数）等。每个库都由一个或多个专注的团队负责。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;应用目录：这里存放的是最终的产品，比如 &lt;code&gt;main-app&lt;/code&gt;（主应用）、&lt;code&gt;admin-app&lt;/code&gt;（后台应用）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这种组织方式，天然地形成了团队间的「硬边界」。&lt;code&gt;ui-kit&lt;/code&gt; 团队的核心使命就是打磨出高质量、可复用的 UI 组件。他们无需关心 &lt;code&gt;main-app&lt;/code&gt; 的业务逻辑。&lt;/p&gt;&#xA;&lt;p&gt;而将这些独立的「零件」和「产品」无缝粘合起来的「万能胶」，就是 Angular 的&lt;strong&gt;依赖注入&lt;/strong&gt;体系。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;main-app&lt;/code&gt; 中的一个组件，可以通过 &lt;code&gt;inject(DataService)&lt;/code&gt; 来使用来自 &lt;code&gt;data-access&lt;/code&gt; 库的服务，而无需关心这个服务内部是如何实现 HTTP 请求的。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;如果将来我们需要更换数据来源，&lt;code&gt;data-access&lt;/code&gt; 团队可以无声无息地替换掉服务的内部实现，而 &lt;code&gt;main-app&lt;/code&gt; 的代码一行都不用改。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这种模式，将「代码的物理组织」和「逻辑的依赖关系」完美解耦。每个团队都可以专注于自己的「一亩三分地」（自己的项目或库），并通过 DI 这个「标准接口」与其他团队协作，避免了混乱的意外耦合。这才是现代前端工程中，「分而治之」的精髓。&lt;/p&gt;&#xA;&lt;h2 id=&#34;除了意外耦合的问题之外多人开发的另一个挑战就是契约&#34;&gt;除了意外耦合的问题之外，多人开发的另一个挑战就是契约。&lt;a class=&#34;anchor&#34; href=&#34;#%e9%99%a4%e4%ba%86%e6%84%8f%e5%a4%96%e8%80%a6%e5%90%88%e7%9a%84%e9%97%ae%e9%a2%98%e4%b9%8b%e5%a4%96%e5%a4%9a%e4%ba%ba%e5%bc%80%e5%8f%91%e7%9a%84%e5%8f%a6%e4%b8%80%e4%b8%aa%e6%8c%91%e6%88%98%e5%b0%b1%e6%98%af%e5%a5%91%e7%ba%a6&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;手工作坊式的开发可能不需要显式的契约，因为超级程序员「心怀宇宙」，了解整个系统的每一处关键点。但人一旦多了，这种方式的弊端就会显露出来，毕竟人类的心灵并不相通，并没有神圣的卡拉连接你我。这个时候，就需要显式地描述契约，并借助工具来保障这些契约没有被误解。&lt;/p&gt;&#xA;&lt;p&gt;在 Angular 中，用来应对契约问题的主要基础设施是&lt;strong&gt;类型&lt;/strong&gt;与&lt;strong&gt;测试&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;Angular 借助 TypeScript 来对类型提供支持。通过类型，Angular 可以对接口契约进行一定程度的表达。在开启了严格模式，特别是 &lt;code&gt;strictTemplates&lt;/code&gt; 之后，这份「契约」甚至延伸到了模板中，确保你在绑定属性、调用方法时，类型都是安全的。我们都知道，发现错误越早，解决它的代价就越低。&lt;/p&gt;&#xA;&lt;p&gt;不过，类型只能对契约进行一定程度的表达，但它无法表达「我要一个大于10小于1000的数字」之类的契约，这时候就需要不同层次的测试出手了。从最早的 AngularJS 开始，测试就一直是重中之重。在现代 Angular 中，测试一个独立组件变得前所未有地简单，因为你不再需要为了测试而建立一个复杂的 &lt;code&gt;TestBed&lt;/code&gt; 模块，只需在 &lt;code&gt;TestBed.configureTestingModule&lt;/code&gt; 的 &lt;code&gt;imports&lt;/code&gt; 中加入该组件依赖的少数几个「零件」即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>02.一文说透“依赖注入”</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/020-%E4%B8%80%E6%96%87%E8%AF%B4%E9%80%8F%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/020-%E4%B8%80%E6%96%87%E8%AF%B4%E9%80%8F%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5/</guid>
      <description>&lt;h2 id=&#34;什么是依赖&#34;&gt;什么是依赖？&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bb%80%e4%b9%88%e6%98%af%e4%be%9d%e8%b5%96&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;每个软件，都是由很多「组件」构成的。这里的「组件」是指广义的组件 ——&lt;/p&gt;&#xA;&lt;p&gt;组成部件，它可能是函数，可能是类，可能是包，也可能是微服务。软件的架构，就是组件以及组件之间的关系。而这些组件之间的关系，就是（广义的）依赖关系。&lt;/p&gt;&#xA;&lt;h2 id=&#34;依赖有多重要&#34;&gt;依赖有多重要？&lt;a class=&#34;anchor&#34; href=&#34;#%e4%be%9d%e8%b5%96%e6%9c%89%e5%a4%9a%e9%87%8d%e8%a6%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;软件的维护工作，本质上都是由「变化」引起的，只要软件还活着，我们就无法对抗变化，只能顺应它。而组件之间的依赖关系决定了变化的传导范围。&lt;/p&gt;&#xA;&lt;p&gt;一般来说，当被依赖的组件变化时，其依赖者也会随之变化。软件开发最怕的就是牵一发而动全身。所幸，并不是每次变化都必然会传导给它的依赖者们。&lt;/p&gt;&#xA;&lt;p&gt;对于具体实现细节的修改，只要没有改变其外部契约（可简单理解为接口），其依赖者就不需要修改。对于更大规模的修改，比如更换计费策略，我们是不是就无法控制其传播了？也不见得。只要我们的设计能让两者的接口保持一致，就可以把变化控制在尽可能小的范围内。&lt;/p&gt;&#xA;&lt;h2 id=&#34;整洁架构与-ioc&#34;&gt;整洁架构与 IoC&lt;a class=&#34;anchor&#34; href=&#34;#%e6%95%b4%e6%b4%81%e6%9e%b6%e6%9e%84%e4%b8%8e-ioc&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;对于减少变更传播的方式，Bob 大叔在《架构整洁之道》中做过系统性的阐述。其核心思想是：&lt;strong&gt;依赖关系的方向，应该指向更稳定、更核心的业务逻辑。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./dependency_injection_images_extra/%e6%95%b4%e6%b4%81%e6%9e%b6%e6%9e%84.png&#34; alt=&#34;整洁架构&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;在这张图中，所有的依赖箭头都指向了中心的「业务实体」。这意味着，无论是 UI、数据库还是外部框架，它们的变更，都不应该影响到核心的业务规则。&lt;/p&gt;&#xA;&lt;p&gt;这张图看起来很美，却和我们传统的编程方式截然不同。在传统的编程方式下，UI 层的组件需要 &lt;code&gt;new&lt;/code&gt; 一个业务服务类的实例，这就产生了一个从&lt;/p&gt;&#xA;&lt;p&gt;UI 指向业务服务的&lt;strong&gt;依赖&lt;/strong&gt;。但从架构重要性上说，业务服务比 UI 更核心，我们希望的是业务服务能「&lt;strong&gt;控制&lt;/strong&gt;」 UI，而不是被 UI 依赖。&lt;/p&gt;&#xA;&lt;p&gt;这种「&lt;strong&gt;控制&lt;/strong&gt;」 方向与「&lt;strong&gt;依赖&lt;/strong&gt;」 方向相反的理念，我们称之为「&lt;strong&gt;控制反转&lt;/strong&gt;」 （Inversion of Control, IoC）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;为什么要用依赖注入来管理依赖&#34;&gt;为什么要用依赖注入来管理依赖？&lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8%e4%be%9d%e8%b5%96%e6%b3%a8%e5%85%a5%e6%9d%a5%e7%ae%a1%e7%90%86%e4%be%9d%e8%b5%96&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;那么，如何实现「控制反转」呢？答案就是&lt;strong&gt;依赖注入（Dependency Injection, DI）&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;DI 的核心思想非常朴素：&lt;strong&gt;一个组件不应该自己创建它所需要的东西，而应该通过外部「喂」给它。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个「外部」，就是 Angular 框架为我们提供的 DI 体系。它就像一个无所不能的「大管家」或「三军总后勤部」。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./dependency_injection_images/butler.jpg&#34; alt=&#34;文生图：扁平插画风格，一位穿着燕尾服、一丝不苟的“大管家”正微笑着将一份新鲜的龙虾和一把闪亮的菜刀递给一位戴着厨师帽、专注于烹饪的厨师。背景是整洁明亮的现代化厨房，色彩温馨。&#34; /&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;它知道如何创建应用中所有需要的「物资」（服务实例）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;它也知道每一个「作战单元」（组件）需要哪些「物资」。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;当一个组件被创建时，DI 体系会自动把该组件所声明的依赖，准备好并「注入」给它。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;组件只需要过「衣来伸手，饭来张口」的生活，专注于自己的「作战任务」（业务逻辑），而无需关心「后勤补给」（依赖的创建和来源）。这种模式，就是依赖注入。&lt;/p&gt;&#xA;&lt;h2 id=&#34;现代-angular-中的-di-实现&#34;&gt;现代 Angular 中的 DI 实现&lt;a class=&#34;anchor&#34; href=&#34;#%e7%8e%b0%e4%bb%a3-angular-%e4%b8%ad%e7%9a%84-di-%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-御赐金牌providedin-root&#34;&gt;1. 「御赐金牌」：&lt;code&gt;providedIn: &#39;root&#39;&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-%e5%be%a1%e8%b5%90%e9%87%91%e7%89%8cprovidedin-root&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;在现代 Angular 中，将一个服务注册到 DI 体系中最简单、最推荐的方式，就是在服务的 &lt;code&gt;@Injectable&lt;/code&gt; 装饰器中，设置&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;providedIn: &#39;root&#39;&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;@Injectable&lt;/span&gt;({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;providedIn&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;root&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LoggerService&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;message&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这行代码，就像皇帝赐给 &lt;code&gt;LoggerService&lt;/code&gt; 一块「金牌」，告诉 DI 体系：&lt;/p&gt;</description>
    </item>
    <item>
      <title>03.领悟Angular之“道”：框架背后的设计哲学与核心思想</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/030-%E9%A2%86%E6%82%9Fangular%E4%B9%8B%E9%81%93%E6%A1%86%E6%9E%B6%E8%83%8C%E5%90%8E%E7%9A%84%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/030-%E9%A2%86%E6%82%9Fangular%E4%B9%8B%E9%81%93%E6%A1%86%E6%9E%B6%E8%83%8C%E5%90%8E%E7%9A%84%E8%AE%BE%E8%AE%A1%E5%93%B2%E5%AD%A6%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3/</guid>
      <description>&lt;p&gt;闯荡江湖多年，我发现一个很有趣的现象：每当谈起 Angular，总能看到两种截然不同的表情。有人觉得它「老派、厚重」，满是规矩，像一位不苟言笑的夫子；有人又觉得它「前卫、强大」，响应式编程玩得飞起，像一位身手矫健的少年。&lt;/p&gt;&#xA;&lt;p&gt;这两种看似矛盾的印象，恰恰点中了 Angular 设计哲学的核心。它不是非黑即白的单一体，而是一个寻求平衡与和谐的「矛盾统一体」。今天，雪狼不跟你聊具体的「术」，我们聊点虚的，聊聊 Angular 的「道」 —— 那藏在框架背后，不变的「内核」与流动的「血脉」。&lt;/p&gt;&#xA;&lt;h2 id=&#34;道在阴阳oop-的形与-fp-的气&#34;&gt;「道」在阴阳：OOP 的「形」与 FP 的「气」&lt;a class=&#34;anchor&#34; href=&#34;#%e9%81%93%e5%9c%a8%e9%98%b4%e9%98%b3oop-%e7%9a%84%e5%bd%a2%e4%b8%8e-fp-%e7%9a%84%e6%b0%94&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如果你要我用一个符号来描绘 Angular 的「道」，我会选择「太极」。它完美地诠释了 Angular 如何将两种看似对立的编程范式 —— &lt;strong&gt;面向对象（OOP）&lt;strong&gt;与&lt;/strong&gt;函数式编程（FP）&lt;/strong&gt; —— 融为一炉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_tao_images/oop_fp_taiji.jpg&#34; alt=&#34;文生图：一个抽象的太极图。阴鱼部分由稳固的齿轮和建筑结构线组成，象征OOP的稳定与结构；阳鱼部分由流动的数据流和函数符号（λ, f(x)）组成，象征FP的灵动与变化。两者相互环抱，无缝融合。风格：赛博朋克、概念艺术、蓝紫冷色调。&#34; /&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;oop-之阴不动如山的形&#34;&gt;OOP 之「阴」：不动如山的「形」&lt;a class=&#34;anchor&#34; href=&#34;#oop-%e4%b9%8b%e9%98%b4%e4%b8%8d%e5%8a%a8%e5%a6%82%e5%b1%b1%e7%9a%84%e5%bd%a2&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Angular 的整个骨架，是建立在坚实的面向对象原则之上的。&lt;strong&gt;组件、指令、服务、管道……它们的核心载体，依然是「类（Class）」&lt;/strong&gt;。这是 Angular 体系的「阴」，代表着稳定、结构与秩序。&lt;/p&gt;&#xA;&lt;p&gt;如果要修习一门绝世武功，必须先从扎马步开始、从站桩开始。Angular 亦是如此。OOP 就是 Angular 的「桩」，它为我们提供了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;坚实的结构&lt;/strong&gt;：类，是封装模板、样式和逻辑的完美容器。它像一座房子的承重墙，定义了应用的稳固形态。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;清晰的边界&lt;/strong&gt;：无论是 &lt;code&gt;NgModule&lt;/code&gt; 时代，还是如今的独立组件时代，DI 体系都依赖于类来建立清晰的依赖关系和职责边界。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;可靠的传承&lt;/strong&gt;：继承、封装、多态这些经典武器，在构建大型、可复用的基础库时，依然威力无穷。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;可以说，OOP 为 Angular 应用提供了可预测、可维护的「形体」，是它能够支撑起摩天大楼般企业级应用的「地基」。这份沉稳，是它面对复杂度的底气所在。&lt;/p&gt;&#xA;&lt;h3 id=&#34;fp-之阳其疾如风的气&#34;&gt;FP 之「阳」：其疾如风的「气」&lt;a class=&#34;anchor&#34; href=&#34;#fp-%e4%b9%8b%e9%98%b3%e5%85%b6%e7%96%be%e5%a6%82%e9%a3%8e%e7%9a%84%e6%b0%94&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;如果说 OOP 是 Angular 的「形」，那函数式编程就是贯穿其中的「气」，是驱动应用来响应变化的「血脉」。这是 Angular 体系的「阳」，代表着灵动、变化与流程。&lt;/p&gt;&#xA;&lt;p&gt;当用户的一个点击，引发了千里之外数据的一次刷新，这种复杂的、异步的连锁反应，正是 FP 的用武之地。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;RxJS&lt;/strong&gt;：作为 Angular 的「老朋友」，它本身就是函数式思想的杰作。它把事件看作一条奔流不息的「河」，用一套套纯函数「管道」（Operators）来对水流进行过滤、转换、合并，一切清晰明了。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt;：这是近年来最激动人心的变化，是 FP 思想更纯粹的体现。你不再需要命令式地去「修改」一个值，而是声明式地「描述」一个值与另一个值之间的派生关系。&lt;code&gt;computed&lt;/code&gt; 就是一个纯函数，它的值永远由它的依赖唯一确定。这让状态管理变得前所未有的简单和可预测。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;函数式「轻骑兵」&lt;/strong&gt;：以 &lt;code&gt;inject()&lt;/code&gt; 函数为代表，一系列函数式的路由守卫、拦截器纷纷登场。它们让我们得以用更轻量、更灵活的纯函数来组织逻辑，而不再处处受限于「类」的结构。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;FP 为 Angular 注入了灵魂，让那稳固的「形体」能够「气脉贯通」，以一种优雅、声明式的方式去应对现代应用中无处不在的「变化」。&lt;/p&gt;</description>
    </item>
    <item>
      <title>04.解构Angular之“法”：模块化、组件化、响应式编程的奥秘</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/040-%E8%A7%A3%E6%9E%84angular%E4%B9%8B%E6%B3%95%E6%A8%A1%E5%9D%97%E5%8C%96%E7%BB%84%E4%BB%B6%E5%8C%96%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E7%9A%84%E5%A5%A5%E7%A7%98/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/040-%E8%A7%A3%E6%9E%84angular%E4%B9%8B%E6%B3%95%E6%A8%A1%E5%9D%97%E5%8C%96%E7%BB%84%E4%BB%B6%E5%8C%96%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E7%9A%84%E5%A5%A5%E7%A7%98/</guid>
      <description>&lt;p&gt;我刚学编程那会儿，总是沉迷于「奇技淫巧」，觉得那才是「高手」的象征。后来栽的跟头多了，才慢慢悟出一个道理：真正决定一个开发者上限的，不是他会多少花里胡哨的「绝招」，而是他对几招「基本功」的理解有多深。真正的武学天才，不是万法皆通，而是&lt;strong&gt;一法通则万法通&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;在 Angular 这门「武学」里，同样如此。上一章我们聊了「道」，那是心法。今天，雪狼就带你拆解一下它的「法」 —— 连接心法与实践的「三大招式」：&lt;strong&gt;模块化&lt;/strong&gt;、&lt;strong&gt;组件化&lt;/strong&gt;和&lt;strong&gt;响应式编程&lt;/strong&gt;。这三招，就是 Angular 的「马步、出拳、吐纳」，是一切高阶招式得以落实的基础。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第一式模块化之法--分筋错骨将将之法&#34;&gt;第一式：模块化之「法」 —— 分筋错骨，将将之法&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e5%bc%8f%e6%a8%a1%e5%9d%97%e5%8c%96%e4%b9%8b%e6%b3%95--%e5%88%86%e7%ad%8b%e9%94%99%e9%aa%a8%e5%b0%86%e5%b0%86%e4%b9%8b%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;一个复杂的系统，就像一个难缠的巨人。想一口吞下它，必然会把自己噎死。高手会怎么做？「分筋错骨」，先把它拆解成一个个独立的、可以被「各个击破」的部分。这就是「模块化」的精髓。而我们只需要关注每个部分的「职责」，而非其内部的实现细节 —— 正如刘邦的「将将之法」。&lt;/p&gt;&#xA;&lt;p&gt;在过去，Angular 靠 &lt;code&gt;NgModule&lt;/code&gt; 这套「门派体系」来执行拆分。每个组件都得拜入山门，规矩森严，但也繁文缛节。如今，我们有了更厉害的招数 —— 以&lt;strong&gt;独立组件&lt;/strong&gt;为核心的「特种兵」作战模式。&lt;/p&gt;&#xA;&lt;p&gt;但没了「门派」的约束，大军团又该如何协同作战？答案是两样：&lt;strong&gt;代码组织&lt;/strong&gt; 和 &lt;strong&gt;依赖注入&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;微观上，组件是「自给自足」的&lt;/strong&gt;：每个独立组件，就是一个全副武装的「特种兵」。他在自己的「军备清单」（&lt;code&gt;@Component&lt;/code&gt; 的 &lt;code&gt;imports&lt;/code&gt; 数组）里，明确列出了执行任务所需的一切装备（其他组件、指令等）。他出征后就不再依赖「门派」的后勤，扔到任何战场都能打。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;宏观上，特种兵们靠的是 DI 这个「三军总后勤」&lt;/strong&gt;：如果说组件是「兵」，那依赖注入（DI）体系就是「三军总后勤部」。所有可复用的「军需物资」、「远程支援」（服务），都由它统一生产和调配。任何一个兵，无论在哪里，只要通过步话机喊一声 &lt;code&gt;inject(物资)&lt;/code&gt;，后勤部就会把标准化的物资精准空投到他手上。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_fa_images/di_as_logistics.jpg&#34; alt=&#34;文生图：扁平化概念插画，一个中心化的、发光的DI logo（依赖注入），通过光纤线路连接到一个个独立的、装备精良的“特种兵”士兵（独立组件），士兵之间没有直接连接。背景是清晰的文件夹目录结构。&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;看明白了吗？现代 Angular 的模块化之「法」，是将「排兵布阵」（代码组织）和「后勤补给」（依赖注入）的职责彻底分开了。这招「分筋错骨手」，让我们的应用在宏观上高度解耦，在微观上又极其内聚。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第二式组件化之法--千锤百炼铸造神兵&#34;&gt;第二式：组件化之「法」 —— 千锤百炼，铸造神兵&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac%e4%ba%8c%e5%bc%8f%e7%bb%84%e4%bb%b6%e5%8c%96%e4%b9%8b%e6%b3%95--%e5%8d%83%e9%94%a4%e7%99%be%e7%82%bc%e9%93%b8%e9%80%a0%e7%a5%9e%e5%85%b5&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如果说模块化是「拆」，那组件化就是「合」。它是将 UI 锻造成一把把「制式兵器」的法门。每一把兵器，都经过千锤百炼，遵循着统一的「制造标准」。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;@Component&lt;/code&gt; 装饰器&lt;/strong&gt;：就是这把兵器的「设计图纸」，规定了它的样式、材质和依赖。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;@Input()&lt;/code&gt; 和 &lt;code&gt;@Output()&lt;/code&gt;&lt;/strong&gt;：就是兵器的「接口」 —— 标准化的剑柄和剑鞘。无论士兵是谁，拿到就能用，插回就能还。数据从剑柄（&lt;code&gt;@Input&lt;/code&gt;）流入，行动结果从剑鞘（&lt;code&gt;@Output&lt;/code&gt;）上的信号流出。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这套「铸造神兵」的法门，让我们能像组装精密机械一样，用一堆标准化的「零件」拼装出千变万化的复杂界面。而且，任何一个零件坏了，我们随时可以换上一个同规格的，整个系统照常运转。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_fa_images/lego_components.jpg&#34; alt=&#34;文生图：一个放大的、半透明的乐高积木，内部是代码符号。积木的顶部凸点标着“@Output()”，底部的凹槽标着“@Input()”。几块这样的积木正在被一只手拼装成一个UI卡片的样子。风格：3D渲染、科技感、概念图。&#34; /&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;第三式响应式之法--吐纳心法驾驭内外之气&#34;&gt;第三式：响应式之「法」 —— 吐纳心法，驾驭内外之「气」&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac%e4%b8%89%e5%bc%8f%e5%93%8d%e5%ba%94%e5%bc%8f%e4%b9%8b%e6%b3%95--%e5%90%90%e7%ba%b3%e5%bf%83%e6%b3%95%e9%a9%be%e9%a9%ad%e5%86%85%e5%a4%96%e4%b9%8b%e6%b0%94&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如果说前两式是显而易见的「外功招式」，那响应式编程就是精微的「内功心法」。它教我们如何感知和引导应用内部与外部的「气」 —— 也就是无处不在的「变化」，并驱动这些招式来应对。&lt;/p&gt;&#xA;&lt;p&gt;在 Angular 中，这套心法有两大流派：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;RxJS 的「水之道」&lt;/strong&gt;：专治来自外部的、不可预测的「气」，比如用户的疯狂点击、鬼神莫测的网络延迟。它将这些异步事件视为一条奔流的「河」，用 &lt;code&gt;pipe&lt;/code&gt; 管道中的各种操作符（&lt;code&gt;debounceTime&lt;/code&gt;, &lt;code&gt;switchMap&lt;/code&gt;…）对其进行疏导、过滤、转化，让狂野的能量变得温驯可控。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Signals 的「光之道」&lt;/strong&gt;：主修应用内部的「气」，也就是同步状态。它在你的状态之间建立一个「感应网络」。当一个源头状态变化时，能量会像「光」一样，瞬间、精准地传导到所有相关的派生状态和 UI 上，没有一丝浪费，迅捷而又高效。&lt;/p&gt;</description>
    </item>
    <item>
      <title>05.掌握Angular之“术”：高效开发、性能优化、代码管理的独门绝技</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/050-%E6%8E%8C%E6%8F%A1angular%E4%B9%8B%E6%9C%AF%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86%E7%9A%84%E7%8B%AC%E9%97%A8%E7%BB%9D%E6%8A%80/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/050-%E6%8E%8C%E6%8F%A1angular%E4%B9%8B%E6%9C%AF%E9%AB%98%E6%95%88%E5%BC%80%E5%8F%91%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86%E7%9A%84%E7%8B%AC%E9%97%A8%E7%BB%9D%E6%8A%80/</guid>
      <description>&lt;p&gt;老夫年轻之时，闯荡江湖，见过两种人。一种，马步扎得稳，拳法也正，但一到实战就手忙脚乱。另一种，看似其貌不扬，却总能在关键时刻，用一两招「奇招」或「损招」一击制胜。&lt;/p&gt;&#xA;&lt;p&gt;这后者，就是懂「术」的人。&lt;/p&gt;&#xA;&lt;p&gt;在 Angular 的武林中，若「道」是内功心法，「法」是基础招式，那「术」就是这些从无数次真实战斗中淬炼出来的、能让你克敌制胜的「杀招」。它们不一定是最高深的理论，但一定是最管用的。今天，雪狼就传你几招压箱底的绝技。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第一类术高效开发之杀招--快准狠&#34;&gt;第一类「术」：高效开发之「杀招」 —— 快、准、狠&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e7%b1%bb%e6%9c%af%e9%ab%98%e6%95%88%e5%bc%80%e5%8f%91%e4%b9%8b%e6%9d%80%e6%8b%9b--%e5%bf%ab%e5%87%86%e7%8b%a0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;天下武功，唯快不破。写代码，同样追求效率。&lt;/p&gt;&#xA;&lt;h3 id=&#34;杀招一新式控制流出招更简洁&#34;&gt;杀招一：新式控制流，出招更简洁&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9d%80%e6%8b%9b%e4%b8%80%e6%96%b0%e5%bc%8f%e6%8e%a7%e5%88%b6%e6%b5%81%e5%87%ba%e6%8b%9b%e6%9b%b4%e7%ae%80%e6%b4%81&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;忘掉 &lt;code&gt;*ngIf&lt;/code&gt;、&lt;code&gt;*ngFor&lt;/code&gt; 和 &lt;code&gt;CommonModule&lt;/code&gt; 那些陈年旧事吧。Angular v17 带来的新式内置控制流，就是一套更快、更准的连招。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;@if (user$ | async; as user) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;欢迎, {{ user.name }}!&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h2&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;} @else {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;请登录...&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @for (item of items; track item.id) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;{{ item.name }}&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } @empty {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;暂无数据&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;li&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;ul&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这套招式妙就妙在，它让你出招时几乎没有前摇（无需导入&lt;code&gt;CommonModule&lt;/code&gt;），招式本身（&lt;code&gt;@if/@else&lt;/code&gt;）也比过去的各种 &lt;code&gt;ng-template&lt;/code&gt; 障眼法清晰得多。更狠的是，&lt;code&gt;@for&lt;/code&gt; 这一招自带「锁定」效果（强制 &lt;code&gt;track&lt;/code&gt;），逼着你避开常见的性能陷阱。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_shu_images/control_flow_compare.jpg&#34; alt=&#34;文生图：一个对比图，左边是杂乱的*ngIf, ng-template, else等代码块，像一团乱麻。右边是清晰的@if/@else块状代码，像整齐的积木。风格：信息图表。&#34; /&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;杀招二async-管道自带金钟罩&#34;&gt;杀招二：&lt;code&gt;async&lt;/code&gt; 管道，自带「金钟罩」&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9d%80%e6%8b%9b%e4%ba%8casync-%e7%ae%a1%e9%81%93%e8%87%aa%e5%b8%a6%e9%87%91%e9%92%9f%e7%bd%a9&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;此「术」虽老，但威力不减，堪称响应式防守的「终极奥义」。只要你用 &lt;code&gt;async&lt;/code&gt; 管道来处理 Observable，就等于给自己套上了一层「金钟罩」。它自动帮你完成了订阅、解包、刷新、销毁的全套动作，让你百毒不侵，从根源上杜绝了内存泄漏这个最大、最隐蔽的内伤。&lt;/p&gt;&#xA;&lt;h2 id=&#34;第二类术性能优化之杀招--静准懒&#34;&gt;第二类「术」：性能优化之「杀招」 —— 静、准、懒&lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%ac%e4%ba%8c%e7%b1%bb%e6%9c%af%e6%80%a7%e8%83%bd%e4%bc%98%e5%8c%96%e4%b9%8b%e6%9d%80%e6%8b%9b--%e9%9d%99%e5%87%86%e6%87%92&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;高明的刺客，从不浪费一丝体力。他们追求一击毙命，讲究「静、准、懒」。优化性能，也是这个道理。&lt;/p&gt;</description>
    </item>
    <item>
      <title>06.玩转Angular之“器”：CLI、IDE、测试工具，你的神兵利器！</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/060-%E7%8E%A9%E8%BD%ACangular%E4%B9%8B%E5%99%A8cliide%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%E4%BD%A0%E7%9A%84%E7%A5%9E%E5%85%B5%E5%88%A9%E5%99%A8/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/060-%E7%8E%A9%E8%BD%ACangular%E4%B9%8B%E5%99%A8cliide%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%E4%BD%A0%E7%9A%84%E7%A5%9E%E5%85%B5%E5%88%A9%E5%99%A8/</guid>
      <description>&lt;p&gt;老夫年少轻狂之时，曾拜访过一位顶级铸剑师。我问他，铸造一把绝世好剑的秘诀是什么？他没回答，只是笑了笑，指了指他那熊熊燃烧的熔炉、厚重的铁锤和布满划痕的磨刀石，说：「&lt;strong&gt;一把剑的好坏，一半在钢，一半在它们。&lt;/strong&gt;」&lt;/p&gt;&#xA;&lt;p&gt;这个道理，放在我们程序员的江湖里，同样适用。你的「道」、「法」、「术」修炼得再高，若是手中的「兵器」还停留在石器时代，一样成不了气候。今天，雪狼就带你巡视一番现代 Angular 大师的「军火库」，看看我们的三大「神兵利器」 —— &lt;strong&gt;CLI、IDE 和测试工具&lt;/strong&gt; —— 都进化到了何种地步。&lt;/p&gt;&#xA;&lt;h2 id=&#34;神器一万能工坊-angular-cli&#34;&gt;神器一：万能工坊 Angular CLI&lt;a class=&#34;anchor&#34; href=&#34;#%e7%a5%9e%e5%99%a8%e4%b8%80%e4%b8%87%e8%83%bd%e5%b7%a5%e5%9d%8a-angular-cli&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Angular CLI 永远是你军火库中最核心的「万能工坊」，它负责「锻造」和「重铸」你的一切。而如今，这座工坊的「熔炉」已经换上了 &lt;strong&gt;Vite + esbuild&lt;/strong&gt; 这个全新的动力核心。&lt;/p&gt;&#xA;&lt;p&gt;这意味着什么？意味着&lt;strong&gt;闪电般的速度&lt;/strong&gt;！无论是 &lt;code&gt;ng serve&lt;/code&gt; 热更新，还是 &lt;code&gt;ng build&lt;/code&gt; 打包，速度都比以往快了数倍乃至数十倍。那种改一行代码，喝杯茶再回来看结果的（悠闲）日子，一去不复返了。&lt;/p&gt;&#xA;&lt;p&gt;除了「快」，这座工坊的几项「祖传手艺」也愈发精进：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;ng update&lt;/code&gt;（时光机）&lt;/strong&gt;：这已然是 CLI 的战略级武器。它不仅帮你升级，还会自动运行迁移脚本，把你的旧代码（如 &lt;code&gt;*ngIf&lt;/code&gt;）无痛升级为新语法。它让你能毫不费力地「穿越」到最新的技术时代。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;ng g @angular/core:standalone&lt;/code&gt;（一键迁徙）&lt;/strong&gt;：这是工坊的新绝技，能扫描你的旧项目，并像一位老道的师傅一样，引导你把笨重的 &lt;code&gt;NgModule&lt;/code&gt; 架构，重铸为轻快、现代的 Standalone 架构。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;神器二全知之眼-ide&#34;&gt;神器二：全知之眼 IDE&lt;a class=&#34;anchor&#34; href=&#34;#%e7%a5%9e%e5%99%a8%e4%ba%8c%e5%85%a8%e7%9f%a5%e4%b9%8b%e7%9c%bc-ide&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;你的 IDE（无论是 VS Code 还是 WebStorm），不应只是个记事本，它得是你的「全知之眼」，你的「贾维斯」。要开这「天眼」，关键在于装对插件。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Angular Language Service（官方「目镜」）&lt;/strong&gt;：这是你观察 Angular 世界的「基础镜片」，现在，它已经能完美识别独立组件和 &lt;code&gt;@for&lt;/code&gt; 等新语法。你写的每一个 &lt;code&gt;import&lt;/code&gt;，每一个 &lt;code&gt;@if&lt;/code&gt;，它都能洞若观火，为你提供精准的补全和纠错。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;ESLint / Prettier（戒律标尺）&lt;/strong&gt;：它们是刻在你眼中的「标尺」，确保你写出的每一行代码，都符合团队的「戒律」，整齐划一，毫无争议。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Debugger（真实审讯室）&lt;/strong&gt;：别再用 &lt;code&gt;console.log&lt;/code&gt; 满世界打游击了！学会使用断点、监视表达式，在「审讯室」里让 Bug 无所遁形，这才是专业人士的体面。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_qi_images/ide_as_jarvis.jpg&#34; alt=&#34;文生图：赛博朋克风格插画，一个程序员戴着VR眼镜，眼前是VS Code的界面，代码、错误提示、变量值以全息形式漂浮在空中，与他的大脑直接连接，体现了IDE的强大辅助功能。&#34; /&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;神器三演武场-测试工具集&#34;&gt;神器三：演武场 测试工具集&lt;a class=&#34;anchor&#34; href=&#34;#%e7%a5%9e%e5%99%a8%e4%b8%89%e6%bc%94%e6%ad%a6%e5%9c%ba-%e6%b5%8b%e8%af%95%e5%b7%a5%e5%85%b7%e9%9b%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;测试，是你打磨招式、检验兵器的「演武场」。它让你在面对真正的敌人（生产环境的 Bug）之前，早已心中有数。在独立组件时代，这场「演练」变得空前轻松。&lt;/p&gt;</description>
    </item>
    <item>
      <title>07.Angular的“心法”：理解变更检测，告别前端性能瓶颈</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/070-angular%E7%9A%84%E5%BF%83%E6%B3%95%E7%90%86%E8%A7%A3%E5%8F%98%E6%9B%B4%E6%A3%80%E6%B5%8B%E5%91%8A%E5%88%AB%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/070-angular%E7%9A%84%E5%BF%83%E6%B3%95%E7%90%86%E8%A7%A3%E5%8F%98%E6%9B%B4%E6%A3%80%E6%B5%8B%E5%91%8A%E5%88%AB%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88/</guid>
      <description>&lt;p&gt;我带过很多弟子，发现他们从入门到开悟，往往都卡在一个名叫「变更检测」的坎上。他们总觉得视图更新像一种神秘的「魔法」，时而灵验无比，时而又莫名其妙地给你一个 &lt;code&gt;ExpressionChangedAfterItHasBeenCheckedError&lt;/code&gt; 的「诅咒」，让人摸不着头脑。&lt;/p&gt;&#xA;&lt;p&gt;这背后并非魔法，而是 Angular 「心脏」的一次搏动。能否掌控这颗心脏的跳动节奏，是区分「玩家」与「大师」的分水岭。今天，雪狼就向你传授这门与时俱进的「心法」。&lt;/p&gt;&#xA;&lt;h2 id=&#34;初阶心法zonejs-的天罗地网&#34;&gt;初阶心法：Zone.js 的「天罗地网」&lt;a class=&#34;anchor&#34; href=&#34;#%e5%88%9d%e9%98%b6%e5%bf%83%e6%b3%95zonejs-%e7%9a%84%e5%a4%a9%e7%bd%97%e5%9c%b0%e7%bd%91&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在 Signals 出现之前，Angular 的响应式魔法，几乎完全依赖于它的左膀右臂 —— &lt;strong&gt;Zone.js&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;你可以把它想象成一张覆盖整个应用的、无形的「&lt;strong&gt;天罗地网&lt;/strong&gt;」 。它通过「猴子补丁」（Monkey-patching）技术，将浏览器里所有可能引起变化的异步 API（&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;Promise&lt;/code&gt;, &lt;code&gt;addEventListener&lt;/code&gt; 等）全部「劫持」了。只要网中任何一个地方有风吹草动，它都会立刻向 Angular 发出警报：「嘿，有事发生了，快检查一下！」&lt;/p&gt;&#xA;&lt;p&gt;这个警报，就是触发 Angular 从上到下、进行一次&lt;strong&gt;全局变更检测&lt;/strong&gt;的「扳机」。这就像一个神经过敏的新手，听到一点声音就全身紧绷，做出一次完整的戒备动作。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：对开发者来说，很「自动」，很省心。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：效率极低。不管动静大小，总是把整棵组件树都犁一遍（当然，实现上做了很多优化）。性能开销大，还容易「走火入魔」（出现 &lt;code&gt;ExpressionChanged...&lt;/code&gt; 错误）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;进阶心法onpush-的静心诀&#34;&gt;进阶心法：&lt;code&gt;OnPush&lt;/code&gt; 的「静心诀」&lt;a class=&#34;anchor&#34; href=&#34;#%e8%bf%9b%e9%98%b6%e5%bf%83%e6%b3%95onpush-%e7%9a%84%e9%9d%99%e5%bf%83%e8%af%80&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;为了对抗 Zone.js 的「过度警觉」，我们这些老江湖摸索出了一套 &lt;code&gt;OnPush&lt;/code&gt; 的「静心诀」。通过在组件上标注 &lt;code&gt;changeDetection: ChangeDetectionStrategy.OnPush&lt;/code&gt;，我们等于告诉这个组件：「进入禅定，不要理会外界的纷纷扰扰。只有当你的『口粮』（&lt;code&gt;@Input&lt;/code&gt; 引用）变了，或者你自己内部有明确的事件发生时，才需要醒来检查一次。」&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;OnPush&lt;/code&gt; 极大地提升了性能，但也要求我们严格遵守「不可变数据」的戒律，增加了修行难度。它是在 Zone.js 体系下，我们能达到的最佳「手动优化」。&lt;/p&gt;&#xA;&lt;h2 id=&#34;大师心法signals-的无心之境&#34;&gt;大师心法：Signals 的「无心之境」&lt;a class=&#34;anchor&#34; href=&#34;#%e5%a4%a7%e5%b8%88%e5%bf%83%e6%b3%95signals-%e7%9a%84%e6%97%a0%e5%bf%83%e4%b9%8b%e5%a2%83&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Angular Signals 的出现，则彻底颠覆了这门心法。它不再需要 Zone.js 的「天罗地网」，而是由内而外，构建了一张&lt;strong&gt;精准的、点对点的「依赖图谱」&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;心法奥义&lt;/strong&gt;：当一个组件的模板中读取了某个 &lt;code&gt;signal&lt;/code&gt; 的值（&lt;code&gt;mySignal()&lt;/code&gt;），它就在自己和这个 &lt;code&gt;signal&lt;/code&gt; 之间，建立了一条直接的「因果线」。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;运行机制&lt;/strong&gt;：当 &lt;code&gt;mySignal&lt;/code&gt; 的值被更新时，它会像内力传导一样，沿着这些「因果线」，&lt;strong&gt;只通知&lt;/strong&gt;那些真正依赖它的组件去更新自身。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果说 Zone.js 是「一人有事，全村广播」，那么 Signals 就是「点对点私信，谁家有事，只通知谁家亲戚」。它达到了一种「无心而动，动必有因」的至臻境界。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;新旧心法对比：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;假设你要做一个简单的计数器。&lt;/p&gt;&#xA;&lt;p&gt;用旧心法（&lt;code&gt;OnPush&lt;/code&gt; + &lt;code&gt;BehaviorSubject&lt;/code&gt;），你需要服务、&lt;code&gt;Observable&lt;/code&gt;、&lt;code&gt;OnPush&lt;/code&gt;、&lt;code&gt;async&lt;/code&gt; 管道……一套组合拳才能打好。&lt;/p&gt;&#xA;&lt;p&gt;而用新心法（Signal-based），代码锐减，逻辑直观：&lt;/p&gt;</description>
    </item>
    <item>
      <title>08.从“形”到“神”：Angular中的依赖注入，你真的懂了吗？</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/080-%E4%BB%8E%E5%BD%A2%E5%88%B0%E7%A5%9Eangular%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E4%BD%A0%E7%9C%9F%E7%9A%84%E6%87%82%E4%BA%86%E5%90%97/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/080-%E4%BB%8E%E5%BD%A2%E5%88%B0%E7%A5%9Eangular%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E4%BD%A0%E7%9C%9F%E7%9A%84%E6%87%82%E4%BA%86%E5%90%97/</guid>
      <description>&lt;p&gt;这些年，总有人跟我说：「雪狼，Angular 的 DI 我懂，不就是 &lt;code&gt;constructor(private service: MyService)&lt;/code&gt; 嘛，简单！」&lt;/p&gt;&#xA;&lt;p&gt;每当这时，我都会笑一笑，告诉他：「兄弟，你看到的，只是冰山一角，是 DI 的『形』。它真正的威力，那掌控应用血脉、让你拥有上帝般创造力的部分，藏在水面之下。那，才是它的『神』。」&lt;/p&gt;&#xA;&lt;p&gt;今天，我就带你潜入深水，一同探寻 DI 的「神」之领域。&lt;/p&gt;&#xA;&lt;h2 id=&#34;di-之神非扁平江湖实乃层级王朝&#34;&gt;DI 之「神」：非「扁平江湖」，实乃「层级王朝」&lt;a class=&#34;anchor&#34; href=&#34;#di-%e4%b9%8b%e7%a5%9e%e9%9d%9e%e6%89%81%e5%b9%b3%e6%b1%9f%e6%b9%96%e5%ae%9e%e4%b9%83%e5%b1%82%e7%ba%a7%e7%8e%8b%e6%9c%9d&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;多数人对 DI 最大的误解，就是以为它只是一个扁平的、全局的「服务中心」。大错特错！&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Angular 的注入器体系，不是一个混沌的江湖，而是一个等级森严、与你的组件树一一对应的「层级王朝」。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_di_spirit_images/hierarchical_injector.jpg&#34; alt=&#34;文生图：一棵发光的树，树根是RootInjector，树干是AppModule的Injector，每个树枝和树叶（代表组件）上都有一个更小的、发光的节点，代表它们自己的Injector。一个请求（光点）从一片叶子发出，沿着树枝、树干，一直向上追溯到树根。风格：数字、科技感。&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;这个王朝的法则很简单，就像古代官员「寻找上级」：当一个组件（地方官员）需要一个依赖（一道批文）时，它先看自己的「衙门」（自身注入器）有没有。没有？那就沿着组件树向上，去「州府」（父组件注入器）找，再没有，就一路找到「京城」（根注入器）。&lt;/p&gt;&#xA;&lt;p&gt;这个「层级」设计，就是 DI 的「神魂」所在。它赋予了你精细化控制服务实例生命周期的无上权力：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;根注入器&lt;/strong&gt;：通过 &lt;code&gt;@Injectable({ providedIn: &#39;root&#39; })&lt;/code&gt; 注册的服务，是王朝的「中央军」，全局唯一，贯穿始终。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;路由注入器&lt;/strong&gt;：在惰性加载路由中提供的服务，是镇守一方的「节度使」，只在进入其辖区时才上任。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;组件注入器&lt;/strong&gt;：在组件 &lt;code&gt;providers&lt;/code&gt; 数组中提供的服务，是组件的「私家护卫」，每个组件实例都会配备一套全新的卫队。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;di-之法四道圣旨与-inject-的王炸&#34;&gt;DI 之「法」：四道「圣旨」与 &lt;code&gt;inject()&lt;/code&gt; 的「王炸」&lt;a class=&#34;anchor&#34; href=&#34;#di-%e4%b9%8b%e6%b3%95%e5%9b%9b%e9%81%93%e5%9c%a3%e6%97%a8%e4%b8%8e-inject-%e7%9a%84%e7%8e%8b%e7%82%b8&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;providers&lt;/code&gt; 数组可不是简单的名单，它是皇帝颁发不同依赖的四种「圣旨」，每一种都有其妙用。&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;useClass&lt;/code&gt; (偷天换日)&lt;/strong&gt;：&lt;code&gt;{ provide: Logger, useClass: BetterLogger }&lt;/code&gt;。这道圣旨说：「凡有索要 &lt;code&gt;Logger&lt;/code&gt; 者，赐 &lt;code&gt;BetterLogger&lt;/code&gt;！」 这是实现「面向接口编程」的无上法门。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;useValue&lt;/code&gt; (开箱即食)&lt;/strong&gt;：&lt;code&gt;{ provide: APP_CONFIG, useValue: {...} }&lt;/code&gt;。这道圣旨最直接：「把这个朕亲手打包好的 &lt;code&gt;APP_CONFIG&lt;/code&gt; 对象，直接发下去！」&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;useFactory&lt;/code&gt; + &lt;code&gt;inject()&lt;/code&gt; (炼丹术)&lt;/strong&gt;：这是最强的「王炸」组合。&lt;code&gt;useFactory&lt;/code&gt; 相当于一道命令：「宣『炼丹宗师』上殿，为朕现场炼制此物！」 而现代的 &lt;code&gt;inject()&lt;/code&gt; 函数，则让这位宗师拥有了在炼丹过程中，随时从天地间（当前注入上下文）汲取灵气（其他依赖）的通天神力。&lt;/p&gt;</description>
    </item>
    <item>
      <title>09.Angular的“气”：RxJS响应式编程，让你的数据流如行云流水</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/090-angular%E7%9A%84%E6%B0%94rxjs%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E8%AE%A9%E4%BD%A0%E7%9A%84%E6%95%B0%E6%8D%AE%E6%B5%81%E5%A6%82%E8%A1%8C%E4%BA%91%E6%B5%81%E6%B0%B4/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/090-angular%E7%9A%84%E6%B0%94rxjs%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B%E8%AE%A9%E4%BD%A0%E7%9A%84%E6%95%B0%E6%8D%AE%E6%B5%81%E5%A6%82%E8%A1%8C%E4%BA%91%E6%B5%81%E6%B0%B4/</guid>
      <description>&lt;p&gt;很多开发者，被异步的「乱气」冲得七零八落。用户的点击、后端的响应、定时器的脉冲、WebSocket 的网络包&amp;hellip;它们就像一股股不受控制的真气，在应用的经脉里乱窜，最终导致应用「走火入魔」，处处是 Bug，时时在卡顿。&lt;/p&gt;&#xA;&lt;p&gt;今天，我便传你一套驾驭这股「气」的无上心法 —— RxJS 响应式编程。它将教会你如何将这些散乱的「气」，理顺、引导、凝练，最终让你的应用真气充盈，行云流水。&lt;/p&gt;&#xA;&lt;h2 id=&#34;异步之下众生皆苦从回调地狱到-promise-孤舟&#34;&gt;异步之下，众生皆「苦」：从回调地狱到 Promise 孤舟&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%82%e6%ad%a5%e4%b9%8b%e4%b8%8b%e4%bc%97%e7%94%9f%e7%9a%86%e8%8b%a6%e4%bb%8e%e5%9b%9e%e8%b0%83%e5%9c%b0%e7%8b%b1%e5%88%b0-promise-%e5%ad%a4%e8%88%9f&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在学会这套心法前，我们都曾在「回调地狱」里苦苦挣扎。&lt;code&gt;Promise&lt;/code&gt; 的出现，如一叶扁舟，把我们从深渊中解救出来。但 &lt;code&gt;Promise&lt;/code&gt; 这艘船，天生只能载一人（一次性的值），一旦开船便无法回头（不可取消）。用它来渡一次性的请求尚可，但面对现代应用中那由无数事件组成的、永不停歇的&lt;strong&gt;事件洪流&lt;/strong&gt;，&lt;code&gt;Promise&lt;/code&gt; 这叶孤舟，随时都会倾覆。&lt;/p&gt;&#xA;&lt;h2 id=&#34;响应式之道万物皆为流&#34;&gt;响应式之「道」：万物皆为「流」&lt;a class=&#34;anchor&#34; href=&#34;#%e5%93%8d%e5%ba%94%e5%bc%8f%e4%b9%8b%e9%81%93%e4%b8%87%e7%89%a9%e7%9a%86%e4%b8%ba%e6%b5%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;RxJS 带来了一个颠覆性的世界观：&lt;strong&gt;不要将异步事件看作孤立的点，而要将它们视为一条连续的、随时间流淌的「河」（Stream）&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这，就是 &lt;strong&gt;Observable&lt;/strong&gt;。它是 RxJS 世界的「道」，是万物的本源。在这条河里，流淌的可以是任何东西 —— 用户的点击、HTTP 的响应、甚至是数组中的每一项。&lt;/p&gt;&#xA;&lt;h2 id=&#34;驾驭之术操作符数据流的水利工程师&#34;&gt;驾驭之「术」：操作符，数据流的「水利工程师」&lt;a class=&#34;anchor&#34; href=&#34;#%e9%a9%be%e9%a9%ad%e4%b9%8b%e6%9c%af%e6%93%8d%e4%bd%9c%e7%ac%a6%e6%95%b0%e6%8d%ae%e6%b5%81%e7%9a%84%e6%b0%b4%e5%88%a9%e5%b7%a5%e7%a8%8b%e5%b8%88&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如果说 Observable 是「河」，那 RxJS 的百余种&lt;strong&gt;操作符 (Operators)&lt;/strong&gt;，就是你改造这条河的「神兵利器」。它们是纯函数，让你能像一位神通广大的「水利工程师」，随心所欲地改造、组合、控制这些数据流。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_qi_images/rxjs_operators.jpg&#34; alt=&#34;文生图：一条数据河流，上面建造了各种奇妙的装置。一个map齿轮将方形数据块变成圆形；一个filter闸门只允许蓝色数据块通过；一个debounceTime水坝在水流平稳后才放行；最终干净、规整的数据流入一个城市（应用）。风格：卡通、概念化。&#34; /&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;变换之术 (&lt;code&gt;map&lt;/code&gt;, &lt;code&gt;scan&lt;/code&gt;)&lt;/strong&gt;: 改变河中之物的「形态」。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;过滤之术 (&lt;code&gt;filter&lt;/code&gt;, &lt;code&gt;debounceTime&lt;/code&gt;)&lt;/strong&gt;: 「筛查」河水，&lt;code&gt;debounceTime&lt;/code&gt; 尤其擅长平息因高频输入而产生的「波涛」（如搜索框防抖）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;合流之术 (&lt;code&gt;merge&lt;/code&gt;, &lt;code&gt;combineLatest&lt;/code&gt;, &lt;code&gt;switchMap&lt;/code&gt;)&lt;/strong&gt;: 将多条「支流」汇入「干流」。&lt;code&gt;switchMap&lt;/code&gt; 是处理「以旧换新」场景（如根据输入 A 发起请求 B）的王牌，它能自动帮你「掐断」过时的旧水流，整个换成最新的。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;容错之术 (&lt;code&gt;catchError&lt;/code&gt;, &lt;code&gt;retry&lt;/code&gt;)&lt;/strong&gt;: 负责「善后」，如请求失败后重试或提供备用河道，让你的「河道」永不干涸。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;双剑合璧当水之气遇见光之道&#34;&gt;双剑合璧：当「水之气」遇见「光之道」&lt;a class=&#34;anchor&#34; href=&#34;#%e5%8f%8c%e5%89%91%e5%90%88%e7%92%a7%e5%bd%93%e6%b0%b4%e4%b9%8b%e6%b0%94%e9%81%87%e8%a7%81%e5%85%89%e4%b9%8b%e9%81%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在现代 Angular 的武学体系中，我们又多了一门精纯的内功心法 —— Signals，我称之为「光之道」。它擅长处理同步的、衍生的状态，精准而高效。RxJS 和 Signals 并非相互取代，而是「双剑合璧」，威力倍增。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;修炼要诀：用 RxJS（水）处理「过程」，用 Signals（光）承载「结果」。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Angular 团队早已为我们搭好了连接这两个世界的「桥梁」：&lt;code&gt;@angular/core/rxjs-interop&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>10.Angular的“势”：构建大型企业级应用的架构智慧</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/100-angular%E7%9A%84%E5%8A%BF%E6%9E%84%E5%BB%BA%E5%A4%A7%E5%9E%8B%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%BA%94%E7%94%A8%E7%9A%84%E6%9E%B6%E6%9E%84%E6%99%BA%E6%85%A7/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/100-angular%E7%9A%84%E5%8A%BF%E6%9E%84%E5%BB%BA%E5%A4%A7%E5%9E%8B%E4%BC%81%E4%B8%9A%E7%BA%A7%E5%BA%94%E7%94%A8%E7%9A%84%E6%9E%B6%E6%9E%84%E6%99%BA%E6%85%A7/</guid>
      <description>&lt;p&gt;一路走来，我们修炼了 Angular 的「道」（思想）、「法」（招式）、「术」（技巧）、「器」（工具）。掌握了这些，足以让你成为一名受人尊敬的江湖「高手」。&lt;/p&gt;&#xA;&lt;p&gt;但你是否想过，高手与「宗师」的区别在哪里？区别，就在于是否懂得「审时度势」。高手执着于武艺本身，而宗师，着眼于天下大「势」。&lt;/p&gt;&#xA;&lt;p&gt;今天，这最后一课，我将带你登上帅台，从将军的视角，俯瞰 Angular 的天下大「势」。这，是超越程序员，迈向架构师的终极一课。&lt;/p&gt;&#xA;&lt;h2 id=&#34;结构之势monorepo-的一统天下&#34;&gt;结构之「势」：Monorepo 的「一统天下」&lt;a class=&#34;anchor&#34; href=&#34;#%e7%bb%93%e6%9e%84%e4%b9%8b%e5%8a%bfmonorepo-%e7%9a%84%e4%b8%80%e7%bb%9f%e5%a4%a9%e4%b8%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;当你的帝国不再只有一个城池，而是拥有了用户主应用、后台管理应用、移动端应用等多个「邦国」时，你是任其各自为政，还是选择「一统天下」？&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Monorepo（单一代码库）&lt;/strong&gt;，就是 Angular 架构中的「合纵」之势。它不是简单粗暴地把代码扔进一个仓库，而是通过 &lt;code&gt;Nx&lt;/code&gt; 或 Angular CLI Workspace 这样的「中央朝廷」，建立一个「书同文，车同轨」的开发王朝。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./angular_shi_images/monorepo_as_empire.jpg&#34; alt=&#34;文生图：一幅古代中国地图，上面有几个大的城池（代表apps），它们被统一在同一个巨大的长城（Monorepo）之内。城池之间有四通八达的驿道（代码共享），长城上有烽火台（统一构建/测试）。风格：古朴、战略感。&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;取此「势」，你将获得：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;全局视野与绝对一致性&lt;/strong&gt;：依赖版本天然统一，杜绝了「公说公有理，婆说婆有理」的混乱。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;原子化提交&lt;/strong&gt;：一个后端接口变更，需要前端三个应用同时修改？在 Monorepo 中，这只是&lt;strong&gt;一个提交&lt;/strong&gt;，重构如丝般顺滑，安全无虞。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;终极代码共享&lt;/strong&gt;：这才是 Monorepo 的「王道」。你可以轻易地在库项目中建立各种「军工厂」（如 UI 库）、「情报处」（如数据访问库），供所有「城池」（应用）共享。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Monorepo 建立的是一种「高筑墙，广积粮」的战略优势。它让你的帝国能够抵御时间的侵蚀和人员的变动，这，就是「势」。&lt;/p&gt;&#xA;&lt;h2 id=&#34;布局之势定都分封驿道的新版图&#34;&gt;布局之「势」：「定都分封驿道」的新版图&lt;a class=&#34;anchor&#34; href=&#34;#%e5%b8%83%e5%b1%80%e4%b9%8b%e5%8a%bf%e5%ae%9a%e9%83%bd%e5%88%86%e5%b0%81%e9%a9%bf%e9%81%93%e7%9a%84%e6%96%b0%e7%89%88%e5%9b%be&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在独立组件的今天，旧的 &lt;code&gt;Core/Shared/Feature&lt;/code&gt; 模块「三分天下」的版图已被重绘。新的帝国版图，更像中国古代成熟的行政体系：「定都、分封、建驿道」。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-应用项目--帝国的京师&#34;&gt;1. 应用项目 —— 帝国的「京师」&lt;a class=&#34;anchor&#34; href=&#34;#1-%e5%ba%94%e7%94%a8%e9%a1%b9%e7%9b%ae--%e5%b8%9d%e5%9b%bd%e7%9a%84%e4%ba%ac%e5%b8%88&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;应用项目是可独立运行的「京师」。它的职责是尽可能地「轻」，只负责&lt;strong&gt;启动帝国&lt;/strong&gt;和&lt;strong&gt;组装来自「诸侯」（库）的核心功能&lt;/strong&gt;。真正的全局配置与核心服务，都在 &lt;code&gt;bootstrapApplication&lt;/code&gt; 时提供，这里是帝国的心脏。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-各个库项目--各司其职的诸侯与行省&#34;&gt;2. 各个库项目 —— 各司其职的「诸侯」与「行省」&lt;a class=&#34;anchor&#34; href=&#34;#2-%e5%90%84%e4%b8%aa%e5%ba%93%e9%a1%b9%e7%9b%ae--%e5%90%84%e5%8f%b8%e5%85%b6%e8%81%8c%e7%9a%84%e8%af%b8%e4%be%af%e4%b8%8e%e8%a1%8c%e7%9c%81&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;库项目这片广袤的疆域，是对旧 &lt;code&gt;SharedModule&lt;/code&gt; 和 &lt;code&gt;FeatureModule&lt;/code&gt; 的彻底超越，实现了更精细的「分封」：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;功能库 (Feature Libs)&lt;/strong&gt;：核心业务领域，如「订单管理」、「用户中心」，应被分封为独立的「诸侯国」。应用通过&lt;strong&gt;惰性加载&lt;/strong&gt;其路由，来「传召」这位诸侯上殿。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;UI 库 (UI Libs)&lt;/strong&gt;：取代了旧 &lt;code&gt;SharedModule&lt;/code&gt; 的「大杂烩」，这是一个纯粹的「兵工厂」，专门生产标准化的「兵器」（按钮、卡片等木偶组件）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;数据访问库 (Data-access Libs)&lt;/strong&gt;：帝国的「户部」与「吏部」，负责与外界（后端）沟通，为上层提供封装好的服务。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;工具库 (Utility Libs)&lt;/strong&gt;：帝国的「翰林院」，存放纯函数、类型定义等通用知识。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-依赖注入-di--贯通全国的驿道体系&#34;&gt;3. 依赖注入 (DI) —— 贯通全国的「驿道」体系&lt;a class=&#34;anchor&#34; href=&#34;#3-%e4%be%9d%e8%b5%96%e6%b3%a8%e5%85%a5-di--%e8%b4%af%e9%80%9a%e5%85%a8%e5%9b%bd%e7%9a%84%e9%a9%bf%e9%81%93%e4%bd%93%e7%b3%bb&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;贯通帝国经脉的，不再是 &lt;code&gt;NgModule&lt;/code&gt; 繁琐的 &lt;code&gt;imports/exports&lt;/code&gt;，而是&lt;strong&gt;依赖注入（DI）&lt;/strong&gt; 这套四通八达、直抵基层的「驿道」体系。它让「京师」的政令（服务）能无碍地传达到任何一个偏远的「村镇」（组件）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>11.什么是框架？为什么说 Angular 是框架？</title>
      <link>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/%E4%BB%80%E4%B9%88%E6%98%AF%E6%A1%86%E6%9E%B6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B4-angular-%E6%98%AF%E6%A1%86%E6%9E%B6/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/angular/angular%E7%9A%84%E9%81%93%E6%B3%95%E6%9C%AF%E5%99%A8/%E4%BB%80%E4%B9%88%E6%98%AF%E6%A1%86%E6%9E%B6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B4-angular-%E6%98%AF%E6%A1%86%E6%9E%B6/</guid>
      <description>&lt;p&gt;在前端的江湖里，「框架」与「库」之争从未停歇，你可能也曾为此困惑：我究竟是要用一个「全家桶」，还是要自己拼乐高？当项目规模日益庞大，团队协作日益复杂，这种选择，往往决定了你未来是「披荆斩棘」还是「举步维艰」。今天，「雪狼」就带你扒开层层迷雾，直抵框架的本质，探寻它如何从混沌中建立秩序，又为何说，Angular&lt;/p&gt;&#xA;&lt;p&gt;是那把能让你「从心所欲，不逾矩」的利剑。&lt;/p&gt;&#xA;&lt;h2 id=&#34;什么是框架&#34;&gt;什么是框架？&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bb%80%e4%b9%88%e6%98%af%e6%a1%86%e6%9e%b6&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;我们先来看看 Wiki 上的定义：&lt;/p&gt;&#xA;&lt;p&gt;在编程领域，软件框架是指一种抽象形式，它提供了一个具有通用功能的软件，这些功能可以由使用者编写代码来有选择的进行更改，从而提供服务于特定应用的软件。软件框架提供了一种标准的方式来构建并部署应用。&lt;/p&gt;&#xA;&lt;p&gt;软件框架是一种通用的、可复用的软件环境，它提供特定的功能，作为一个更大的软件平台的一部分，用以促进软件应用、产品和解决方案的开发工作。软件框架可能会包含支撑程序、编译器、代码、库、工具集以及&lt;/p&gt;&#xA;&lt;p&gt;API，它把所有这些部件汇集在一起，以支持项目或系统的开发。&lt;/p&gt;&#xA;&lt;p&gt;框架和普通的库在特性上具有一些关键性的区别：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;控制反转：与库或普通的应用不同，在框架中，应用的宏观控制流程不是由调用者决定的，而是由框架本身。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;可扩展性：用户可以扩展该框架 —— 通常是有选择的进行改写（Override）或者由程序员添加专门的用户代码来提供特定的功能。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;不可修改框架代码：通常，框架代码都不打算让你修改，而是接受由用户自己实现的某些扩展。换句话说，用户可以扩展该框架，但是不应该修改它的代码。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;形象点比喻（但不够严谨），框架就是条生产线，这条生产线上有很多工人（代码）在工作。生产线的管理者（程序员）负责管理这条生产线，比如说有的工序是空的，那么你就可以安排自己的工人进去，让他去达成你的目标。有些工序上的工人干的工作和你预期的不同，你也可以安排自己的工人把他替换掉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./what_is_framework_images/production_line.jpg&#34; alt=&#34;文生图：一条卡通风格的软件生产线，传送带上流动着代码块，经过几个处理站（分别标着“DI”、“渲染”、“测试”），最终组装成一个完整的APP图标。风格：简洁、信息图。&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;但是无论如何，你的工人除了执行你的意志之外，还要遵守那个工序的强制性要求，他想磨洋工或粗制滥造？那是不允许的，因为这个流水线上的下一个工序可能有超时检查或质量检查，出了错直接就把这个流水线给你停掉，甚至对于一些强制性的检查，你作为管理者都无权忽略它。&lt;/p&gt;&#xA;&lt;p&gt;可以想见，一条好的生产线的价值有多大。生产线绝不仅仅是一组机器而已，它是多年管理经验的结晶，这些才是最值钱的，否则光靠那些机器能值几个钱？有了生产线，对工人（代码）的要求就大大降低了，甚至对管理者（程序员）的要求也大大降低了。当然，如果你只想生产个「能穿」的鞋子，那么这条生产线几乎没有附加价值，甚至会提高你的成本。但是如果你想生产一个「高质量」的鞋子，那么这条生产线是别人的鞋子卖10块而你的鞋子能卖到1000块的根本保障。&lt;/p&gt;&#xA;&lt;p&gt;总体来说，建立生产线的目标就是制定规矩，保障品质，让高品质可以用较低的成本进行复制。框架亦是如此。&lt;/p&gt;&#xA;&lt;h2 id=&#34;框架的设计原理&#34;&gt;框架的设计原理&lt;a class=&#34;anchor&#34; href=&#34;#%e6%a1%86%e6%9e%b6%e7%9a%84%e8%ae%be%e8%ae%a1%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从代码结构上看，框架在宏观层面使用的都是注册、回调机制。这种机制有一个形象的名称，叫做好莱坞法则，为什么叫好莱坞法则呢？因为好莱坞想要成名的演员太多了，都想去找导演，这样下去导演的工作效率势必会受到严重的影响。于是导演就立下了「规矩」，不要打给我们(&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t call us)，等我们打给你（We&amp;rsquo;ll call you!）。由于这个 call 和程序调用的 call 是同一个词，于是编程界就把这句话搬过来，变成了回调（callback）的形象代言人。&lt;/p&gt;&#xA;&lt;p&gt;比如在 Java 的 Spring 框架中，你只要给一个类加上 &lt;code&gt;@Service&lt;/code&gt; 注解，它就会自动被 Spring 作为服务管理起来。在现代 Angular&lt;/p&gt;&#xA;&lt;p&gt;中也是一样，你只要给一个类加上 &lt;code&gt;@Component&lt;/code&gt; 装饰器，它就会自动被 Angular 当做组件管理起来。当 Angular&lt;/p&gt;&#xA;&lt;p&gt;认为需要的时候，就会创建这个类，并把它渲染到屏幕上。&lt;/p&gt;&#xA;&lt;p&gt;这些装饰器中还可以带一些额外信息，被称为元数据（Metadata），用来提供创建和使用这个类时所需的一些约定。当 Angular&lt;/p&gt;&#xA;&lt;p&gt;准备创建一个组件的时候，它就会读取这些元数据，从中找出这个组件的模板（&lt;code&gt;template&lt;/code&gt;）、样式（&lt;code&gt;styles&lt;/code&gt;）、选择器（&lt;code&gt;selector&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;），以及它所依赖的其他「零件」（&lt;code&gt;imports&lt;/code&gt; 数组），然后据此对 DOM 进行操纵。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;@Component&lt;/span&gt;({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;standalone&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#75715e&#34;&gt;// 标记为独立组件，自己管理依赖&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;selector&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;app-greeting&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&amp;lt;h1&amp;gt;{{ greeting() }}&amp;lt;/h1&amp;gt;`&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 在这里明确声明它依赖了哪些其他「零件」&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;imports&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;CommonModule&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;GreetingComponent&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;greeting&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;signal&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Hello, Modern Angular!&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&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;</description>
    </item>
  </channel>
</rss>
