首页 > 编程语言 >实践分享:打造极具高扩展性的JavaScript SDK

实践分享:打造极具高扩展性的JavaScript SDK

时间:2023-05-06 10:32:07浏览次数:45  
标签:微信 JavaScript FeatureProbe 扩展性 React io SDK

SDK(Software Developer Kit) 是使用 FeatureProbe 服务必不可少的工具之一。SDK能将用户的应用程序连接到 FeatureProbe 服务,根据用户的配置获取开关的结果,还能将开关的访问情况上报给 FeatureProbe,进而实现 A/B 实验的能力。

FeatureProbe 目前对外提供十余种主流开发语言的 SDK,包括用于服务端开发的 Java、Golang、Python、Rust等,以及用于客户端开发的 JavaScript、Android、iOS等。在之前的文章【用 Rust 开发跨平台 SDK 探索和实践】中我们曾介绍过我们选择使用Rust开发了跨平台语言的 Android SDK 和 iOS SDK,这样做的主要原因是:

(1)能减少人力成本和开发时间。

(2)共享一套代码,便于后期维护。

在开发 JavaScript SDK 的过程中,我们也同样采用类似的思路。JavaScript是目前构建Web应用的主要语言,在此基础上产生了很多现代化的 JavaScript 前端框架,比如:React、Vue、Angular等。近几年在国内爆火的微信小程序框架也主要使用 JavaScript 语言进行开发的。如何制作一款能支持所有前端框架使用的通用 SDK,同时在此 SDK 的基础上,能够快速地根据框架的语法特性进行上层封装,是 JavaScript SDK 的核心要求之一。

实现思路

实现一个功能完善的 JavaScript SDK,能够在普通的 Web 前端工程中使用。在此基础上,根据框架语法特性,进一步封装其它语言的 SDK,不同语言的SDK分别管理和发版。

实践分享:打造极具高扩展性的JavaScript SDK_开源

React SDK的实现

React SDK 在实现时将 JavaScript SDK 作为依赖项安装到工程内,主要使用了 React 的 Context API 和 Context hooks 进行上层封装,方便开发者在React工程中的使用。

1、使用 React 的 createContext API 创建一个上下文对象,保存开关 FeatureProbe 实例和开关结果的集合。2、使用 React 的 Context Hooks 封装若干个自定义 Hook,用于在任何组件内快速使用 FeatureProbe 实例和访问开关结果。

这里我们展示了一种以高阶组件的方式使用 React SDK。

1、将 SDK 初始化

使用 FPProvider 对根组件 进行初始化,初始化时传入必填参数 remoteUrl、clientSdkKey 和 user 对象等。

实践分享:打造极具高扩展性的JavaScript SDK_初始化_02

2、SDK 的使用

使用 withFPConsumer 高阶组件的方式包装业务组件 ,组件内部可通过  props 属性访问 FeatureProbe 实例(client)和开关集合(toggles)。

(1)client 实例上可访问 JavaScript SDK 所有对外暴露的 API,比如 booleanValue、jsonDetail、track 等。

(2)toggles 开关集合是同一个用户在一个 clientSdkKey 环境中调用所有开关的返回结果集合,提供了另一种获取开关结果和详情的方式。

实践分享:打造极具高扩展性的JavaScript SDK_开源_03

微信小程序 SDK的实现

相比较 React SDK,在 JavaScript SDK 上的集成微信小程序 SDK 更复杂一些,需要针对微信小程序的语法特性做一些兼容工作。主要的原因是微信小程序和普通的 Web 应用的运行环境不同,前者是在微信客户端运行,后者在浏览器环境中运行的。例如在浏览器环境中支持的 window 和 document 对象,在微信小程序中是不支持的。

下面的表格列举出了两种 SDK 的主要不同点:

JavaScript SDK

微信小程序SDK

发送HTTP请求API

fetch

wx.request

本地缓存API

localStorage.setItem、localStorage.getItem

wx.setStorageSync、wx.getStorageSync

长连接工具库

socket.io-client

wepapp.socket.io

是否支持自动上报事件

支持

不支持

UA

JS/1.0.1

MINIPROGRAM/1.0.1

在代码层面,JavaScript SDK 将上述差异进行抽离,并保存在 platform 对象中,platform对象目前包含的字段有:

UA: 标识SDK名称和版本;

localStorage: 本地存储对象,调用 localStorage.setItem() 方法保存数据,调用localStorage.getItem() 方法获取数据;

httpRequest: 发送请求对象,调用 httpRequest.get() 方法发送GET请求,调用httpRequest.post() 方法发送 POST 请求;

socket: 用于初始化socket.io-client客户端,监听开关的变更。

JavaScript SDK 导出 initializePlatform 方法,其它语言的 SDK 在初始化时可传入 platform 对象来保存配置差异部分,不传入时将使用默认值。

export function initializePlatform(options) {
  if (options.platform) {
    setPlatform(options.platform);
  }
}

以下为微信小程序 SDK 的 platform 对象构成。在发送 HTTP 请求上我们目前选择了一款开源的工具库 wefetch,方便后续支持其它的小程序 SDK,WebSocket 客户端选择了基于 socket.io 实现的 weapp.socket.io。

import wefetch from "wefetch";          // 小程序请求扩展
import pkg from '../package.json';
const PKG_VERSION = pkg.version;        // 微信小程序 UA 信息
const io = require("weapp.socket.io");  // 基于 socket.io 实现的构建微信小程序的 WebSocket 客户端

// 基于微信小程序 API 封装的 localStorage 对象
class StorageProvider {
  public async getItem(key) {
    try {
      return wx.getStorageSync(key);
    } catch (e) {
      console.log(e);
    }
  }

