如果你做过电商、出海、旅行、订阅制产品,或者任何“用户可能会拿着不同货币来烦你”的业务,你大概率经历过这种对话:

产品/老板:这个页面加个汇率换算吧,很简单的。
你:行啊。(内心:又来了)

因为“很简单”的背后通常是:

  • 选个汇率接口(最好不要 key,不要注册,不要配额,不要收费……懂的都懂)
  • 处理超时、网络抖动、429/5xx(不然线上会让你看到人间真实)
  • 缓存(不然你会被同事/自己/用户一起打爆)
  • 货币列表(最好还能搜中文,不然“人民币”三个字能让你写一整套映射)
  • 最后再把这些东西重复粘贴到下一个项目里,继续假装这叫“沉淀”

于是我写了 exchange-rate-sdk:一个轻量级、跨平台(浏览器 + Node.js)的汇率查询 SDK。它的目标就一个:把这些“每个项目都要做一遍、又不想做一遍”的活儿,打包成一个你能直接用的工具。

如果你只想先试试水,直接去 Playground:
https://chengzuopeng.github.io/exchange-rate-sdk/

顺手把链接也放这儿(方便你收藏/转发/甩给同事):


它到底解决了什么问题?

我把它做成了“开箱即用”的风格,尽量不让你在接入时做选择题。

  1. 跨平台:浏览器和 Node.js 都能跑
    同一套 API,不用你写两份逻辑。

  2. 智能缓存:默认就给你省请求

  • 浏览器:localStorage + 内存 双层缓存(刷新页面也还在)
  • Node.js:内存缓存(进程重启就清空,简单直接)
  1. 自动重试:网络不稳定时别立刻跪
    遇到网络错误、超时、5xx、429,会按指数退避自动重试(你可以配置最大重试次数和延迟基数)。

  2. 零运行时依赖
    我知道很多人对依赖洁癖(我也是)。所以运行时不带第三方库,尽量减少体积和供应链焦虑。

  3. 离线货币信息 + 中英文搜索
    内置了 168 种货币信息:你可以离线查 USD 是什么、也可以直接搜“人民币 / Dollar / United States”。

  4. TypeScript 友好
    类型定义齐全,写起来不靠猜。


30 秒上手(真的)

安装:

1
2
3
npm i exchange-rate-sdk
# or
yarn add exchange-rate-sdk

npm 包主页:https://www.npmjs.com/package/exchange-rate-sdk

查询汇率:

1
2
3
4
5
6
import { ExchangeRateSDK } from 'exchange-rate-sdk';

const client = new ExchangeRateSDK();
const rate = await client.getRate('USD', 'CNY');

console.log(`1 USD = ${rate} CNY`);

金额换算:

1
2
const result = await client.convert(100, 'USD', 'CNY');
// => { amount: 725, from: 'USD', to: 'CNY', rate: 7.25 }

你会喜欢它的几个“细节”

1) 缓存是默认开启的

绝大多数业务里,汇率没必要每次都去打接口。SDK 默认缓存 24 小时,你也可以改:

1
const client = new ExchangeRateSDK({ cacheTTL: 60 * 60 * 1000 }); // 1 小时

必要时一键清空:

1
client.clearCache();

2) 重试不是“无限莽”,而是可控的

你可以把它当成“网络偶尔抽风时的缓冲垫”:

1
2
3
4
5
const client = new ExchangeRateSDK({
timeout: 10_000,
maxRetries: 3,
retryDelay: 1000, // 1s, 2s, 4s...
});

3) 货币信息离线可查,还能搜中文(这是我自己踩过的坑)

1
2
3
4
5
client.getCurrency('USD');
client.getCurrencies();
client.searchCurrency('人民币');
client.searchCurrency('Dollar');
client.searchCurrency('United States');

我做这个功能的动机非常朴素:
当 PM 在群里发“把人民币也支持一下”的时候,你不想回一句“人民币本来就支持啊,只是叫 CNY”,然后被回一句“用户不知道 CNY”。

4) 错误是“可判断”的,不是“随缘 catch”

SDK 统一抛出带 code 的错误,你可以按错误码做兜底策略:

1
2
3
4
5
6
7
8
9
import { isSDKError } from 'exchange-rate-sdk';

try {
await client.getRate('INVALID', 'USD');
} catch (err) {
if (isSDKError(err)) {
console.log(err.code); // INVALID_CURRENCY_CODE / NETWORK_ERROR / TIMEOUT_ERROR / API_ERROR ...
}
}

关于数据源(以及一点点真诚的免责声明)

SDK 默认请求的是 https://api.exchangerate-api.com/v4/latest/{BASE}

这意味着:

  • 接入时不需要你额外配置 key(主打一个少操心)
  • 但它终究是外部 API:可能会有配额、限流、偶发波动
    所以我才把缓存、超时、重试都做成了默认能力

另外,汇率适合做“展示/估算/结算前提示”,不适合做“高频交易/套利系统的核心依据”。
别问我为什么突然严肃,问就是我不想让你背锅(也不想我背锅)。


Node.js / 浏览器使用提示

  • 浏览器:直接用就行(有 localStorage 的地方缓存会更香)
  • Node.js:需要全局 fetch(Node 18+ 自带;更老版本你可以自己加一个 fetch polyfill)

最后:你可以怎么开始用它?

  1. 先去 Playground 玩一圈:https://chengzuopeng.github.io/exchange-rate-sdk/
  2. 在你的项目里装上:npm i exchange-rate-sdk
  3. 把你那段“汇率请求 + 缓存 + 重试 + 错误处理”的代码删掉(这一步最解压)

如果你用起来有任何不顺手的地方,欢迎提 issue。
我写这个 SDK 的初衷就是:让“汇率这件小事”不要再占用我们太多生命值。

觉得有用的话,顺手点个 Star ⭐ 支持一下~

Happy Coding!