API 的一码多端方案 —— Uni API

简介: 伴随各大移动应用厂商推出各自的小程序应用解决方案,小程序开发者也面临需要兼容多个平台的棘手问题。如何做到 Write once,run everywhere?Rax、uniapp、Taro、Remax 等跨端框架给出了“一套代码多端运行”的解决方案,但是在实际的业务开发过程中,API 层面却没有一个跨端的标准和解决方案,导致跨端业务分支众多、代码繁琐等问题。
来源:Alibaba F2E公众号
作者:一叹

image.png

伴随各大移动应用厂商推出各自的小程序应用解决方案,小程序开发者也面临需要兼容多个平台的棘手问题。如何做到 Write once,run everywhere?Rax、uniapp、Taro、Remax 等跨端框架给出了“一套代码多端运行”的解决方案,但是在实际的业务开发过程中,API 层面却没有一个跨端的标准和解决方案,导致跨端业务分支众多、代码繁琐等问题。

Uni API 的诞生

在阿里,先后经历了 Hybrid、Native 融合、动态模板、小程序、Web 渐进渲染等一系列发展之后, 各业务的跨端需求越来越频繁,面对多样的业务场景和快速的技术迭代, 业务开发同学的精力大量集中在跨端的多套代码开发或兼容适配上,无法将精力集中投入在业务中,API 更是其中尤为费精力的一环。

还记得前段时间大火的社区团购,多个小程序投放的复杂场景出现,且时间紧任务重,一码多端成为刚需。阿里数字农业团队在经历了盒马集市的业务洗礼后,Uni API 的雏形在业务中孕育而生,之后多方共同参与,诞生出了 Uni API。它解决了小程序之间以及 Web 的 API 差异,为你实现小程序以及 Web 的一码多端提供坚实基础。

Uni API 是什么?

Uni API 是一个 API 层面的一码多端方案,它有以下特性:

  • 支持 Web、微信小程序、头条小程序、阿里小程序、百度小程序、快手小程序
  • 无框架依赖
  • 提供双语文档、丰富样例
  • 覆盖 101 个 API 实现
  • 支持按需加载,按环境剔除无用代码
  • 提供完善的 TypeScript 声明,让你可以摆脱文档,沉浸编程

Uni API 要解决的问题

小程序容器 API 现状:

我们对目前市面上三大主要容器的 API 进行了统计,数据来源为各个容器的官方文档,统计如下:

image.png

其中,微信的 API 最多,我们在三者中取三方都有实现的 API 作为通用 API,结果为101 个,后续跟随各个文档的升级可能还会增大。我们发现,这 101 个 API 中,有超过一半的 API 在不同容器间有差异,并且,有 70% 左右的 API 在 web 上依然可以支持。

(字节小程序和快手小程序由于起步晚,API 较少,对比文档后,大体基于微信规范,可以认为同样适用这个 101 个通用 API)

我们再对这 101 个 API 进行拆解:

image.png

Uni API 将重点实现这 101 个通用 API,并解决以下问题:

  • 不同小程序容器 tt 、wx 等前缀,API 调用方式不统一。
  • 不同小程序容器 API 入参出参规范有差异。
  • 原生 API 缺乏 Ts 声明,不能自动联想,编写体验差
  • 做跨端应用时,需要翻看多个平台的文档,并且在代码中兼容差异
  • 做跨端应用时,编写兼容代码,会导致无用代码过多,无法剔除
  • 做跨端应用时,缺乏 Web 实现,无法在浏览器端正常调试

规范

Uni API 以微信小程序 API 规范为基础,并遵循通用原则,对一些不通用的地方进行修改,得出一套完整的 API 规范。

1、API 分类

我们将 API 划分为4种

  1. 各个小程序容器之间没有差异的 API(即入参出参一致,功能实现一致)
  2. 各个小程序容器之间有差异但可以无感知抹平的 API(即功能实现一致,但入参出参或者命名有差异)
  3. 各个小程序容器之间有差异且无法抹平的 API(即功能实现不一致)
  4. 有的小程序实现有的小程序没有实现的 API(即容器上的特色 API)

Uni API 对各类 API 的处理:

  • 对第一种,API 之间并没有什么差异,所以 Uni API 对这种 API 做了去前缀或者 Promise 化处理。
  • 对第二种,Uni API 根据规范抹平了入参出参的不一致。
  • 对第三种,由于能力有缺失,Uni API 在规范中透出各个容器的能力子集,但保留各个容器不一致的能力。
  • 对第四种,Uni API 通用 API 中暂不支持

2、入参规范

