VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire,一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持,现在已经稳定了。

Vue 和 Firebase 现在比以往任何时候都更好了。

构建更好的VueFire

去年,我们宣布与 Eduardo San Martin Morote 合作,构建一个成熟的 Vue 和 Firebase 体验。自那时起,我们一直在努力构建我们的特性,如 Nuxt 支持,并使库通过 alpha 和 beta 阶段。我们很高兴地说,库现在是稳定的。

今天,我们很高兴地宣布VueFire现在已经稳定,可以使用了。

在本博客中,我们将介绍 VueFire 帮助简化 Vue 和 Firebase 开发的所有方式,但请务必查看文档以获取完整的详细信息。

VueFire 有什么新功能?

惯用的实时绑定

一行实时数据绑定

VueFire 为您提供了方便的可组合项,以便为 Firestore 和实时数据库创建实时数据绑定。

<script setup>
import { useCollection } from 'vuefire';
import { collection } from 'firebase/firestore';

// This is a composable. It only needs a ref to manage 
// the subscription.
const todos = useCollection(collection(db, 'todos'));
</script>

<template>
  <ul>
    <li v-for="todo in todos" :key="todo.id">
     <span>{{ todo.text }}</span>
    </li>
  </ul>
</template>

只需几行代码,您就拥有一个与本地或远程数据库更改保持同步的 todos 数组。

在幕后,VueFire 依靠 Firebase SDK 使用 onSnapshot()onValue() 等方法完成繁重的工作,剥离所有样板代码,为 Vue 开发人员提供量身定制的开发人员体验。

除了 useCollection()(适用于 Firestore)外,您还可以使用 useDocument() 找到与文档(document)对应的功能,使用 useDatabaseList()useDatabaseObject() 找到与列表和对象(适用于实时数据库)对应的功能:

import { useDatabaseList, useDatabaseObject, useDatabase } from 'vuefire'
import { ref as dbRef } from 'firebase/database'

const db = useDatabase()
const contacts = useDatabaseList(dbRef(db, 'contacts'))
const someContact = useDatabaseObject(dbRef(db, 'contacts', '24'))

VueFire 允许您传递对文档和集合(collections)的动态引用,并自动解除先前引用的绑定并绑定新引用。例如,我们可以依靠路由参数来绑定到特定文档:

<script setup lang="ts">
import { useRoute } from 'vue'
import { useDocument } from 'vuefire'
import { doc } from 'firebase/firestore'

const route = useRoute()
// note the () => doc() to pass a dynamic reference
const contact = useDocument(() => doc(db, 'contacts', route.params.id))
</script>

<template>
  <Contact :contact="contact" />
</template>

当从 /contacts/1 导航到 /contacts/2 时,前一个文档将被解除绑定,而新的文档将被绑定,所有这一切只需将一个函数传递给一个文档,而不仅仅是文档。请注意,这也适用于 computed() 属性和 ref() 变量。

身份验证变得更容易

VueFire 采用 Firebase 的底层身份验证功能,并将其封装到 Vue 组件中,使其可以在您的 Vue 应用程序中轻松、习以为常地使用。

<script setup>
import { useCurrentUser } from 'vuefire'

const user = useCurrentUser()
</script>

<template>
  <p v-if="user">Hello {{ user.providerData.displayName }}</p>
</template>

user 变量是响应式的,因此您可以将其与其他 Composition API 函数(例如 computed()watch() )一起使用。

<script setup>
import { useCurrentUser } from 'vuefire'
import { useRouter } from 'vue-router'

const user = useCurrentUser()

watch(user, user => {
  if (user == null) {
    router.push('/login')
  }
})
</script>

<template>
  <!-- ... -->
</template>

如果没有用户经过身份验证,则 user 变量将为 null ,因此您可以看到它只需几行即可重定向到登录页面,如上所示。

忠实于 Firebase SDK

VueFire 会尽量不妨碍您,并让您像平常一样使用 Firebase SDK。它提供了在 Vue 上下文中有用的 API,但您可以而且仍然应该使用 Firebase SDK 来完成许多事情,例如事务、批量写入、转换器等。

