网易首页 > 网易号 > 正文 申请入驻

如何快速将你的应用封装成JS-SDK?

0
分享至

作者: 徐小夕 来源:趣谈前端

前言

本文将介绍前端如何封装一款 js-sdk 以及如何快速将你的应用变成 js-sdk , 我们将总结一些封装 js-sdk 的原则和案例, 来帮大家更快的上手 sdk 开发。其中笔者还会以H5-Dooring 为例子, 介绍如何将 H5 页面编辑器封装成一个 js-sdk 供他人使用。

正文

在开始文章之前, 笔者先来介绍一下什么是 sdk .

sdk 即软件开发工具包, 一般是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。

对于 js-sdk 而言, 我们能举出很多例子, 如下:

  • ●UI组件库
  • ●性能监控工具, 如阿里 arms
  • ●统计分析工具
  • ●阿里云智能验证sdk
  • ●极验验证sdk

sdk 的目的是提高我们开发项目的效能, 安全性和便捷性等问题, 所以我们在设计 sdk 时一定要遵循一些原则, 如下:

  • ●最小可用性原则: 也就是没有必要的功能/代码尽量不额外添加, 使代码达到最简
  • ●最少依赖原则: 也就是没有必要的依赖坚决不添加, 以达到最低限度的外部依赖
  • ●易扩展: 插件化,最大限度支持扩展和自定义
  • ●稳定性: 绝不能导致宿主应用崩溃,向后兼容, 可测试

在熟悉以上的背景和原则之后, 我们来看看如何实现一个 sdk 的案例。

将 H5-Dooring 封装成一个 js-sdk

笔者在这拿 开源页面制作工具 H5-Dooring 来作为案例(当然将其封装成 sdk 也是我们迭代中的一部分, 甚至后期会做成npm包), 介绍如何封装js-sdk, 我们先看一张抽象图:

我们的 sdk 就好像一个完整系统的一个零件, 可以和系统中的其他模块通信, 互相交换数据。 总体而言 sdk 是为宿主系统服务的, 在 dooring-sdk 中 我们一方面要提供对外的接口支持, 另一方面需要支持宿主能控制 H5 编辑器的界面, 所以综合分析下来我们有如下的初步规划图:

首先我们 sdk 采用 js 动态加载 iframe 的模式来实现, 并通过 iframe 通信来实现props 传递, 此时可以有两种比较靠谱的通信方案:

  • ●使用 postmessage 实现跨域跨系统通信
  • ●使用 url 参数通信

由于 postmessage 对宿主系统要求比较高, 需要宿主手动配置 origin 白名单, 对可插拔式体验不够友好, 所以笔者这里采用了比较常用的 url 通行方式, 这里需要对参数做解析, 最后达到一个比较简单的接入方式, 如下:

