在TypeScript和JavaScript如何使用MetaMessage?

简介: MetaMessage 是一种跨语言数据交换协议,支持 TypeScript/JavaScript(通过装饰器自动类型转换)、JSONC 文本与紧凑二进制 wire 格式,兼顾可读性、精度(如 bigint 表示 int64)与性能,旨在替代 JSON、Protobuf 等传统序列化方案。

截屏2026-05-18 23.28.54.png
截屏2026-05-18 23.30.29.png

在TypeScript和JavaScript如何使用MetaMessage?

本來是不報信心的,因為ts和js天生類型缺失,作為一個動態語言,number既不是int也不是bigint,開始設計的時候想了挺長時間。

還好,確認了ts是支持裝飾器的,雖然也寫過很多前端項目,卻從來沒有用過這個裝飾器。既然有裝飾器,那就非常適合MetaMessage改造,簡單的方式就可以把值進行轉換。對於一些類型,為了不丟失精度,int/int64/uint/uint64需要用bigint來表示,這點需要注意。

看一個例子:

import {
    encodeFromJsonc, decodeToJsonc } from 'metamessage';

@mm({
    desc: '用户' })
class User {
   
  @mm({
    type: ValueType.Int64, desc: '用户ID' })
  id: bigint = 0n;

  @mm({
    desc: '昵称', nullable: false })
  name: string = '';

  @mm({
    type: ValueType.Uint8, desc: '年龄' })
  age: number = 0;
}

const u = new User();
u.id = 666n;
u.name = 'abc';
u.age = 20;

const wire = encodeFromValue(u);
console.log('wire', wire);

const decoded = decodeToValue(wire, User);
console.log('decoded', decoded);

const jsonc = `
// mm: desc="用户"
{
  // mm: type=i64; desc="用户ID"
  "id": 666,

  // mm: desc="昵称"
  "name": "abc",

  // mm: type=u8
  "age": 20
}
`;

const wire = encodeFromJsonc(jsonc);
const jsoncString = decodeToJsonc(wire);
console.log('JSONC result:\n', jsoncString);

上面用一個mm裝飾器來包裹mm的標籤,desc可以描述字段信息,用戶可以從中了解輸出的數據意義。
特殊的類型 比如ValueType.Int64是需要標注的,這樣類型極少的js也可以表示複雜的數據類型了。
nullable代表數據是否可以為空,這在請求描述上特別有用,nullable說明字讀是可選的,當然可以搭配allow_empty,效果更佳。

說下這裡的jsonc,這是一種mm可以表示的文本形式,各語言可能數據對象不一致,但如果輸出jsonc,相同語意的jsonc是一致的。所以各語言間是可以表示相同語意的,且不會出錯。

wire是一種序列化的二進制形式,佔用空間小,也方便解析,可以在網絡傳輸中直接用它。

MetaMessage目前已經支持不少語言了。不過還有很多語言支持在路上,未來作為一種各語言間理想的數據交換工具,一定會流行開來。

替代傳統的json、protobuf、messagePack等老舊協議指日可待。

