@opengovsg/confetti

中文文档
0.9.7发布于 2026/11/02SEE LICENSE IN LICENSE.mdTypeScriptES Module

五彩纸屑的小部件

中文使用文档
文档目录15 节
  1. 安装
  2. 同行依赖性
  3. 快速入门
  4. 分析元数据
  5. 代理请求
  6. 模板组件
  7. 语言环境
  8. 静态组件
  9. 能见度钩子
  10. useVisibleAfterDelay
  11. useVisibleAfterScroll
  12. useVisibleAfterPageVisits
  13. useVisibleAfterSessionPageVisits
  14. useRespondentState
  15. 构建块

@opengovsg /糖果

可嵌入的React调查小部件,用于收集用户反馈。

npm version

安装

# npm
npm install @opengovsg/confetti

# yarn
yarn add @opengovsg/confetti

# pnpm
pnpm add @opengovsg/confetti

同行依赖性

此包需要React 18.2.0+或React 19:

npm install react@^18.2.0

快速入门

  1. 将小部件添加到您的页面:
import { PopoverConfetti } from '@opengovsg/confetti'

function App() {
  return (
    <div style={{ position: 'fixed', bottom: '1rem', right: '1rem' }}>
      <PopoverConfetti
        surveyId="your-survey-id"
        publishableKey="your-publishable-key"
        metadata={{}}
      />
    </div>
  )
}

模板组件加载脚本包和样式表 运行时的CDN,这是 没有CSS要导入 -包括 主机渲染触发器按钮,其中 TriggerPopoverConfetti 风格本身。( 较低级别的 @opengovsg/confetti/components 原语和 这个 @opengovsg/confetti/static 选择退出表面渲染在你自己的bundle和 仍然需要 import '@opengovsg/confetti/confetti.css'.)

注意: 您将需要调查ID和可发布密钥从您的五彩纸屑仪表板。确保在团队设置中将您的域列入白名单。

分析元数据

默认情况下,禁用Analytics元数据收集。集 autoInjectAnalyticsMetadata 来 true 公开的标识符 在主机页面上发布每个响应的thog和Datadog RUM:

<PopoverConfetti
  surveyId="your-survey-id"
  publishableKey="your-publishable-key"
  autoInjectAnalyticsMetadata
/>

小部件从中读取这些sdk window.posthog 和 window.DD_RUM,而它 从不捆绑任何一个SDK。 @datadog/browser-rum 分配 window.DD_RUM 用于 一旦导入,您就可以使用它,所以Datadog不需要额外的设置。

postthog是不同的——你必须自己曝光。 它 文档 这是大多数现代应用程序所不具备的 window.posthog,所以把它分配到你的任何地方 预置PostHog:

import posthog from 'posthog-js'

posthog.init('<your-project-token>', { api_host: '<your-api-host>' })

window.posthog = posthog

缺少SDK的任何标识符都将被跳过,因此仍然是部分设置 提交其余部分。这些键在可用时收集:

关键来源
posthog_distinct_idposthog.get_distinct_id()
posthog_session_idposthog.get_session_id()
datadog_rum_session_idDD_RUM.getInternalContext()
datadog_rum_userDD_RUM.getUser(), JSON字符串化
datadog_rum_user_id, datadog_rum_user_email, datadog_rum_user_nameDD_RUM.getUser() 标准字段

传递的显式值 metadata 总是优先于 自动收集值。

使用Datadog会话ID在Datadog会话浏览器中查找会话 与 @session.id:<datadog_rum_session_id>.

  1. 在CSP标题中添加五彩纸屑。小部件从CDN加载它的脚本和样式表并调用API,所以allowlist全部三个:
script-src https://confetti.gov.sg;
style-src https://confetti.gov.sg;
connect-src https://confetti.gov.sg;

代理请求

每个模板组件都接受一个可选的 proxyUrl。设置后,小部件 将其API请求发送到 {proxyUrl}/api/v1/cfti/... 而不是 https://confetti.gov.sg,而cdn支持的shell也会加载它们的脚本 和样式表 {proxyUrl}/widget/v1/...。使用这个来路由小部件 通过您自己的来源的流量,例如当您的CSP拒绝第三方 方主机。

contfetti Cloud团队可以从 团队设置. 创建此处显示的仅限dns的CNAME,并等待它变为活动状态,然后通过 生成的URL。如果主机名在Cloudflare DNS中,禁用橙色 云所以 代理地位 是 DNS只 -参见 托管代理指南.

<PopoverConfetti
  proxyUrl="https://c.example.gov.sg"
  surveyId="..."
  publishableKey="cfti_pk_..."
/>

当使用托管代理时,请为所示的所有三个CSP指令使用该源 上面而不是 https://confetti.gov.sg.

模板组件

选择最适合您用例的组件:

组件用例行为
EmbeddedConfetti内联调查,反馈部分通过提交按钮以内联方式显示问题
ModalConfetti中断的、集中的调查中心模式叠加,一步一步的问题,自动提交
PopoverConfetti浮动反馈部件不允许弹出窗口,一步一步的问题,自动提交
TriggerPopoverConfetti反馈启动按钮呈现一个触发按钮,在单击时打开一个可忽略的弹出窗口调查;reopenable
StepperConfetti引导调查一次一个问题,最后一个问题后自动提交

语言环境

需要 @opengovsg/confetti 0.8.2 或更高版本。旧版本保留 英语调查-他们不会失败加载。