尽管有特定的 Vue 集成,您仍然可以通过手动调用 doc()collection() 以及 Firebase SDK 中的其他方法来访问 Firebase 引用。我们相信这有助于我们更接近 Firebase SDK,并使同时使用两者变得更加直观。例如,不能使用VueFire写入绑定数据,必须使用Firebase SDK进行更新操作:

<script setup lang="ts">
import { useFirestore } from 'vuefire'
import { doc, addDoc, serverTimestamp } from "firebase/firestore"; 

const db = useFirestore()

function addTodo(text: string) {
  // ✨ add a new todo
  await addDoc(collection(db, "todos"), {
    text,
    createdAt: serverTimestamp(),
    done: false
  });
}
</script>

VueFire 并未覆盖所有 Firebase 服务,也没有尝试覆盖所有 Firebase 服务。大多数时候不需要抽象,Firebase SDK 就足够了。例如,您可以直接将消息服务与 Firebase SDK 结合使用:

<script setup>
import { useFirebaseApp } from 'vuefire'
import { getMessaging, onMessage } from 'firebase/messaging'

const firebaseApp = useFirebaseApp()
const messaging = getMessaging(firebaseApp)
onMessage(messaging, payload => {
   console.log('Message received. ', payload)
})
</script>

不需要 Vue 集成或 VueFire 特定代码。

Nuxt支持,服务器支持变得简单

VueFire 最令人兴奋的功能之一是它的 Nuxt 模块。它不仅负责 Firebase 初始化,还处理将 Firebase 与 Nuxt 集成的最复杂部分之一:服务器端渲染 (SSR)。为了使用 VueFire 的 Nuxt 模块,请使用您最喜欢的包管理器安装它:

npm install nuxt-vuefire

然后你可以在 Nuxt 配置文件中配置它:

export default defineNuxtConfig({
  modules: [
    // ... other modules
    'nuxt-vuefire',
  ],

  vuefire: {
    // Firebase App configuration
    config: {
      apiKey: '...',
      authDomain: '...',
      projectId: '...',
      appId: '...',
    },
  },
})

最重要的是,VueFire 的 Nuxt 模块还使得使用 AppCheck、身份验证和模拟器等功能变得非常容易。

App Check 支持,轻松、安全的后端访问

Firebase App Check 是一个额外的安全层,通过证明传入流量来自您的应用程序并阻止没有有效凭据的流量,帮助保护对您的服务的访问。它有助于保护您的后端免遭滥用,例如计费欺诈、网络钓鱼、应用程序假冒和数据中毒。

启用 AppCheck 就像将 appCheck 属性添加到 vuefire 配置对象一样简单:

export default defineNuxtConfig({
  // ...
  vuefire: {
    // Enables AppCheck
    appCheck: {
      // Allows you to use a debug token in development
      debug: process.env.NODE_ENV !== 'production',
      provider: 'ReCaptchaEnterprise',
      key: '...',
    },
  },
})

通过使用 debug 选项,您可以在开发中使用调试令牌。无论是在开发期间还是在重要发布之前,这对于在没有模拟器的情况下进行本地测试非常有用。

服务器和客户端身份验证同步

通过客户端和服务器进行同步身份验证可能很难管理。每台机器都需要验证和维护相同的身份验证上下文。这可能需要设置 cookie、后台云函数或其他复杂的方法。

然而,使用 VueFire 的 Nuxt 模块设置身份验证也很容易:

export default defineNuxtConfig({
  // ...
  vuefire: {
    // Enables and initializes the auth module
    auth: {
      enabled: true,
    },
  },
})

默认情况下,这不会启用服务器端渲染需要验证用户的页面。在大多数情况下,这样做是没有问题的,因为你不需要对隐藏在身份验证后面的页面进行搜索引擎优化。这还能节省大量计算能力。

但是,可以通过让模块为经过身份验证的用户创建一个 cookie 并在每个请求上使用它来对它们进行身份验证来启用此功能。然后,呈现页面,就像用户已通过身份验证一样:

export default defineNuxtConfig({
  // ...
  vuefire: {
    // Enables and initializes the auth module
    auth: {
      enabled: true,
      sessionCookie: true,
    },
  },
})