根据 API 分类规则,我们对 API 入参做了统一,并对差异性入参提供_ext 参数进行处理,如:showActionSheet 入参 itemColor 在微信小程序上支持,在阿里小程序上不支持,title 参数在阿里小程序支持,在微信不支持,那么,你可以这样写:

import showActionSheet from '@uni/action-sheet';

showActionSheet({
  itemList: ['A', 'B', 'C'],
  _ext: {
    aliMiniApp: {
      title: '我是额外参数标题_ext.aliMiniApp',
    },
    wechatMiniProgram: {
      itemColor: '#ff1214',
    },
  },
}).then((res) => {
  console.log(`选中项Index:${res.tapIndex}`);
});

如上,itemColor 将只会在微信小程序容器时被接收,同样的 title 参数也只会在阿里小程序容器时被接收。

3、出参规范

我们会统一不同容器 API 的出参,对有差异的出参抹平能力上的子集,同时保留其它不在规范里的出参,留给业务自行使用。

核心能力

1、真正的一码多端

image.png

Uni API 帮你识别环境差异, 帮你做好不同容器的兼容,因此你可以把精力更好的投入到业务实现中。

2、真正的无依赖跨端能力

Uni API 不依赖任何框架及 DSL(可以在任何小程序原生项目或跨端框架项目中无差别使用),Web 端完全原生 Dom 操作,无框架依赖,UI 对齐规范

3、更易用的 API

  • Uni API 对 API 按功能关联性做了聚类,将几个关联性强的 API 放在一起,你可以不需要一个一个引用,
  • Uni API 对异步 API 做了 Promise 改造,更方便业务维护自己的代码
  • 完善的 Typescript 声明,结合 Typescript 的代码自动提升,可以给予你超过原生的编程体验。
  • 对 API 错误做了统一处理,更方便业务处理异常。

4、更全面的 API

Uni API 规划提供 100+ API,一期实现 70+,覆盖80%以上应用场景。

5、更极致的 API

image.png

超大的 API 覆盖,超小的代码体积,Uni API 在实现层面就把体积问题作为重点考虑,并重新设计了工程,因此,当你使用 Uni API 时,最终的代码产物,就像你自己直接调用原生一样,完全不会有多余代码。

配套能力

1、双语文档

Uni API 官网以及 Rax 官网提供详尽的中英文版 API 调用文档,文档粒度细致到每个 API 每个参数的用法及其支持度,绝大部分情况下,用户可以舍弃各平台的文档,仅参考 Uni API 官方文档即可满足开发需求。

image.png

为方便一码多端的需要,文档里针对不通用能力(无法抹平的能力)进行了标记警告。

image.png

2、真机 Demo

Uni API 为支持的各端都提供了完善的 API 使用示例和体验 Demo,可直接扫码在真机上体验所有支持的 API

image.png

小程序码:

image.png

image.png

3、完善的 Typescript 声明

Uni API 为每个 API 提供了详尽的 Typescript 声明,结合编辑器触发代码的自动提示,这将给你带来原生无法提供的编程体验,甚至可以离开文档,直接编程,Typescript 的自动校验,可以让你的 API 代码更加规范,提前避免手误粗心之类的错误。

4、CAN I USE

Uni API 提供了canIUse 支持度检测工具

  • canIUse API,可以在业务代码中调用,检测当前环境是否支持目标 API:
import canIUse from '@uni/caniuse';

canIUse('clipboard');// true
canIUse('clipboard.getClipboard');// true
  • 未来还计划提供站点形式的 canIUse

image.png

如何使用 Uni API ?

1、安装引用

Uni API 提供两种模式引用:

小包引入

npm install --save @uni/storage
import { getStorageSync } from '@uni/storage';

getStorageSync({key: 'key'});

大包引入

npm install --save @uni/apis
import { 
  application,
  env,
  unitTool,
  canvas,
  accelerometer,
  clipboard,
  systemInfo,
  file,
  actionSheet,
  alert,
  toast,
  loading,
  element,
  intersectionObserver,
  confirm,
  location,
  image,
  navigate,
  request,
  storage } from '@uni/apis';

confirm({content: '显示模态框'});
storage.getStorageSync({key: 'key'});

分端构建

Uni API 内部基于原子化 API 实现,因此可以支持分环境,分 API 引入,达到极致体积。

我们提供了 babel 插件帮助使用方剔除 Uni API 的无用代码,你可以这样用:

npm i @uni/babel-plugin-universal-api-import

在 babel 配置中加入插件:

[
  'babel-plugin-universal-api-import',
  {
    target: 'miniapp'
  }
]

我们还专门为 Rax 用户提供了插件,你可以这样使用:

npm i @uni/build-plugin-rax-api-import

在 build.json 文件中加入插件:

