@brexhq/brex-js

中文文档
4.2.0发布于 2026/07/31ISCTypeScriptES Module零依赖近 30 天下载 1.2万

一个JavaScript SDK,用于将Brex发行的卡片元素整合到网络应用中. 这个库为显示敏感的卡片信息提供了安全而基于iframe的组件.

中文使用文档
文档目录8 节
  1. 快速启动
  2. 可用元素
  3. 样式元素
  4. 复制按钮
  5. 事件处理
  6. 预装请求者 iframe( 可选)
  7. 仪器(可选)
  8. 完整示例

@ brexhq/ brex- js (英语)

一个JavaScript SDK,用于将Brex发行的卡片元素整合到网络应用中. 这个库为显示敏感的卡片信息提供了安全而基于iframe的组件.

快速启动

import Brex from '@brexhq/brex-js';

// Initialize Brex
const brex = Brex();
const elements = brex.elements();

// Create a card number display element
const cardNumber = elements.create('issuingCardNumberDisplay', {
  issuingCard: 'your_issuing_card_id',
  ephemeralKeySecret: 'your_ephemeral_key'
});

// Mount it to a container
cardNumber.mount('#card-number-container');

// Listen for events
cardNumber.on('complete', () => {
  console.log('Card number is ready');
});

可用元素

库提供了显示卡片信息的若干要素:

  • issuingCardNumberDisplay: 显示牌号
  • issuingCardCvcDisplay: 显示 CVC/ 安全代码
  • issuingCardExpiryDisplay: 显示过期日期
  • issuingCardPinDisplay: 显示 PIN
  • issuingCardCopyButton: 创建复制卡片细节的按钮

样式元素

您可以使用支持的样式属性自定义元素的外观 :

const element = elements.create('issuingCardNumberDisplay', {
  issuingCard: 'your_issuing_card_id',
  ephemeralKeySecret: 'your_ephemeral_key',
  style: {
    fontSize: '16px',
    fontFamily: 'Arial, sans-serif',
    color: '#333333',
    fontWeight: 'normal',
    letterSpacing: 'normal',
    lineHeight: '1.5',
    padding: '10px'
  }
});

// Update styles later
element.update({
  fontSize: '18px',
  color: '#000000'
});

复制按钮

复制按钮元素允许用户复制卡片细节:

const copyButton = elements.create('issuingCardCopyButton', {
  issuingCard: 'your_issuing_card_id',
  ephemeralKeySecret: 'your_ephemeral_key',
  toCopy: 'number' // 'number', 'cvc', 'expiry', or 'pin'
});

copyButton.mount('#copy-button-container');
copyButton.on('copied', () => {
  console.log('Card number copied');
});

事件处理

所有要素都支持以下活动:

  • complete: 当元素被完全装入时起火
  • loading: 当元素被装入时已开火
  • error: 出错时已开火
  • copied: 内容被复制时被点燃(用于复制按钮)
element.on('complete', () => {
  console.log('Element is ready');
});

element.on('error', () => {
  console.log('Something went wrong');
});

预装请求者 iframe( 可选)

在幕后现场, Brex(...).elements() 挂载隐藏的“ 请求者” 框 第一次 create() 名为. iframe 需要下载并解析其 在获取敏感细节之前拥有捆绑, 它可以添加~1-2秒 到用户等待卡 PAN 出现在第一视图时.

如果您的用户界面提前知道卡片视图即将到来( 例如, a) 用户刚刚导航到钱包/卡路由,您可以拨打 prewarm() 提前挂载请求者 iframe , 以便其靴子从用户的 关键路径 :

import Brex from '@brexhq/brex-js';

const elements = Brex().elements();

// Some time before the user actually opens a card. Idempotent and cheap.
elements.prewarm();

// Later — when the user opens the card. The requester is already
// mounted, so this skips the iframe-boot step and goes straight to
// fetching card details.
const cardNumber = elements.create('issuingCardNumberDisplay', {
  issuingCard: 'your_issuing_card_id',
  ephemeralKeySecret: 'your_ephemeral_key',
});
cardNumber.mount('#card-number-container');

注释:

  • 《同上》: 调用 prewarm() 多次只挂载一帧. 安全不受每个组成部分的影响.
  • 没有卡片数据发送数字 : prewarm() 不取参数并发送否 issuingCard, (中文(简体) ), ephemeralKeySecret,或任何其他用户/卡标识符. 仅 create() 这样做.
  • 只有客户端: 将框架附加到 document.body; 通话期间 SSR会投出.
  • 后无 create():如果请求者已经挂载,则随后 prewarm() 电话什么都不做,也不放过任何事件.

在使用仪器时(见下文),升温前释放出单个仪器 requesterPrewarmed 事件可以测量 iframe 需要多长时间 进入真正的用户状态.

仪器(可选)

Brex可以发射生命周期事件 覆盖请求者 Iframe握手 可见元素 iframes, 以及它们之间的后Message回转。 使用 这是用来测量SDK的计时 并转发到你的RUM/遥测管.