设置完成后,您可以使用 useCurrentUser(),如上所示。它会自动导入,使其更易于使用。您还可以使用 getCurrentUser() 等待用户在中间件中登录:

export default defineNuxtRouteMiddleware(async to => {
  const user = await getCurrentUser()

  if (!user) {
    // redirect to the login page
    return navigateTo({
      path: '/login',
      query: {
        // keep the original path as a query parameter
        redirect: to.fullPath,
      },
    })
  }
})

然后在路由中定义页面元数据:

<script setup lang="ts">
definePageMeta({
  middleware: ['authenticated'],
});
</script>

模拟器设置变得简单

Firebase 模拟器套件是使用 Firebase 进行开发的推荐方式。这使您可以针对 Firebase 服务的本地实例进行开发,而不是处理需要网络连接或可能产生计费问题的云连接项目。

通常,要使用模拟器,您需要编写代码来告诉 Firebase SDK 连接到模拟器而不是云项目。然而,在 Nuxt 模块中,这一切都会自动发生。

默认情况下,如果您有一个带有 emulators 属性的 firebase.json 文件,VueFire 将在开发过程中自动启用模拟器。

一个全新的文档站点

VueFire 文档位于 https://vuefire.vuejs.org/。
在这里插入图片描述
这些文档在主存储库中是开源的。如果您想看到任何更改或添加,请告诉我们!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试&#xff0c;网上信息杂乱不规整&#xff0c;出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐&#xff0c;与其奖励自己&#xff0c;不如大家一起嗨。以下整理的内容可能有不足之处&#xff0c;欢迎大佬一起讨论。 PS&#xff1a;…

前端封装websocket类,实现消息注册和全局回调

实现消息注册和回调函数&#xff0c;实现全局使用同一个webscoket对象&#xff0c;并实现断线重连和心跳连接等功能&#xff0c;可以实现全局使用唯一实例&#xff0c;可以另外进行拓展配置 // WebSocket类对象 class WebSocketCli {// 构造函数constructor(url: string, opts…

Android悬浮窗实现步骤

最近想做一个悬浮窗秒表的功能&#xff0c;所以看下悬浮窗具体的实现步骤 1、初识WindowManager 实现悬浮窗主要用到的是WindowManager SystemService(Context.WINDOW_SERVICE) public interface WindowManager extends ViewManager {... }WindowManager是接口类&#xff0c…

如何判断 LM358 芯片是否损坏或故障?

LM358 芯片是一种流行的低功耗双运放&#xff0c;广泛应用于各种电子电路中&#xff0c;包括放大器、滤波器、积分器、比较器等。它以其低成本、高性价比和广泛的工作电源范围&#xff08;3V至32V单电源或1.5V至16V双电源&#xff09;而被广泛使用。 然而&#xff0c;像所有电…

【Docker与微服务】基础篇

1 Docker简介 1.1 docker是什么 1.1.1 问题&#xff1a;为什么会有docker出现&#xff1f; 假定您在开发一个项目&#xff0c;您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依…

Vue中使用定义的函数时,无法访问到data()里面的数据

