news 2026/9/27 10:15:49

AngularFire 安装与项目初始化指南:从 `ng add @angular/fire` 到 Firestore 数据流绑定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AngularFire 安装与项目初始化指南:从 `ng add @angular/fire` 到 Firestore 数据流绑定
  • 后端

【免费下载链接】angularfire

Angular + Firebase = ❤️

项目地址:https://gitcode.com/gh_mirrors/an/angularfire
点击查看免费下载

导读

本文基于 AngularFire 官方 Quickstart 文档(docs/install-and-setup.md)编写,完整讲解在全新 Angular 项目中接入 AngularFire 的六个步骤:创建项目、运行ng add @angular/fire、注入Firestore、把集合绑定为响应式列表、本地联调、部署上线。你将掌握ng add背后的 schematics 究竟改动了哪些文件、provideFirebaseApp/provideFirestore等 provider 的底层机制,以及如何用collectionData让 Firestore 数据实时流入 Angular 模板。文中所有实现细节均有仓库源码佐证,可直接对照src/schematics/与src/firestore/目录深入研读。

开始之前:三条前置检查

Quickstart 在正式动手前给出了三条容易踩坑的注意事项,它们直接决定了ng add能否一次成功:

  1. Firebase CLI 版本 ≥ 14。整个初始化流程由 Firebase CLI(firebase-tools)驱动。ng add在你机器上没有 CLI 时会自动安装并引导你登录,但不会升级已存在的旧版本。如果本机已有旧版 CLI,setup 会以firebase-tools version 14.0.0+ is required, please upgrade and run again终止。提前处理或清除该错误的方法是:

    npm install -g firebase-tools firebase login

    从源码看,setup 阶段会通过 firebaseTools.ts 调用 CLI 的login、projects.list、apps.sdkconfig等能力,旧版本缺少这些 API 就无法完成交互式初始化。

  2. 新版 Angular 主版本请使用@next。AngularFire 默认发布渠道(latest)与最新 Angular 大版本之间可能存在 peer-dependency 冲突。若ng add @angular/fire报 Angular peer 依赖冲突,说明你的 Angular 比 AngularFire 默认版本更新,此时应安装与之匹配的预发布版本:

    ng add @angular/fire@next

    仓库的 common.ts 还揭示了一个细节:当安装的是预发布版本时,schematics 会把package.json中的@angular/fire声明钉死(pin)到精确版本,因为类似^21.0.0-rc.0的预发布区间也会匹配每次 merge 到 main 后发布的 canary 构建,后续安装可能静默替换掉你精心选择的版本。

  3. 无害的 CLI 噪音。初始化期间 Firebase CLI 可能打印punycode弃用警告,或询问是否启用额外功能(例如 Gemini)。这些来自 CLI 本身,与 AngularFire 无关,忽略即可。

第一步:创建 Angular 项目

Quickstart 提供了两种等价方式,以及一种可选的直接安装 CLI 方式:

# 方式一:yarn create yarn create @angular <project-name> cd <project-name>
# 方式二:npm create npm create @angular <project-name> cd <project-name>
# 方式三(可选):直接安装工具链 npm install -g @angular/cli ng new <project-name> cd <project-name>

Angular CLI 的new命令会以最新版 Angular 构建一个全新的项目结构。创建过程中 CLI 会询问是否启用SSR(服务端渲染),这个选择会直接影响第六步的部署方式,值得提前留意。

第二步:运行ng add @angular/fire

在项目根目录执行:

ng add @angular/fire

这是整个接入流程的核心。ng add会安装 AngularFire 并自动完成项目配置,具体做两件事:

  1. 交互式提问:提示你勾选要启用的功能模块、选择要使用的 Firebase 项目(必要时会引导你登录 Firebase 账号)。
  2. 改写应用配置:向应用配置(如app.config.ts)中注入provideFirebaseApp(...)以及每个勾选功能对应的 provider,并把你的 Firebase 配置内联进去——不会创建 environment 文件。

ng add底层到底改了什么