  public async setItem(key, data) {
    try {
      wx.setStorageSync(key, data);
    } catch (e) {
      console.log(e);
    }
  }
}

// 基于微信小程序 API 封装的 httpRequest对象
const httpRequest = {
  get: function(url, headers, data, successCb, errorCb) {
    wefetch.get(url, {
      header: headers,
      data,
    }).then(json => {
      successCb(json.data);
    }).catch(e => {
      errorCb(e);
    });
  },
  post: function(url, headers, data, successCb, errorCb) {
    wefetch.post(url, {
      header: headers,
      data,
    }).then(() => {
      successCb();
    }).catch(e => {
      errorCb(e);
    });
  }
};

const platform = {
  localStorage: new StorageProvider(),
  UA: "MINIPROGRAM/" + PKG_VERSION,
  httpRequest: httpRequest,
  socket: io,
};

// 初始化
initializePlatform({ platform });

总结

上面我们介绍了在 JavaScript SDK 的基础上去开发其它语言的 SDK。核心思路是首先实现一个「大而全」的通用SDK,然后将各个语言差异的部分进行抽离,其它语言SDK在初始化时进行差异部分的替换。其它语言的SDK再根据对应的语法特性进行上层封装,底层复用 JavaScript SDK 提供的通用能力。

目前除了 JavaScript SDK 、React SDK 和 微信小程序 SDK之外,我们正在准备 Vue SDK。如果 FeatureProbe 目前提供的SDK不满足您的需求,可以通过新建issue的方式告知我们。我们也欢迎社区伙伴能为我们贡献更多语言的 SDK,贡献SDK时可参考文档 SDK 贡献指南:docs.featureprobe.io/zh-CN/refer…

关于FeatureProbe

FeatureProbe 是国内首家功能开关管理开源平台,它包含了灰度放量、AB实验、实时配置变更等针对『功能粒度』的一系列管理操作,完全开源,可以放心直接使用。

当前 FeatureProbe 作为一个功能开关管理平台已经使用 Apache 2.0 License 协议完全开源,你可以在 GitHub 和 Gitee 上访问源码,你也可以在上面给提 issue 和 feature 等,如果你觉得我们的项目有意思,欢迎大家在 GitHub 或 Gitee 给我们点个

标签:微信,JavaScript,FeatureProbe,扩展性,React,io,SDK
From: https://blog.51cto.com/u_15989485/6249121

相关文章

  • 网页抓取--1(原网页+Javascript返回数据)
     有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。一、抓取原网页。这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:第一步:打开这个网页......
  • SOPHONSDK3.0.0 使用
    1.开发环境Linux环境:Ubuntu22.04Windows环境:VMware+Ubuntu22.04VMware安装教程:https://www.cnblogs.com/fuzongle/p/12760193.html相关镜像下载:https://mirrors.bfsu.edu.cn/#2.材料准备:(X86环境)SDK:SOPHONSDK3.0.0(https://developer.sophgo.com/site/index/material/......
  • .net sdk安装信息
    已成功安装。下列项安装:  •.NETSDK7.0.203  •.NETRuntime7.0.5  •ASP.NETCoreRuntime7.0.5  •.NETWindowsDesktopRuntime7.0.5此产品会收集用法数据  •详细信息和选择退出选项:https://aka.ms/dotnet-cli-telemetry资源  •.N......
  • JavaScript学习汇总
    ExtJs学习之Button(08)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通04官方文档查找办法_例如_Ext.Window(48)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通03自定义函数_调用顺序(47)uniGUI学习之脱离Delphi直接写ExtJS从入门到精通02Ext.Panel创建后_调用的几种方法(46)......
  • JavaScript 图片的上传前预览
    实例一: 实现要点● 对于 Chrome、Firefox、IE10 使用 FileReader 来实现。● 对于 IE6~9 使用滤镜 filter:progid:DXImageTransform.Microsoft.AlphaImageLoader 来实现。<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=......
  • 【javascript】typeof 和 instance of的差异
    typeof与instanceof都是判断数据类型的方法,区别如下:1.typeof会返回一个运算数的基本类型,instanceof返回的是布尔值2.instanceof可以准确判断引用数据类型,但是不能正确判断原始数据类型3.typeof虽然可以判断原始数据类型(null除外),但是无法判断引用数据类型(function除外)所以如......
  • 想了解JavaScript基础?这篇文章足够了!
    本人无意看到的一篇文章,觉得写的很全面,简单概括了Javascript的一些知识,现分享如下:原文地址:http://www.ppmy.cn/news/7295.html更多详细内容,请微信搜索“前端爱好者“,戳我查看。一、JavaScript的介绍JavaScript是一种运行在客户端的脚本语言,作为web标准的行为层,最初出现......
  • javascript-1
    js注释多行注释/*这里是注释*/单行注释//这里是注释js中严格区分大小写js中每一条语句以分号结尾,如果不写分号,浏览器会自动添加。......
  • [Javascript] Proxy - Snippets
    Blog:https://dev.to/marclipovsky/discovering-the-power-of-javascript-proxy-after-all-this-time-4627 Lazyloading:constlazyLoadHandler={get:function(target,property){if(!target[property]){target[property]=expensiveComputation(......
  • KubeVela 稳定性及可扩展性评估
    作者:殷达背景随着v1.8的发布,基于OAM的应用程序交付项目KubeVela已经持续发展了3年多。目前已被各种组织采用并部署在生产环境中。无论是与托管定义一起使用还是在多个集群上进行管理,在单个KubeVela控制平面上运行数千个应用程序的情况并不少见。用户经常问的一个关键......