通过 100 多个技巧学习 Nuxt!

planship
@planship/nuxt

用于 Nuxt 应用程序的授权、计量、计划打包和订阅管理。

planship-nuxt

欢迎使用 @planship/nuxt,一个 Nuxt 模块,它在您的 Nuxt 应用程序中启用授权、计量、计划打包和客户/订阅管理,由 Planship 提供支持。此模块基于 @planship/vue 插件和 @planship/fetch 库。

一个使用此模块的 Nuxt 应用程序的完整工作示例可以在 https://github.com/planship/planship-nuxt-example 中找到。

开始使用

使用 npm、yarn 或 pnpm 安装 @planship/nuxt

npm install @planship/nuxt
# or
yarn add @planship/nuxt
# or
pnpm add @planship/nuxt

然后,将 @planship/nuxt 添加到您的 nuxt.config.tsmodules 部分

export default defineNuxtConfig({
  modules: ['@planship/nuxt']
})

最后,在 defineNuxtConfig 中或通过环境变量配置您的 Planship 产品 slug 和身份验证凭据。

export default defineNuxtConfig({
  // ...
  planship: {
    productSlug: '<YOUR_PLANSHIP_PRODUCT_SLUG',
    clientId: '<YOUR_PLANSHIP_API_CLIENT_ID>',
    clientSecret: '<YOUR_PLANSHIP_API_CLIENT_SECRET>'
  }
}

配置选项

productSlug

您的 Planship 产品 slug。slug 也可以通过 PLANSHIP_PRODUCT_SLUG 环境变量定义。

clientIdclientSecret

您的 Planship 身份验证凭据。它们也可以通过 PLANSHIP_API_CLIENT_IDPLANSHIP_API_CLIENT_SECRET 环境变量定义。

用法

组合式函数

@planship/nuxt 模块导出两个由 @planship/vue 插件实现的组合式函数:usePlanshipCustomerusePlanship@planship/vue 插件对通用模式友好,这意味着这些组合式函数可以用于服务器端和客户端渲染。

使用授权和其他客户数据 - usePlanshipCustomer

在大多数渲染场景中,您的应用程序将需要获取和评估特定客户的 Planship 授权。这可以通过 Planship 插件和 usePlanshipCustomer 函数完成,该函数为特定客户初始化 Planship API 实例,持续获取他们的 entitlements,并在响应式 Vue ref 对象中公开它们。

下面的示例展示了如何检索客户授权,以及如何使用名为 advanced-analytics 的简单布尔功能来有条件地渲染 Vue 组件内的 <NuxtLink> 元素。

<script setup>
  import { usePlanshipCustomer } from '@planship/nuxt'

  const { entitlements } = await usePlanshipCustomer('<CURRENT_CUSTOMER_ID>')
</script>

<template>
  <NuxtLink
    v-if="entitlements['advanced-analytics']"
    to="/analytics"
  >
    Analytics
  </NuxtLink>
</template>

usePlanshipCustomer 在客户端使用时,授权会在每次更改时通过 WebSocket 连接自动更新。

在通用渲染模式下使用时,数据以下列方式获取

  1. 插件在服务器上初始化,并获取 Planship 授权和订阅数据,以便它们可以用于服务器端渲染。
  2. 插件在客户端使用已在服务器上获取的数据进行初始化。
  3. 插件在客户端重新水合自身,并启动 WebSocket 连接,以便从 Planship 持续更新授权。

用于 syncasync 操作的复合返回值

usePlanshipCustomer 函数返回一个复合结果,该结果既是一个 Promise,又是 Promise 解析为的数据对象。这意味着该函数可以作为同步函数或使用 await(或 then/catch 链)的异步函数调用。

如果您想阻止代码执行,直到从 Planship API 获取客户授权,请使用 await 调用该函数

const { entitlements } = await usePlanshipCustomer('<CURRENT_CUSTOMER_ID>')

如果您想立即返回并异步获取授权,只需在不使用 await 的情况下调用 usePlanshipCustomer

const { entitlements } = usePlanshipCustomer('<CURRENT_CUSTOMER_ID>')

由于 entitlements 是一个响应式 Vue Ref 对象,您可以在组件和页面模板中使用它,并让 Nuxt 在授权获取后自动重新渲染。

从 Planship 获取其他数据

您的应用程序可能需要从 Planship 获取其他客户数据(例如,客户订阅或使用情况数据)。要完成任何 Planship API 操作,请使用 Planship Customer API 客户端的实例,该实例由 usePlanshipCustomer 函数返回。

以下是使用 Nuxt 的 useAsyncData 检索当前客户的订阅列表的 Nuxt 设置脚本示例。

<script setup>
  import { usePlanshipCustomer } from '@planship/nuxt'

  const { planshipCustomerApiClient } = await usePlanshipCustomer('<CURRENT_CUSTOMER_ID>')

  const { data: subscriptions } = await useAsyncData('subscriptions', async () => {
    return await planshipCustomerApiClient.listSubscriptions()
  })
</script>

强类型授权对象

使用 usePlanshipCustomer 返回的授权字典时,将其包装在具有各个杠杆的 getter 的对象中可能很有用。这在像 VS Code 这样的 IDE 中尤其有利,因为它为 entitlements 启用了自动完成。

为了实现这一点,为您的产品定义一个授权类,并将其传递给 usePlanshipCustomer

<script setup>
  import { usePlanshipCustomer, EntitlementsBase } from '@planship/nuxt'

  class MyEntitlements extends EntitlementsBase {
    get apiCallsPerMonth(): number {
      return this.entitlementsDict?.['api-calls-per-month'].valueOf()
    }

    get advancedAnalytics(): boolean {
      return this.entitlementsDict?.['advanced-analytics']
    }
  }

  // entitlements is of Ref<MyEntitlements> type
  const { entitlements } = await usePlanshipCustomer('<CURRENT_CUSTOMER_ID>', MyEntitlements)
</script>

<template>
  <NuxtLink
    v-if="entitlements.advancedAnalytics"
    to="/analytics"
  >
    Analytics
  </NuxtLink>
</template>

使用计划和其他产品数据 - usePlanship

如果当前客户上下文未知,usePlanship 函数可以检索 Planship API 客户端。它公开的功能与 usePlanshipCustomer 提供的 Planship 客户 API 客户端相同,但所有客户操作(例如,获取授权和订阅)都需要 Planship 客户 ID 作为参数。

以下是使用 Nuxt 的 useAsyncData 检索 Planship 计划列表的 Nuxt 设置脚本示例。

<script setup>
  import { usePlanship } from '@planship/nuxt'

  const { planshipApiClient } = usePlanship()

  const { data: plans } = await useAsyncData('plans', async () => {
    return await planshipApiClient.listPlans()
  })
</script>

服务器服务

由于 usePlanshipCustomerusePlanship 组合式函数使用 Vue provide/inject 机制,它们只能在应用程序组件中使用。为了简化在组件代码外部(例如 服务器路由)使用 Planship 数据,@planship/nuxt 模块提供了 useServerApiClient 服务器服务,该服务在 #planship/server 别名中可用。

以下是 Nuxt API 端点的示例,该端点使用通过 useServerApiClient 服务器服务函数检索的 Planship API 客户端向 Planship API 报告计量使用情况。

import { useServerApiClient } from '#planship/server'

export default defineEventHandler(async (event) => {
  const planship = useServerApiClient()
  const body = await readBody(event)

  // Report usage for api-call metering ID to Planship
  return planship.reportUsage(body.userId, 'api-call', body.count)
})