通过 locale 显示翻译后的调查。作者翻译在纸屑 英语永远是来源,汉语、马来语和泰米尔语也是 可选)。未翻译的字段返回到英语。

小部件本身并不读取浏览器语言。使用 useResolveLocale 来映射BCP-47标记(或浏览器的语言) 偏好) 'en' | 'zh' | 'ms' | 'ta':

import { PopoverConfetti, useResolveLocale } from '@opengovsg/confetti'

function Feedback() {
  const locale = useResolveLocale()

  return (
    <PopoverConfetti
      surveyId="your-survey-id"
      publishableKey="your-publishable-key"
      locale={locale}
    />
  )
}

通过 preferred 当宿主应用程序已经知道区域设置时(例如 next-intl)。通过 explicit 即使失败了,也能赢得胜利 匹配一个conffetti区域设置—包括一个空字符串,它返回到 用英语代替 preferred:

const locale = useResolveLocale({
  preferred: i18n.locale,
  explicit: searchParams.get('locale'),
})

要始终显示一种语言,通过 locale 直接跳过钩子:

<PopoverConfetti
  surveyId="your-survey-id"
  publishableKey="your-publishable-key"
  locale="zh"
/>
价值语言
en英语(默认)
zh中文
ms马来语
taதமிழ்

插件chrome你没有自定义-跳过,下一步,提交,返回,关闭,其他, 占位符和验证错误-仍然针对给定的语言环境进行本地化。 省略 locale,或通过 'en',以保持英语调查。

同样的道具在 静态 组件和 在 积木 原语。进口 useResolveLocale 从 @opengovsg/confetti 在这些设置中也是如此。看到 翻译指南.

静态组件

这个 @opengovsg/confetti/static 子路径船的独立构建 相同的模板组件(EmbeddedConfetti, ModalConfetti, PopoverConfetti, StepperConfetti)加上 ConfettiTrigger 作文 帮手。它们完全从你自己的包中呈现,没有运行时CDN 依赖,因此调查呈现更新仅在升级时到达您的站点 包。

import '@opengovsg/confetti/confetti.css'

import { PopoverConfetti } from '@opengovsg/confetti/static'

与支持cdn的shell不同,静态组件需要样式表 如上所示的导入。

能见度钩子

控制你的调查何时出现与这些挂钩:

useVisibleAfterDelay

延迟后显示调查结果:

import { useVisibleAfterDelay } from '@opengovsg/confetti'

const { isVisible } = useVisibleAfterDelay({ delay: 5000 }) // 5 seconds

useVisibleAfterScroll

滚动一定距离后显示调查结果:

import { useVisibleAfterScroll } from '@opengovsg/confetti'

const { isVisible } = useVisibleAfterScroll({ threshold: 500 }) // 500px

useVisibleAfterPageVisits

一旦访问者加载了给定次数的当前页面(跨会话持续),就显示调查 localStorage):

import { useVisibleAfterPageVisits } from '@opengovsg/confetti'

const { isVisible, reset } = useVisibleAfterPageVisits({
  visits: 3,
  respondent: 'optional-respondent-identifier',
})

useVisibleAfterSessionPageVisits

如上所述,但访问计数的范围是通过当前浏览器会话 sessionStorage:

import { useVisibleAfterSessionPageVisits } from '@opengovsg/confetti'

const { isVisible, reset } = useVisibleAfterSessionPageVisits({ visits: 3 })

useRespondentState

在没有模板的情况下,阅读应答者的回复和解雇时间。 respondent (此钩子不会生成匿名id)。

import { useRespondentState } from '@opengovsg/confetti'

const respondentState = useRespondentState({
  surveyId: '<your-survey-id>',
  publishableKey: '<your-publishable-key>',
  respondent: '<user-id>',
})

构建块

的底层原语 模板组件 都是从 @opengovsg/confetti/components 子路径。利用这些来组成你自己的调查UI。

import {
  ConfettiController,
  ConfettiProvider,
  SurveyContext,
  useSurvey,
} from '@opengovsg/confetti/components'

与模板组件不同,这些原语在您自己的包中呈现 在你的应用入口点导入一次样式表:

import '@opengovsg/confetti/confetti.css'

版本与发布记录

@opengovsg/confetti 共发布 84 个版本,首次发布于 2026/01/22;过去 12 个月发布了 84 个版本。

版本发布日期距今
0.9.7latest2026/11/021 天前
0.9.62026/10/2113 天前
0.9.52026/10/1420 天前
0.9.42026/10/1222 天前
0.9.32026/10/0727 天前
0.9.22026/09/291 个月前

其他发布通道:snapshot → 0.0.0-snapshot-20260813020755。

关于 @opengovsg/confetti 的常见问题

@opengovsg/confetti 是什么?

五彩纸屑的小部件

如何安装 @opengovsg/confetti?

在项目目录运行 npm install @opengovsg/confetti,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18.2.0 || ^19.0.0)、react-dom(^18.2.0 || ^19.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@opengovsg/confetti 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@opengovsg/confetti 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@opengovsg/confetti 可以商用吗?

@opengovsg/confetti 使用 SEE LICENSE IN LICENSE.md 许可。许可条款写在包内的独立文件中,请阅读该文件确认可否商用。以上为概括,不构成法律意见,请以许可原文为准。

@opengovsg/confetti 还在维护吗?

最新版本 0.9.7 发布于 2026/11/02(1 天前);至今共发布 84 个版本,其中过去 12 个月发布了 84 个;首次发布于 2026/01/22。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。