还用 JSON 的方式是不是太没新意了
目标:WindVane / PHA / Weex / miniapp
js API 应作为容器和原生对业务的直接交付对象,所以以对象的结果为标准,去统一和生成各个端侧的 API。
而 js 却少类型约束,很难作为标准建立,不如使用严格一些 ts,增加更严格类型检查配置,生成 d.ts / native interface。
同时用版本约束 native interface 和 dts,也能避免不同客户端的 api 不兼容问题。
客户端去主动从 ts 编译出 native interface,并及时对齐。
uni api 提供 cli,去让客户端配置同步(同步编译产物)。
// 把类型补全,编译失败时也尽量提示一下
export const getVersion = async (value:string) => {
// codegen 分析下面的代码 ast,直接生成不同容器的原生代码
native.windvane.call('Core', 'getVersion', {key: value}, () => {})
}
// 如果你写了两个,会自动判断是哪个容器,并只触发对应的回调
native.weex.call('Core', 'getVersion', {key: value}, () => {})
native.pha.call('Core', 'getVersion', {key: value}, () => {})
// 生成的代码
- (void)getVersion:(NSDictionary *)params context:(id<WindmillContext>)context
{
// 自动生成的类型校验,与返回值模板,即返回不同的错误信息 (类型校验根据 ts ast 分析得到)
if (![params isKindOfClass:[NSDictionary class]]) {
[context onFailure:@"2333"];
return;
}
// TODO 逻辑代码
}