"plugins" : [
  [
    "build-plugin-rax-api-import"
]
]

设计方案

Uni API 对 API 进行原子维度开发,从 API ,容器两个维度进行模块编写,截止目前 65 个 API 叠加 6 个容器维度,共有 390 个 API 实现,同时保证每个模块的功能独立,调用方式一致,因此可以实现业务中原子化引用,达到极致体积,并且可以被其它库依赖。

未来 101 个 API 叠加 6 个容器维度,将达到惊人的 606 个 模块实现、50+ package。

image.png

结语

Uni API 旨在解决各大小程序厂商之间、以及小程序与 Web 之间 API 在实现和规范上无法对齐的问题,解决 Api 层面的一码多端。未来会支持更多的容器和更广泛的API,提供轻量便捷的解决方案,在满足业务需求的同时,追求极致的代码体积和最优的体验。

希望有了 Uni API,开发者可以离真正完美的一码多端更近一步。

相关链接

Uni API 官网链接:https://universal-api.js.org/

Rax 官网链接:https://rax.js.org/

Github 地址:https://github.com/raxjs/universal-api

答疑地址:https://github.com/raxjs/universal-api/issues

f441bb4cf20944bda66ddae869a2c488.png

相关文章
|
7月前
|
缓存 监控 供应链
亚马逊 MWS API 实战:商品详情精准获取与跨境电商数据整合方案
本文详细解析亚马逊MWS API接口的技术实现,重点解决跨境商品数据获取中的核心问题。文章首先介绍MWS接口体系的特点,包括多站点数据获取、AWS签名认证等关键环节,并对比普通电商接口的差异。随后深入拆解API调用全流程,提供签名工具类、多站点客户端等可复用代码。针对跨境业务场景,文章还给出数据整合工具实现方案,支持缓存、批量处理等功能。最后通过实战示例展示多站点商品对比和批量选品分析的应用,并附常见问题解决方案。该技术方案可直接应用于跨境选品、价格监控等业务场景,帮助开发者高效获取亚马逊商品数据。
监控 安全 API
668 0
|
7月前
|
人工智能 安全 API
API安全厂商F5首发后量子加密方案,为企业后量子时代加固防线
API安全厂商F5首发后量子加密方案,为企业后量子时代加固防线
184 1
|
7月前
|
供应链 数据可视化 BI
多平台数据整合工具新趋势:支持API实时联动的看板方案
在电商运营中,数据分散在多个平台导致效率低下、决策滞后。数据整合看板工具通过聚合多源数据,实现可视化、实时同步与低门槛操作,帮助团队高效利用数据,提升运营效率与决策质量。
|
8月前
|
JSON 缓存 API
孔夫子旧书网 API 实战:古籍与二手书数据获取及接口调用方案
孔夫子旧书网作为国内知名古籍与二手书交易平台,其数据对图书收藏、学术研究及电商系统具有重要价值。本文详解其API调用方法,涵盖认证机制、搜索参数、数据解析及反爬策略,并提供可直接使用的Python代码,助力开发者合规获取数据。
|
8月前
|
XML 缓存 API
eBay 商品详情 API 深度解析:从基础信息到变体数据获取全方案
本文详解如何通过 eBay 的 GetItem 和 GetMultipleItems 接口获取商品详情数据,涵盖基础属性、价格、变体、卖家信息等,并提供可复用的 Python 代码。内容包括 API 核心参数、响应结构、代码实现、实战注意事项及扩展方向,助力跨境电商开发。
|
8月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
624 0
|
9月前
|
缓存 算法 API
从 0 实现 API 接口签名验证系统:基于 HMAC-SHA256 的防篡改方案(附 Python 全代码)
本文介绍基于 的 API 接口签名验证系统,实现防篡改与防重放攻击,包含完整设计原理、签名生成规则及可运行的 Python 客户端与服务端代码,并提供安全性优化与部署建议。
|
9月前
|
负载均衡 监控 测试技术
【干货满满】高性能API调用方案:如何突破频率限制+异步请求优化
在电商 API 开发中,频率限制常成性能瓶颈。本文提出一套高性能方案,结合异步请求、批量处理、智能限流等技术,显著提升调用效率,突破平台限制,实现稳定高效的数据交互。
|
9月前
|
人工智能 供应链 监控
苏宁易购电商 API 接口,家电库存管理智能方案
苏宁易购推出基于API的智能家电库存管理方案,融合实时数据同步、AI预测与自动化执行,助力企业优化库存周转、降低成本,提升运营效率与客户满意度。适用于ERP/WMS系统集成,实现库存管理智能化升级。
180 0
下一篇
开通oss服务