import Brex from '@brexhq/brex-js';

const brex = Brex({
  environment: 'production',
  // Called for every lifecycle event. Keep it cheap.
  onEvent: (event) => {
    // event = { type, timestamp, key?, elementType?, issuingCard?, metadata? }
    datadogRum.addAction('brex_js_event', event);
  },
  // Optional: also mirror events to console.debug. Default false.
  debug: process.env.NODE_ENV !== 'production',
});

排放事件类型包括:

  • 请求者 iframe : requesterPrewarmed (仅在 prewarm() 称为, requesterCreated, (中文(简体) ), requesterReady, (中文(简体) ), requesterPortTransferred, (中文(简体) ), requestCardDetailsSent, (中文(简体) ), cardDetailsReceived, (中文(简体) ), cardDetailsForwarded
  • 可见元素 iframe : elementCreated, (中文(简体) ), elementReady, (中文(简体) ), elementPortTransferred, (中文(简体) ), elementMounted, (中文(简体) ), elementUnmounted, (中文(简体) ), elementDestroyed
  • 错误 : elementError

每次活动都包含一个 timestamp,并在适用的情况下,iframe key, (中文(简体) ), elementType,以及消费者提供的 issuingCard 关系.

这个 timestamp 实值 performance.timeOrigin + performance.now() (高比率) 绝对时间戳与 Date.now()) (中文(简体) ). SDK使用 Iframes 软件 引擎盖下——每个机身都有自己的 performance.timeOrigin,那么简单 performance.now() 值在父窗口之间不具有可比性 还有Iframes。 添加中 timeOrigin 生成您可以横切的值 王国。 在同一领域,减去两个乘以的印记产生同样的效果 结果是 performance.now() 算术(来源取消). 见 MDN: 在上下文之间同步时间。 。 。 .

电子密钥和卡片细节无论如何都不会包含在内 载荷.

如果没有 onEvent 也没有 debug 提供, SDK 使用不开放发射器 并且不产生运行时间费用.

完整示例

以下是一个完整的例子,说明如何显示所有卡片信息:

import Brex from '@brexhq/brex-js';

const brex = Brex();
const elements = brex.elements();

// Common configuration
const config = {
  issuingCard: 'your_issuing_card_id',
  ephemeralKeySecret: 'your_ephemeral_key',
  style: {
    fontSize: '16px',
    fontFamily: 'Arial, sans-serif',
    color: '#333333'
  }
};

// Create elements
const cardNumber = elements.create('issuingCardNumberDisplay', config);
const cardCvc = elements.create('issuingCardCvcDisplay', config);
const cardExpiry = elements.create('issuingCardExpiryDisplay', config);
const cardPin = elements.create('issuingCardPinDisplay', config);

// Mount elements
cardNumber.mount('#card-number-container');
cardCvc.mount('#card-cvc-container');
cardExpiry.mount('#card-expiry-container');
cardPin.mount('#card-pin-container');

// Add copy buttons
const copyNumber = elements.create('issuingCardCopyButton', {
  ...config,
  toCopy: 'number'
});
copyNumber.mount('#copy-number-button');

// Event handling
cardNumber.on('complete', () => console.log('Card number ready'));
copyNumber.on('copied', () => console.log('Card number copied'));

必需的 HTML :

<div id="card-number-container"></div>
<div id="copy-number-button">Copy</div>
<div id="card-cvc-container"></div>
<div id="card-expiry-container"></div>
<div id="card-pin-container"></div>

版本与发布记录

@brexhq/brex-js 共发布 10 个版本,首次发布于 2025/04/18;过去 12 个月发布了 6 个版本。

版本发布日期距今
4.2.0latest2026/07/313 个月前
4.1.12026/06/174 个月前
4.1.02026/06/134 个月前
4.0.02026/03/247 个月前
3.2.12026/03/107 个月前
3.2.02026/03/098 个月前

关于 @brexhq/brex-js 的常见问题

@brexhq/brex-js 是什么?

一个JavaScript SDK,用于将Brex发行的卡片元素整合到网络应用中. 这个库为显示敏感的卡片信息提供了安全而基于iframe的组件.

如何安装 @brexhq/brex-js?

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

@brexhq/brex-js 支持 TypeScript 吗?

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

@brexhq/brex-js 支持 ESM 还是 CommonJS?

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

@brexhq/brex-js 可以商用吗?

@brexhq/brex-js 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@brexhq/brex-js 的下载量有多少?

根据 npm 官方下载统计,@brexhq/brex-js 在 2026/10/09 – 2026/11/07 这 30 天内被下载 11,550 次,日均约 385 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@brexhq/brex-js 还在维护吗?

最新版本 4.2.0 发布于 2026/07/31(3 个月前);至今共发布 10 个版本,其中过去 12 个月发布了 6 个;首次发布于 2025/04/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。