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

相关文章
|
运维 安全 API
统一接入API赋能开发者:自动高效、灵活编排的云产品日志采集方案
随着企业对网络安全和数据安全防护水平要求的逐步提升,企业管理对企业生产运维过程中所产生的日志数据,在留存处理、权限隔离、跨境合规、数据汇总等方面提出了更高阶的需求。为了满足大客户及一些国际化客户安全合规、简单快速地接入日志、使用日志、操作日志,我们提出了一种新的解决方案——“云产品统一接入API”。统一接入API主要针对阿里云云产品日志类型,以API的方式提供企业或组织用户快速上手,编排灵活的日志采集方案。
|
3月前
|
开发框架 .NET API
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
107 0
|
6月前
|
缓存 监控 测试技术
ERP系统对接方案与API接口封装系列(高并发)
企业资源规划(ERP)系统是现代企业管理的核心,它集成了企业内部的各个部门和业务流程。为了实现ERP系统与其他外部系统或应用程序之间的数据交换和协作,需要对接方案。API(应用程序编程接口)是实现系统对接的常用方法之一。
|
机器人 API
(对接API火币/币安/OK/欧易交易所)合约跟单成熟技术及方案/开发稳定版/详细案例/源码功能
  现货合约量化交易所机器人系统是指通过计算机程序实现自动化交易的系统,它可以根据事先设定的交易策略和规则进行自动交易。
|
JSON JavaScript 搜索推荐
商品详情接口设计:使用API调用获取淘宝商品数据的完整方案
在如今的电商时代,获取商品的详细信息是实现商业化应用的基础。本文将详细介绍如何通过API调用来获取淘宝商品数据,并提供一个完整的商品详情接口设计方案,包括代码示例。开发人员可以根据此方案快速实现商品详情功能,提升用户体验。
|
API 数据库 Python
使用API调用获取商品数据的完整方案
在电子商务应用程序中,商品详情接口是不可或缺的一部分。它用于从电商平台或自己的数据库中获取商品数据,并将其提供给应用程序的其他部分使用。本文将详细介绍如何设计一个完整的商品详情接口方案,其中包括使用API调用来获取商品数据的过程。我们将使用Python语言示例代码来阐述该过程。
|
关系型数据库 MySQL PHP
lockdatav-API在开发过程中php和mysql语法的优化方案
lockdatav-API在开发过程中php和mysql语法的优化方案
71 0
|
JSON 前端开发 PHP
PHP中使用CURL获得快递100API接口JSON数据的文件头处理方案
PHP中使用CURL获得快递100API接口JSON数据的文件头处理方案
94 0
|
数据采集 算法 Java
week现货合约跟单系统开发(对接API火币/币安/OK/欧易交易所)详情介绍/开发运营版/案例设计/方案介绍/源码部署
量化交易系统是基于算法和模型的自动化交易系统,可以通过计算机程序快速进行市场分析、预测和交易决策。
|
API iOS开发
合约交易系统开发(项目方案)丨秒合约交易所系统开发(成熟技术)丨合约跟单系统开发(API一键跟单系统开发详细)
  合约交易是指买卖双方对约定未来某个时间按指定价格接收一定数量的某种资产的协议进行交易。