@evumi/berth-config

中文文档
0.1.25发布于 2026/11/13MITTypeScriptESM + CJS零依赖近 30 天下载 1.7万

Berth 專案的客戶端 Config:被缓存后以背景长波刷新来读取.

中文使用文档
文档目录6 节
  1. 用法
  2. 行为
  3. Next.js
  4. Express
  5. 本地开发
  6. 开发

@evumi/berth-config

读取 Berth 项目 Config 的客户端。第一次读取时拉一次整份配置,之后都从内存读;后台用一个长轮询保持最新。零运行时依赖,支持 Node ≥ 18、Bun、Deno 和不带 Node 内置模块的 edge 运行时。

不要放机密。 Config 对组织成员可读。密码、密钥放到服务变量里。

此 SDK 用于服务端(包括服务端组件、API 路由和 edge Worker)。BERTH_CONFIG_TOKEN 是服务端凭据,同时用于环境的 KV 和队列等接口,不能下发到浏览器。前端需要配置或 KV 数据时,由应用后端校验权限并仅返回所需字段。不要把 Token 复制到 NEXT_PUBLIC_*、VITE_*、打包器环境变量映射或客户端 props;不要在客户端组件里使用此 SDK。

用法

Berth 会给容器注入 BERTH_CONFIG_URL 和 BERTH_CONFIG_TOKEN,直接用默认导出:

import { config } from '@evumi/berth-config';

const enabled = await config.get<boolean>('newCheckout');
const all = await config.getAll();
const unsubscribe = config.subscribe((doc) => console.log('config changed', doc));

自己建客户端:

import { createClient } from '@evumi/berth-config';

const cfg = createClient({
  url: process.env.BERTH_CONFIG_URL,   // 默认读环境变量
  token: process.env.BERTH_CONFIG_TOKEN,
  fallback: './config.local.json',     // 本地开发或启动时连不上服务器时使用
  timeoutMs: 5000,
  onError: (err) => console.warn('config:', err.code, err.message), // 默认什么都不打
});
方法说明
get<T>(key)某个顶层字段,不存在时返回 undefined
getAll<T>(keys?)整份文档,或只取给出的字段
has(key)字段是否存在
digest()当前 ETag(不带引号);用的是 fallback 时为 ""
version()当前版本号;还没有配置或用的是 fallback 时为 0
subscribe(cb)配置变化时回调,返回取消函数
close()停止长轮询并中断进行中的请求

返回值是副本,改了不影响缓存。

行为

  • 第一次调用任意方法时拉取 GET /v1/config,并发调用共用这一次请求;失败了下次调用会重试。
  • 之后后台只有一个长轮询(?wait=55 + If-None-Match),变化时立即更新并通知订阅者。
  • 出错时按指数退避重试(带抖动,最长 30 秒);429 按 Retry-After 等待。
  • Node 里长轮询的连接和定时器都已 unref,不会让进程退出不了;脚本里也不需要手动 close()。
  • 错误都是 BerthConfigError,带 code(unauthorized、not_found、unavailable、rate_limited、timeout、network、missing_env、fallback 等)和 status。令牌不会出现在错误或日志里。

Next.js

// app/page.tsx(服务端组件)
import { config } from '@evumi/berth-config';

export default async function Page() {
  const banner = await config.get<string>('banner');
  return <main>{banner && <p>{banner}</p>}</main>;
}

Edge 运行时也能用,fallback 只能传对象(edge 没有文件系统)。

Express

import express from 'express';
import { config } from '@evumi/berth-config';

const app = express();
app.get('/', async (_req, res) => {
  const { maxItems = 20 } = await config.getAll<{ maxItems?: number }>();
  res.json({ maxItems });
});
app.listen(3000);

本地开发

本地没有 BERTH_CONFIG_URL / BERTH_CONFIG_TOKEN 时读 fallback:

const cfg = createClient({ fallback: './config.local.json' });   // 文件(Node/Bun/Deno)
const cfg2 = createClient({ fallback: { newCheckout: true } });  // 或直接给对象

没有环境变量也没有 fallback 时,读取会抛 missing_env。

开发

pnpm install
pnpm test    # 先构建,再跑 vitest(含 ESM/CJS 子进程退出测试)
pnpm build   # dist/esm + dist/cjs

版本与发布记录

@evumi/berth-config 共发布 91 个版本,首次发布于 2026/10/26;过去 12 个月发布了 91 个版本。

版本发布日期距今
0.1.25latest2026/11/131 天前
0.1.232026/11/121 天前
0.1.222026/11/121 天前
0.1.202026/11/121 天前
0.1.192026/11/112 天前
0.1.182026/11/112 天前

关于 @evumi/berth-config 的常见问题

@evumi/berth-config 是什么?

Berth 專案的客戶端 Config:被缓存后以背景长波刷新来读取.

如何安装 @evumi/berth-config?

在项目目录运行 npm install @evumi/berth-config,或使用 pnpm add / yarn add / bun add。

@evumi/berth-config 支持 TypeScript 吗?

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

@evumi/berth-config 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@evumi/berth-config 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@evumi/berth-config 可以商用吗?

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

@evumi/berth-config 的下载量有多少?

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

@evumi/berth-config 还在维护吗?

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