为什么新的 Firebase Web v9 模块化 SDK 会改变游戏规则
Firebase 是现代技术栈中最受欢迎的后端即服务方案之一。除了提供名为 Firestore 的 NoSQL 数据库解决方案外,Firebase 平台还提供身份验证、文件存储、托管和分析解决方案。Firebase SDK 适用于众多平台,包括移动平台、Unity、Java、C++ 和 Web 平台。
然而,Firebase Web 版的主要缺点之一是其庞大的体积。根据用于确定 NPM 软件包大小的工具BundlePhobia 的firebase
数据显示, Web JavaScript 软件包在最小化和压缩后的大小为 235.5kB。对于某些网络连接较慢的用户,这可能会导致额外的 0.59 秒的加载时间。相比之下,lodash
另一个臭名昭著的 NPM 软件包,其大小仅为24.5kB,仅为 Firebase 的十分之一。
这是 Firebase Web JavaScript SDK 的一个已知问题,许多开发者已经放弃了该产品。尤其是对于那些为可能无法获得快速网络连接的最终用户构建产品的开发者来说,加载像 Firebase 这样大的软件包对他们来说根本不可行。
值得庆幸的是,Firebase 团队一直在努力从团队层面重新构建 Firebase Web SDK。2021 年 7 月 27 日,Firebase 官方博客账号宣布预发布一款全新的模块化 JavaScript SDK,其体积“可缩小高达 80%!”
Firebase Web v9 将彻底改变 Web 开发者使用 Firebase 的方式。随着全面革新、模块化、函数式编程风格的引入,以及 Firestore “精简版”库的加入,搭载 Firebase Web v9 的 Web 应用将运行速度更快、加载速度更快,并显著提升用户和开发者的体验。
综上所述,让我们来看看这个新的模块化 Firebase Web SDK 中引入的一些根本性变化。
无副作用的进口产品
此前,Firebase Javascript SDK 引入了所谓的“副作用导入”。简单来说,当函数在其提供的作用域之外修改状态时,就会产生副作用。例如,如果函数a
修改了全局变量x
,a
就会产生副作用。副作用导入会影响程序的状态、逻辑或功能,而无需调用任何方法或引用从包中导出的任何变量。仅仅因为包存在于程序中(通过语句import
或require
调用),就可能影响程序的功能。
旧版 Firebase Web SDK 严重依赖于副作用导入。对于您想要在应用中添加的每个 Firebase 功能(身份验证、Firestore、云存储、分析等),您都必须导入一个额外的包,如下所示:
// main firebase app import
import app from "firebase/app";
// SIDE EFFECT PACKAGES
import "firebase/auth";
import "firebase/firestore";
import "firebase/storage";
如果您有使用旧版 Firebase Web SDK 的经验,您可能已经加入了延迟加载来导入 Firebase 软件包。此解决方案可以减少 Web 应用的初始加载大小和时间,但用户仍然需要等待所有这些软件包加载完毕,应用才能完全正常运行。
Firebase Web v9 彻底改变了这一切。新的 Firebase Web SDK 中取消了副作用包的概念,所有包都完全可进行树优化。这意味着只有应用所需的 Firebase 部分才会被导入到客户端。这大大减少了应用最终打包的大小,并显著缩短了加载时间!
原生 Javascript ES 模块
在新的 Firebase Web SDK 中,由于引入了模块化软件包,您的应用所需的每项 Firebase 功能都可以单独导入。由于新的 SDK 内置于原生 JavaScript ES 模块中,因此您可以直接导入程序所需的功能:不多不少。例如,假设您要初始化 Firebase 应用,然后监听身份验证更改:
// imports with ES modules
import { initializeApp } from "firebase/app";
import { getAuth, onAuthStateChanged } from "firebase/auth";
// initialize firebase app
initializeApp(firebaseConfig);
// watch for auth changes
const auth = getAuth();
onAuthStateChanged(auth, (user) => {
// deal with authentication changes
});
模块化包的引入反过来导致在使用 Firebase Web SDK 时引入更实用的编程风格。
函数式编程风格
如果您曾经使用过函数式编程语言或库,那么您一定熟悉函数式编程为开发者带来的优势。遵循函数式编程风格的程序通常具有非常直观且易于测试的优势。虽然旧版 Firebase Web SDK 并不难理解,但新版 Firebase Web SDK 的直观性和初学者友好度丝毫不逊色。
为了演示新的模块化 Firebase 包引入的函数式编程风格,让我们看一个在 Firestore 中更新文档的示例。
import { getStorage, ref, uploadBytes } from "firebase/storage";
// first, get a reference to the storage bucket for our app
const storage = getStorage();
// then, make a reference to the file
const usersCollection = ref(storage, "files/example.png");
// finally, upload the file to the reference
uploadBytes(usersCollection, file);
如您所见,此代码示例中存在大量函数嵌套——一个函数的结果作为参数传递给另一个函数,该函数的结果又传递给另一个函数的参数,依此类推。这与旧版 Firebase Web SDK 使用的方法链式调用方式形成了鲜明对比。
总而言之,新 Firebase SDK 使用的代码类似于 F# 或 Scala 等函数式语言(或 Ramda 和 RxJS 等函数式库),而旧 Firebase Web SDK 使用的代码类似于 Java 或 C++。
Firestore Lite
Firestore 是一项极其强大且实用的数据库服务。它提供了许多功能,但并非所有使用 Firestore 的 Web 应用都能真正利用其中的许多功能。许多开发者只是将 Firestore 用作一个易于实现的 NoSQL 数据库,它可以处理客户端和服务器端数据库操作的诸多复杂性。因此,许多 Web 应用并不需要 Firestore 的实时更新功能;它们只需要访问一次性文档和集合查询。
Firebase 团队意识到了这一有效用例,并推出了一个新库:Firestore Lite。Firestore Lite 库比旧版 Firestore v8 库轻量高达 80%。除了实时更新之外,您喜爱并充分利用的 Firestore 所有功能均可在 Firestore Lite 库中使用。这对 Firebase Web 社区来说是一个巨大的胜利,因为您的应用现在可以更高效地运行,并且不会因代码臃肿而变得臃肿!
兼容性
全新 Firebase Web v9 SDK 让您能够轻松地从 v8 SDK 逐步升级。该firebase
软件包提供了一个compat
库,让您能够轻松、渐进地从 v8 迁移到 v9。对于代码库中所有尚未准备好完全切换到 Firebase Web v9 的地方,您可以利用该compat
库逐步升级部分代码库,直到不再需要使用该compat
库功能。
compat
这样做的主要缺点是,使用该库时,您将无法体验到新版 v9 SDK 的所有臃肿和减少加载时间的功能。该compat
库仍然依赖于副作用导入,因此您必须像使用 Firebase Web v8 SDK 一样处理这些副作用导入。
结论
如果您曾经在 Web 上使用过 Firebase,那么 Firebase 的未来一定会让您兴奋不已。全新模块化 Firebase Web v9 SDK 的推出,彻底改变了 Firebase Web 开发的一切。从简化应用臃肿到提升开发者和最终用户的体验,全新 Firebase Web v9 模块化 SDK 消除了使用 Firebase 的最大弊端之一,并将彻底改变 Firebase 驱动的 Web 应用的未来!
文章来源:https://dev.to/chroline/why-the-new-firebase-web-v9-modular-sdk-is-a-game-changer-nph