const translateItems1 () > {this.translatedItems this.items1.map(item > {return {...item,label: this.$t(item.labelKey)};}); items1是我们data()里面的数据&#xff0c;无法访问到 解决办法 把箭头函数替换为普通函数 const translateItems1 function() {th…

Prometheus的监控告警

前言 alter是一个单独的模块&#xff0c;需要单独的配置 需要声明邮箱地址。配置以configmap进行配置。 altermanager也是pod部署。部署在k8s集群当中。 alertmanager设置告警邮件 apiVersion: v1 kind: ConfigMap metadata:name: alertmanagernamespace: monitor-sa data:al…

blender 画笔的衰成曲线Falloff Curve

Blender画笔是用来在雕刻模式或绘画模式下对物体进行修改的工具。画笔有不同的类型和设置&#xff0c;可以影响画笔的效果和外观。你提到的选项是画笔的衰减曲线&#xff08;Falloff Curve&#xff09;的预设&#xff0c;它们决定了画笔的强度如何随着距离中心的距离而变化。 …

【web | CTF】攻防世界 easyupload

天命&#xff1a;好像也不太easy 目录 步骤一&#xff1a;准备文件 步骤二&#xff1a;上传文件 本条题目有好几个防御点&#xff1a; 后缀名防御&#xff1a;只能上传图片格式内容防御&#xff1a;内容不能有php图片头防御&#xff1a;检测文件的头部信息&#xff0c;是否是…

LM Studio-简化安装和使用开源大模型 | OpenAI API 文字转语音本地运行程序分享

原文&#xff1a;LM Studio-简化安装和使用开源大模型 | OpenAI API 文字转语音本地运行程序分享 - 知乎 实测在Mac上使用Ollama与AI对话的过程 - 模型选择、安装、集成使用记&#xff0c;从Mixtral8x7b到Yi-34B-Chat 官网&#xff1a;https://lmstudio.ai/ 最近用上了LM St…

软件工程知识梳理6-运行和维护

软件维护需要的工作量很大&#xff0c;大型软件的维护成本高达开发成本的4倍左右。所以&#xff0c;软件工程的主要目的就是要提高软件的可维护性&#xff0c;减少软件维护所需要的工作量&#xff0c;降低软件系统的总成本。 定义&#xff1a;软件已经交付使用之后&#xff0c;…

java面向对象基础(面试)

一、面向对象基础 1. 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象会先抽象出对象&#xff0c;然后用对象执行方法的方式解决问题。 2.创建一个对象用什么运算符?对象实体与对象引用有何不同? n…

数据防泄密方案公司(dlp数据防泄密厂商排名)

在当今数字化时代&#xff0c;数据已经成为了企业最重要的资产之一。然而&#xff0c;随着企业信息化的不断深入&#xff0c;数据泄露的风险也越来越大。为了保护企业的核心数据&#xff0c;越来越多的企业开始重视数据防泄密工作&#xff0c;并寻求专业的数据防泄密方案提供商…

4-MongoDB索引知识

4.1 概述 索引支持在MongoDB中高效地执行查询。如果没有索引&#xff0c;MongoDB必须执行全集合扫描&#xff0c;即扫描集合中的每个文档&#xff0c;以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的&#xff0c;特别在处理大量的数据时&#xff0c;查询可以要…

api接口1688商品详情接口采集商品详情数据商品价格详情页数据可支持高并发调用演示示例

接入1688商品详情API接口的步骤如下&#xff1a; 注册账号&#xff1a;首先&#xff0c;你需要在1688开放平台注册一个账号。 创建应用&#xff1a;登录后&#xff0c;在控制台中找到“我的应用”&#xff0c;点击“创建应用”。 获取API密钥&#xff1a;创建应用后&#xff…

VSCode 设置代理

Open Visual Studio Code, click the settings icon in the lower left corner, and click Settings.

Web3.0初探

Web3.0初探 一、互联网发展史二、什么是Web3.0&#xff1f;三、现在的发展方向&#xff08;衍生出来的产品&#xff09;&#xff1a;四、目前问题五、Web3.0与元宇宙 一、互联网发展史 Web3.0也就是第三代互联网。最新版本的Web3.0是以太坊的创始合伙人Gavin Wood在2014年提出…

基于Python的货币识别技术实现

目录 介绍本文的目的和意义货币识别技术的应用场景货币识别的基本原理图像处理技术在货币识别中的应用特征提取方法:SIFT、HOG等支持向量机(SVM)分类器的使用实现过程数据集的收集和预处理特征提取和训练分类器参考文献介绍 本文的目的和意义 本文的目的是介绍如何利用Pyt…

观测云产品更新 | 告警策略、智能监控、场景图表、查看器等

观测云更新 监控 1、告警策略新增支持配置自定义时间段发送告警通知&#xff0c;您可以自由按日期、时间点配置不同的告警通知及对象&#xff0c;满足不同通知需求&#xff1b;重复告警新增【永久】这一事件选项&#xff1b; 2、新增支持配置多组告警策略&#xff0c;帮助您更…

解决:ModuleNotFoundError: No module named ‘torchvision’

解决&#xff1a;ModuleNotFoundError: No module named ‘torchvision’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named torchvision背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&…