var dooringOpts = {
container: '',// 挂载到哪个dom节点上
iframeStyle: { // iframe自定义样式
width: '',
height: '',
border: ''
},
controls: {
gallery: false,// 是否启动图片库
template: false,// 是否启用模版库
saveTemplate: true,// 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
save: true, // 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
downCode: true, // 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
isPhoneTest: false,
helpPage: true,// false/true表示隐藏/显示帮助页面
uploadApi: '',// 自定义上传api
formApi: '',// 自定义表单提交api
screenshotsApi: '' // 自定义截图提交api
}

用户只需要在全局定义好配置的 props 和 callback , 即可自由定制 H5-Dooring. 接下来我们只需要再引入 dooring-sdk即可(注意先定义全局变量, 再引入sdk):


以上只是确定了 js-sdk 的方案和最终调用效果, 接下来我们来看看如何去实现它. 也就是 dooring-sdk 内部到底做了哪些工作. 我们先看一张实现机制图:

由上图分析可知我们需要提前把用户定义的全局配置解析成 url 参数, 然后将动态创建的 iframe 的 src 属性设置为 dooring url + parmas的结构, 具体实现如下:

(function(){
let iframe = document.createElement('iframe');
let tid = Date.now();
let sdk_domain_path = 'http://xxxx/xxxx';
iframe.src = sdk_domain_path + '/h5_plus/editor?tid=' + tid + '&' + getDooringApiStr(dooringOpts) + '&isOpen=1';
iframe.style.border = 'none';
iframe.style.width = '100vw';
iframe.style.height = '100vh';
if(dooringOpts && dooringOpts.iframeStyle) {
iframe.style.border = dooringOpts.iframeStyle.border || 'none';
iframe.style.width = dooringOpts.iframeStyle.width || '100vw';
iframe.style.height = dooringOpts.iframeStyle.height || '100vh';
}
document.querySelector(dooringOpts.container || 'body').appendChild(iframe);
function getDooringApiStr(opt) {
let controls = Object.assign({
gallery: false,
template: false,
saveTemplate: true, // 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
save: true, // 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
downCode: true, // 参数可以是true/false,表示是否启动下载代码, 也可以是函数, 用来自定义下载代码逻辑
isPhoneTest: false,
helpPage: true, // false/true表示隐藏/显示帮助页面
uploadApi: '',
formApi: '',
screenshotsApi: ''
}, opt.controls || {})
let params = '';
for(let key in controls) {
params += key + '=' + encodeURI(controls[key]) + '&'
}
return params.slice(0, params.length -1)
}
})()

以上只是个简单的实现实现思路,是不是有点传统的写jquery插件的感觉? 同时我们还需要配合 h5-dooring 内部去支持解析 parmas 等操作, 这里感兴趣的可以自行研究. 当然 sdk 的实现方式还有很多, 期待大家的探索.

最后

以上方案笔者已经集成到 H5-Dooring 中,大家可以以 sdk 的方式体验一下。github 地址:所见即所得的H5页面编辑器H5-Dooring

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
抗日战争的转折点是什么?为何这场大战后,日本高层面如死灰

抗日战争的转折点是什么?为何这场大战后,日本高层面如死灰

诺言卿史录
2026-03-21 09:32:10
随着国足2-0库拉索,产生3大不可思议和1个不争事实,全场MVP诞生

随着国足2-0库拉索,产生3大不可思议和1个不争事实,全场MVP诞生

郝小小看体育
2026-03-27 16:58:47
今年英超球队场均积分进步榜:狼队居首,曼联第三,热刺垫底

今年英超球队场均积分进步榜:狼队居首,曼联第三,热刺垫底

懂球帝
2026-03-27 10:57:30
昨天才免,今天就被查!来得最快”的一场官宣

昨天才免,今天就被查!来得最快”的一场官宣

靓仔情感
2026-03-27 13:01:31
黄金跌价,足金降价,2026年3月27日,国内黄金、足金纯金最新价

黄金跌价,足金降价,2026年3月27日,国内黄金、足金纯金最新价

别人都叫我阿腈
2026-03-27 16:03:57
78岁向华强饮食克制,白菜萝卜清汤,豆腐羹,几乎不加调料

78岁向华强饮食克制,白菜萝卜清汤,豆腐羹,几乎不加调料

萧狡科普解说
2026-03-27 07:06:07
曼城115项指控迎大结局?专家预测扣分在40到60分之间

曼城115项指控迎大结局?专家预测扣分在40到60分之间

乐道足球
2026-03-26 19:55:49
重磅!新加坡国立大学原副校长,全职加盟清华大学

重磅!新加坡国立大学原副校长,全职加盟清华大学

TOP大学来了
2026-03-26 17:43:56
人很朴素!93年女未婚先孕,孩子出生58天,征有房有车男士引热议

人很朴素!93年女未婚先孕,孩子出生58天,征有房有车男士引热议

火山詩话
2026-03-27 09:46:14
门德斯疯狂操作:用曼联 5900 万小将换巴萨核心,巴萨看懵了

门德斯疯狂操作:用曼联 5900 万小将换巴萨核心,巴萨看懵了

奶盖熊本熊
2026-03-27 05:53:08
张雪峰的财产几个亿,竟然没买车,天天吃外卖,生活简朴到极致

张雪峰的财产几个亿,竟然没买车,天天吃外卖,生活简朴到极致

魔都姐姐杂谈
2026-03-25 15:59:12
梦幻西游旭旭宝宝挖150张秘制宝图颗粒无收,勇武第一2584攻泪妖

梦幻西游旭旭宝宝挖150张秘制宝图颗粒无收,勇武第一2584攻泪妖

叶子猪游戏网
2026-03-27 11:16:24
娱记揭郭嘉文李泽楷分手真相!非催婚惹怒男方,网友:好人家谁娶她

娱记揭郭嘉文李泽楷分手真相!非催婚惹怒男方,网友:好人家谁娶她

东方不败然多多
2026-03-27 02:01:11
唏嘘!张雪峰去世真相+遗嘱公布!巨额财产受益人竟然是她?

唏嘘!张雪峰去世真相+遗嘱公布!巨额财产受益人竟然是她?

华人星光
2026-03-27 11:12:47
中方战机遭外机雷达照射,歼10C飞行员以牙还牙,敢乱来就击落

中方战机遭外机雷达照射,歼10C飞行员以牙还牙,敢乱来就击落

军武咖
2026-03-27 13:43:47
上半年好运如脱缰野马的3个生肖,高人暗中支持,升官发财不难!

上半年好运如脱缰野马的3个生肖,高人暗中支持,升官发财不难!

毅谈生肖
2026-03-27 11:43:19
内塔尼亚胡夫人的诉苦,加沙儿童怎么看?

内塔尼亚胡夫人的诉苦,加沙儿童怎么看?

新民周刊
2026-03-27 09:07:00
“根本不敢上路”!深圳男子买全新百万豪车,修了15次还是坏的!很多车主受害

“根本不敢上路”!深圳男子买全新百万豪车,修了15次还是坏的!很多车主受害

南方都市报
2026-03-26 09:26:45
72年李讷生娃,江青面无表情:我们家的孩子不叫姥姥,叫我奶奶

72年李讷生娃,江青面无表情:我们家的孩子不叫姥姥,叫我奶奶

海佑讲史
2026-03-27 11:45:12
领导一个人在办公室经常都干嘛?网友:怪不得人人都想当领导呢!

领导一个人在办公室经常都干嘛?网友:怪不得人人都想当领导呢!

夜深爱杂谈
2026-03-15 19:19:57
2026-03-27 18:04:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

杨植麟张鹏夏立雪罗福莉,聊龙虾、聊涨价

头条要闻

民警猥亵少女获刑2年9个月 法院:主动承认 从轻处罚

头条要闻

民警猥亵少女获刑2年9个月 法院:主动承认 从轻处罚

体育要闻

邵佳一:足球就像一场马拉松

娱乐要闻

张雪峰灵堂内景曝光,四周摆满了鲜花

财经要闻

我在小吃培训机构学习“科技与狠活”

汽车要闻

与众08,金标大众不能输的一战

态度原创

家居
亲子
手机
旅游
房产

家居要闻

曲线华尔兹 现代简约

亲子要闻

到震泽,给童年一个“蚕”绕的梦

手机要闻

四摄都能打 OPPO Find X9 Ultra打造纯正光学品质

旅游要闻

游客给妻子拍照遭三次驱赶 万岁山景区致歉

房产要闻

刚刚,海南楼市,官方数据发布!

无障碍浏览 进入关怀版