@ cratestack/ cbor (英语)
一个自发选择右 CBOR 后端的薄伞包
CrateStack 生成的 TypeScript RPC 客户端 : @cratestack/cbor-node
(# 286, 本地 N- API) 在节点, @cratestack/cbor-web (# 287, WASM) 中 :
浏览器 - 1 npm install,一个导入路径,环境选择
执行。 最后一块 285号史诗。 。 。 .
反应原生相容性证据在
docs/react-native-compatibility.md。 。 。 .
npm install @cratestack/cbor
import { createCborCodec } from "@cratestack/cbor";
const codec = await createCborCodec();
const bytes = codec.encode({ hello: "world" });
const value = codec.decode(bytes);
节点项目从不下载WASM 二进制;浏览器捆绑从不拉
本地语 .node 文件——每个平台 dependencies (单位:千美元)@cratestack/cbor-node
或者说 @cratestack/cbor-web) 仅在匹配后实际加载
exports 条件解决.
自动选择如何运作
这个包裹 package.json 声明条件
exports 页:1
联合国 "." 条目 :
{
"exports": {
".": {
"node": { "types": "./dist/node.d.ts", "import": "./dist/node.js" },
"browser": { "types": "./dist/web.d.ts", "import": "./dist/web.js" },
"default": { "types": "./dist/web.d.ts", "import": "./dist/web.js" }
}
}
}
- 节点自己的模块解析器(以及设置
"node"条件——例如Vitest的默认environment: "node", (中文(简体) ), 网络包装target: "node"选择dist/node.js,用于再出口@cratestack/cbor-node。 。 。 . - 浏览器目标捆绑器( Vite 客户端构建, Webpack 默认)
web目标,下一个客户端捆绑)设置"browser"条件和选择dist/web.js,用于再出口@cratestack/cbor-web。 。 。 . "default"对既无条件又无条件的解决者来说 在WASM 构建时的分数(dist/web.js)),内容更为广泛 两者:只需要fetch编号 :URL编号 :WebAssembly,所有在每一个 现代JS运行时间(节点、浏览器、边缘/工人运行时间),而 节点建设取决于本地.node完全无法装入的二进制 在节点外 同样的推理是为什么包级"main"编号 :"types"字段(通过忽略的工具读取)exports(完全)也指 瓦斯姆大楼.
逃生舱口:显式子路径
有条件 exports 分辨率并不完全一致
捆绑商/SR设置——一些安全部门改革框架解决 "node" 条件偶数
用于同时向客户端运送的模块(其SSR构建套件)
"node" 因为代码 运行 服务器渲染时的节点下, 甚至
尽管同样的模块图也被捆绑到浏览器中). 何时
自动解析不满足需要, 导入平台构建
直接 :
// Force the native Node build, regardless of which condition the
// resolver would otherwise pick:
import { createCborCodec } from "@cratestack/cbor/node";
// Force the WASM build — e.g. from an SSR entry point whose bundler
// resolves "node" but whose output actually needs to run in the browser:
import { createCborCodec } from "@cratestack/cbor/web";
两个子路径导出完全相同的 createCborCodec() 形状为根
切入点是根入点的 "node"编号 :"browser"
条件在内部,只是可以直接解决.
同步 vs. async: 一个统一的 API
@cratestack/cbor-node自己的出口( e)cborCodec)是一个平正同步
对象 – 本地的 N- API 模块通过节点同步加载
require/ESM相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相接相相接相相接相接相接相接相接相相相相相相接相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相.
@cratestack/cbor-web'本身的导出必然是 async
(单位:千美元)createCborCodec(): Promise<CratestackRpcCodec>)——一次性WASM
即时处理在浏览器中没有同步等效.
此软件包常态化 两者 平台到相同的同步构件
形状 : createCborCodec() 到处都是,总是回来 Promise打开
承诺立即解决的节点(基础代码已经)
装入并同步到模块时 import - 这是
完全没有必要的同步仪式 独自一个平台,但它买
单身,真正的平台-不可知的呼叫网站. await createCborCodec()
无论哪个条件解决, 行为都一样; 没有任何条件
消耗代码需要分支 环境。 一旦解决,每个
encode编号 :decode 电话在两个平台上是同步的—— 同步成本,
真实的或名义的, 得到一次准确的报酬.
替代方案——直接暴露平台差异(同步导出)
在节点上,浏览器中的自动合成厂)并记录它——当时
考虑和拒绝:这将会迫使这个伞的每个消费者
包到环境分支或总是 await 值为
有时是真正的同步边界,有时不是,它打败了
一个伞包的目的 它应该完全隐藏这种
平台差异.
处理错误
错误的 CBOR 输入 decode,或一个值 encode 无法代表,
扔一个可捕捉的JS Error 在两个平台上——见
@cratestack/cbor-node还有.. @cratestack/cbor-web自己的 README 用于
平台专用机制(国内恐慌对例外的转换对a)
(无漏洞的WASM陷阱边界).
零处理
两个后端每个 JSON 翻译 null (上层或有巢)
真实的 CBOR 无效字节( R)0xf6),匹配 cratestack-codec-cbor属于自己的
Option::None 编码 — 而不是空阵列的突起( e) :0x80一些CBOR(美国银行)
后端为光单位类型生产. 见两个平台的软件包
读取详细内容.
贡献此软件包( Monorepo- local dev)
此软件包的自建( Q)tsc)是纯 TypeScript —— 它不需要一个 Rust
或本姆工具链。 不过它的 dependencies 为: @cratestack/cbor-node 财务报告和审定财务报表
@cratestack/cbor-web{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}这才是问题所在 在这个单曲中,这个包裹
涡轮 build 任务故意执行 没有 盖起那两个兄弟姐妹
自动( 见 turbo.json是因为 @cratestack/cbor#build (b) 超载)——a
默认依赖边缘会迫使每个没有工具链的环境
(包括这repo自己的 js CI 任务),以编译本地/瓦斯代码
键入一个薄的再出口包装.
实际效果: pnpm turbo run build test lint --filter='./packages/cratestack-cbor'
类型检查干净, 并经过任何地方, 但它的节点往返
测试(tests/node.test.ts) 只有在 @cratestack/cbor-node
实值 已经 已建 — 否则会使用控制台跳过( 不失败)
警告 警告他们 对于真正的覆盖同时发展,先建立兄弟会:
pnpm turbo run build --filter='./packages/cratestack-cbor-node'
pnpm turbo run build test lint --filter='./packages/cratestack-cbor'
或只是运行完整的未过滤 pnpm turbo run build test lint 地点
repo root — 将每个软件包建设为自己的顶级目标
所以兄弟姐妹们都在场 测试也在进行
真实的.
另见
@cratestack/cbor-node节点/本土执行。 内容 README 列出预建的平台; glibc 和穆斯尔 (阿尔卑斯山) Linux x64/arm64 都覆盖在自 第850号箱子后,所以createCborCodec()下划线"node"条件不再无法在高山上初始化 基础图像.win32-arm64尸体被发现了.@cratestack/cbor-web——浏览器/WASM执行(wasm-bindgen).crates/cratestack-codec-cbor基本、不变的Rust编码c 这两起执行都结束了.
许可证
麻省理工学院