目录
相关文章
|
3月前
|
存储 弹性计算 负载均衡
阿里云巨型帧是什么?云服务器ECS支持规格、开启关闭及配置步骤问题解答FAQ
阿里云巨型帧(Jumbo Frames)支持8500字节超大以太网帧,突破传统1500字节限制,可显著减少数据包数量、降低CPU负载、提升网络吞吐与大块数据传输效率,适用于HPC、大数据、SAN等高带宽场景。详细参考云服务器ECS官网解读:https://t.aliyun.com/U/AZBUsA
422 123
|
2月前
|
弹性计算 缓存 负载均衡
可用架构实践:阿里云支撑跑腿平台稳定运行,分账链解决交易结算核心痛点
同城跑腿、即时代办、即时配送属于典型的高并发、短时效、强交易、高波动业务场景:节假日、午晚高峰、暴雨暴雪天气会瞬间触发流量峰值,订单秒级涌入;同时每一笔订单都涉及用户、平台、入驻商户、跑腿个人师傅四方交易分润,业务链路复杂。 对于开发者而言,跑腿平台上线运营核心要解决两大问题:业务层高可用稳定承载 + 交易层合规自动化分账。 绝大多数成熟跑腿平台,均基于阿里云云原生架构实现业务稳定、弹性扩容、故障自愈,保障全时段服务可用;而针对行业专属的多方分账、高分润、逆向退款、合规清算难题,行业通用最优解是垂直场景专用系统——分账链。 本文从阿里云架构落地、业务痛点拆解、交易分账解决方案三个维度,完整复盘
379 122
|
3月前
|
人工智能 自然语言处理 监控
开源 APM 详细功能对比:SkyWalking vs Databuff
本文对比 SkyWalking 与 Databuff 在服务监控、链路追踪、拓扑、告警及 AI 问数五大核心场景的实操差异,基于双 Demo 真实界面截图与功能表,突出 Databuff 的 OTLP 原生接入、服务关系首屏、瀑布图着色、中文告警直读及自然语言智能问数等优势,助力团队面向 OTel 统一与智能化运维选型。(239字)
449 121
开源 APM 详细功能对比:SkyWalking vs Databuff
|
4月前
|
JavaScript 文件存储 数据安全/隐私保护
打造你的私人电子书王国:Talebook 项目全面介绍
Talebook 以其简洁的部署、优雅的界面和强大的功能,成为了这个领域不可多得的好项目。
954 127
|
3月前
|
人工智能 自然语言处理 API
【Azure AI Search】Index的字段使用默认Analyzer(standard.lucene) 和 en.microsoft 有什么不同?
Azure AI Search英文检索因词形差异(如brief/briefs)无法匹配,根源在于analyzer选择:默认standard.lucene不处理词形还原,而en.microsoft支持lemmatization,可将变体还原为基本形式。需通过新增字段并配置en.microsoft analyzer解决,兼顾检索质量与业务需求。
313 124
|
3月前
|
人工智能 自然语言处理 API
【Azure AI Search】 stopword 是什么,为什么它会影响搜索结果?
本文解析 Azure AI Search 中搜索 "in brief" 返回结果过多的问题,指出根源在于 analyzer 对停用词(如 "in")的处理差异:默认 `standard.lucene` 保留停用词导致泛匹配,而 `en.microsoft` 会过滤停用词,使结果更精准。关键在于根据业务语义选择合适 analyzer。
248 121
|
3月前
|
Web App开发 iOS开发
苹果自带浏览器展示不了钉钉二维码
使用window.DTFrameLogin函数,在safari不展示二维码
291 122
|
3月前
|
消息中间件 人工智能 数据挖掘
企业AI调用资产化:从"谁用谁知道"到"组织可复用"的技术路径
企业AI调用产生的Prompt、工作流、上下文配置正在成为新的知识资产,但散落在个人账号中无法沉淀。本文从工程角度拆解一条完整的"收口→采集→提纯→入库→蒸馏"链路,探讨技术实现中的关键设计决策。
396 123
|
3月前
|
机器学习/深度学习 弹性计算 编解码
ecs.c9i.2xlarge——阿里云8核16G云服务器ECS计算型c9i实例,新一代企业级x86计算架构
阿里云ECS全新计算型c9i实例(8核16G),基于CIPU架构,搭载Intel Xeon 6982P-C处理器,兼顾高性能计算、高网络吞吐与安全可信能力,适用于机器学习推理、数据分析、视频编码等场景。阿里云服务器ECS官网:https://t.aliyun.com/U/AZBUsA
362 122
|
3月前
|
存储 人工智能 前端开发
为了 Vibe Coding 地图更方便,我给 WeaveFox 造了一个轮子
开发者基于WeaveFox Vibe Coding打造合规高德地图React组件库amapcn,支持shadcn分发、NPM包及AI Skill集成,内置15+地图能力组件。同步开源并上架WeaveFox技能市场,3天快速构建全栈地图应用,免费部署上线。
440 120

热门文章

最新文章