理解ng add的行为,最好的方式是直接看它背后的 schematics 源码,入口在 src/schematics/add/index.ts:

  • 首先addDependencies按peerDependencies把依赖写入package.json(src/schematics/common.ts);
  • 接着alignFirebaseVersion会把工作区里的firebase依赖对齐到^12.18.0这个范围(见 common.ts)。注释里给出了原因:AngularFire 自带一份firebase依赖,如果你的工作区钉在更老的 major 版本,npm 会静默地在@angular/fire下嵌套出第二份 SDK 副本,运行时两份副本会互相拒绝对方的对象(对应 issue #3684、#3681、#3682);
  • 然后pinInstalledPrereleaseVersion处理上文提到的预发布版本钉死问题;
  • 最后调度一个ng-add-setup-projectschematic 完成后续的交互式设置(src/schematics/setup/index.ts)。

setup 阶段(setup/index.ts)的交互逻辑非常完整:

  • 通过 checkbox 多选询问"What features would you like to setup?",可选功能在 src/schematics/interfaces.ts 中定义,共 12 项:Authentication、Google Analytics、App Check、Firestore、Realtime Database、Data Connect、Cloud Functions (callable)、Cloud Messaging、Performance Monitoring、Cloud Storage、Remote Config、AI Logic;
  • 询问使用哪个 Firebase 账号(setup/prompts.ts);
  • 通过模糊搜索(autocomplete)选择或新建 Firebase 项目(projectPrompt),甚至允许直接在向导里输入 project id 创建新项目;
  • 选择或新建 Web 应用(appPrompt),然后调用firebaseTools.apps.sdkconfig('web', ...)拉取 SDK 配置,再从中筛出initializeApp()能接受的键(apiKey、authDomain、databaseURL、projectId、storageBucket、messagingSenderId、appId、measurementId、recaptchaSiteKey,见 setup/index.ts);
  • 把选中的 Firebase 项目写入.firebaserc的projects.default(setup/firebaseConfigs.ts),这样后续firebase命令无需再交互式选择项目;
  • 如果勾选了 Firestore,会自动生成测试模式(test mode)的firestore.rules(30 天后过期)与空的firestore.indexes.json,并在firebase.json中注册firestore段(setup/firebaseConfigs.ts);
  • 如果勾选了 Data Connect,还会调用firebaseTools.init("dataconnect")初始化本地配置并解析 connector SDK 生成情况。

生成的 provider 是如何工作的

ng add向应用配置注入的provideFirebaseApp实现在 src/app/app.module.ts。它的要点是:

  • 通过makeEnvironmentProviders注册一个PROVIDED_FIREBASE_APPS多值 provider,用工厂firebaseAppFactory在NgZone 之外(zone.runOutsideAngular)执行fn(injector)调用initializeApp(config)——这是 AngularFire 避免 Firebase 回调频繁触发变更检测的关键设计;
  • 同时调用registerVersion('angularfire', VERSION.full, 'app')向 Firebase SDK 登记 AngularFire 版本,用于问题诊断;
  • FirebaseApp的默认注入解析逻辑在defaultFirebaseAppFactory:如果只显式提供了单个 app 就返回它,否则回退到 Firebase SDK 的默认 app(getApp())。

类似地,provideFirestore在 src/firestore/firestore.module.ts 中注册Firestore实例,同样在 zone 外构造,并且依赖顺序上让 Auth 与 AppCheck 先于 Firestore 加载(源码注释明确写着 "Firestore+Auth work better if Auth is loaded first")。

第三步:注入Firestore

打开/src/app/app.ts,进行如下修改:

import { Component, inject } from '@angular/core'; import { AsyncPipe } from '@angular/common'; import { Firestore } from '@angular/fire/firestore'; @Component({ selector: 'app-root', templateUrl: './app.html', styleUrl: './app.css', imports: [AsyncPipe], }) export class App { firestore: Firestore = inject(Firestore); constructor() { } }

Firestore类型本身定义在 src/firestore/firestore.ts:它是一个接口与类的同构声明,类构造器直接把底层 Firebase Firestore 实例原样返回,因此你注入的Firestore本质上就是 Firebase JS SDK 的 Firestore 实例,只是被 AngularFire 的 DI 体系管理起来。借助 Angular 的inject()函数,组件无需构造函数参数即可拿到实例。

第四步:把 Firestore 集合绑定为响应式列表

继续修改/src/app/app.ts:

import { Component, inject } from '@angular/core'; import { AsyncPipe } from '@angular/common'; import { Observable } from 'rxjs'; import { Firestore, collection, collectionData } from '@angular/fire/firestore'; interface Item { name: string; } @Component({ selector: 'app-root', imports: [AsyncPipe], templateUrl: './app.html', styleUrl: './app.css' }) export class App { firestore: Firestore = inject(Firestore); items$: Observable<Item[]>; constructor() { const aCollection = collection(this.firestore, 'items') this.items$ = collectionData<Item>(aCollection); } }

再打开/src/app/app.html:

<ul> @for (item of items$ | async; track item) { <li>{{ item.name }}</li> } </ul>

这里的核心是RxJS Observable + AsyncPipe的数据流组合:

  • collection(this.firestore, 'items')创建指向items集合的引用;
  • collectionData<Item>(aCollection)把该集合转换为一个发出Item[]数组的 Observable。它在 src/firestore/rxfire.ts 中通过ɵzoneWrap对 rxfire 的collectionData做了 zone 包装,确保数据回调在 Angular zone 内触发变更检测;
  • 模板中的items$ | async自动订阅并渲染数组,@for块遍历每一项输出item.name。

从模块结构看,@angular/fire/firestore的公开 API(public_api.ts)同时导出 AngularFire 的provideFirestore/Firestore以及 Firebase JS SDK 的全部函数(collection、doc、where等,见 src/firestore/firebase.ts),因此你可以在 Angular 组件里直接使用熟悉的 Firebase 函数式 API。

第五步:本地运行

ng serve

Angular 应用编译并在本地提供服务后,浏览器里应看到一个空列表——因为此时items集合还没有数据。

在另一个终端标签页中,按照 Firebase 官方文档往items集合添加数据即可。需要特别强调的是:由于此时还没有接入用户认证,请务必将 Firestore 以**测试模式(test mode)**启动,或在安全规则中允许读取items集合(allow read: if true),否则数据读取会被规则拦截。

一旦你创建了items集合并开始插入文档,就会看到数据实时流入 Angular 应用并渲染在浏览器中——这正是collectionData订阅 onSnapshot 实时监听带来的效果。

测试模式规则提醒

如果你是用ng add勾选 Firestore 完成初始化的,schematics 生成的 firestore.rules 本身就是测试模式:允许任何人读写,但30 天后过期,之后所有客户端请求都会被拒绝(setup/firebaseConfigs.ts)。因此上线前务必把安全规则替换为正式的鉴权规则。

第六步:部署应用

部署方式取决于应用是否使用了 SSR(服务端渲染)——Angular CLI 创建项目时会询问这一项。

纯客户端渲染应用(默认):构建产物是静态文件,部署到 Firebase Hosting。请按 Firebase 官方 Hosting quickstart 构建并部署应用,也可以使用本仓库提供的部署 builder(@angular/fire的 schematics 中内置了 deploy 支持,见 src/schematics/deploy/builder.ts)。

SSR 应用:运行的是 Node 服务器,因此建议部署到Firebase App Hosting——这也是 Firebase 对 SSR 场景推荐的路径。完整的部署步骤见 Firebase App Hosting 指南,该指南还覆盖了一个常见坑:SSR 应用部署后静默回退到客户端渲染(例如服务器端数据获取失败、Node 运行环境缺失等导致),需要按指南逐一排查。

仓库的示例应用 sample/src/app/app.config.ts 展示了生产级配置的形态:provideZonelessChangeDetection()、provideClientHydration(withIncrementalHydration())与provideAuth(...)组合使用,并演示了如何在 provider 工厂里判断_canInitEmulator后连接 Auth 模拟器——可作为你初始化完成后进一步接入各模块的参考模板。

常见问题速查

现象原因处理方式
firebase-tools version 14.0.0+ is required本机 CLI 版本过旧,ng add不会自动升级npm install -g firebase-tools后firebase login
Angular peer-dependency 冲突Angular 比 AngularFire 默认 release 更新ng add @angular/fire@next
punycode弃用警告 / 询问启用 GeminiFirebase CLI 自身行为忽略即可
浏览器列表为空items集合尚无数据,或安全规则拦截读取测试模式下添加数据,或放行items的 read 规则
测试模式规则过期后数据全部被拒生成的 rules 30 天后过期提前替换为正式安全规则
npm 安装了双份 firebase SDK 导致运行时互相拒绝对象工作区firebase版本与 AngularFire 要求的^12.18.0范围不符重新运行ng add让alignFirebaseVersion对齐版本

小结

从yarn create @angular到ng add @angular/fire,再到inject(Firestore)与collectionData的响应式绑定,整个过程被 AngularFire 的 schematics 高度自动化:它不仅写好了 provider,还会同步管理firebase.json、.firebaserc、firestore.rules等配套文件。理解 src/schematics/add/index.ts 与 src/schematics/setup/index.ts 的实现,能让你在遇到版本对齐、规则过期、双 SDK 副本等边缘问题时快速定位根因。后续深入某个模块(Auth、Storage、Functions 等)时,各模块目录下的*.module.ts与rxfire.ts都遵循与 Firestore 相同的 provider + zone 包装模式,可以举一反三。

  • 后端

【免费下载链接】angularfire

Angular + Firebase = ❤️

项目地址:https://gitcode.com/gh_mirrors/an/angularfire
点击查看免费下载
上一篇:3分钟解锁Beyond Compare 5:开源密钥生成工具完整指南
下一篇:3分钟永久激活Beyond Compare 5:开源密钥生成器终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 10:15:47

商务网站开发课程建言:从零搭建避坑指南

商务网站开发课程建言:从零搭建避坑指南 备案流程一头雾水,是不是让你对从零搭建商务网站感到无从下手?很多中小企业老板在筹备官网时,往往卡在ICP备案的复杂手续上,导致项目停滞不前。其实,只要理清商务网站开发课程建言中的核心逻辑,从设计原则到前端实现,每一步都有章可循。 设计原则与业务逻辑对齐…

作者头像 李华
网站建设 2026/9/27 10:15:22

成都交易网站建设避坑:3个免费工具让官网转化率翻倍

成都交易网站建设避坑:3个免费工具让官网转化率翻倍 网站上线三个月,后台数据一片惨淡?每天只有几个爬虫IP,真实用户屈指可数?这不是你运气不好,是典型的“设计陷阱”和“技术债务”没还。在成都做交易类网站,很多老板盯着页面好不好看,却忽略了 用户视线流 和 操作路径…

作者头像 李华
网站建设 2026/9/27 10:15:17

备份整个网站避坑指南:3步搞定注意事项,告别建站拖延症

备份整个网站避坑指南:3步搞定注意事项,告别建站拖延症 改个需求建站公司拖一周,这种憋屈感只有做网站的人才懂。你急着上线活动,他们却在那儿磨蹭,理由千奇百怪,最后发现数据还没备份好,生怕改坏了要回滚。这时候, 备份整个网站 就成了救命稻草,但很多人只知其一不知其二,忽略了几个关键的 注意事项…

作者头像 李华
网站建设 2026/9/27 10:14:34

修改网站后台地址避坑指南:搞懂这5步,建站报价才不白给

修改网站后台地址避坑指南:搞懂这5步,建站报价才不白给 很多安徽的朋友在找建站公司时,最头疼的不是价格,而是怕被“坑”。你一问 建站报价 ,对方张口就是几千上万,你心里没底,因为域名、服务器这些名词听着就头晕。更扎心的是,有些客户网站做完后,发现后台登录地址还是默认的 /admin…

作者头像 李华
网站建设 2026/9/27 10:14:25

嘉兴网站建设需要多少钱?老鸟揭秘避坑指南与真实成本

嘉兴网站建设需要多少钱?老鸟揭秘避坑指南与真实成本 网站刚上线第二天,后台突然弹出一条红色警告:检测到您的页面包含恶意脚本,疑似被挂马。那一刻,很多老板的心都凉了半截。不知道怎么办?别慌,这恰恰是检验你当初建站合同里那些“免费维护”条款含金量的最佳时刻。…

作者头像 李华
网站建设 2026/9/27 10:14:22

怎样建设网站官网完整流程报价单拆解避坑

怎样建设网站官网完整流程报价单拆解避坑 网站做好了没人访问,这是90%甲方找我们吐槽的第一句话。很多人以为只要把页面切出来,代码扔上去,就算完成了“怎样建设网站官网”这件事。大错特错。从需求梳理到最终上线,中间隔着一条深不见底的沟,里面填满了技术债、SEO陷阱和隐性费用。…

作者头像 李华