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

如何快速将你的应用封装成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.

相关推荐
热点推荐
港媒曝张曼玉“五官彻底分离”,61岁生图惹争议,俩部位面目全非

港媒曝张曼玉“五官彻底分离”,61岁生图惹争议,俩部位面目全非

冷紫葉
2026-04-20 17:12:17
皇马银河战舰崩塌内幕:喝酒的巨星、嫉妒的劳尔、管就下课的教练

皇马银河战舰崩塌内幕:喝酒的巨星、嫉妒的劳尔、管就下课的教练

老曁科普
2026-04-20 21:28:34
窜访宣布取消后,国民党表态,民众党向大陆摊牌,赖清德亲自回应

窜访宣布取消后,国民党表态,民众党向大陆摊牌,赖清德亲自回应

小兰聊历史
2026-04-22 15:18:30
与领导隐婚8年,年会上秘书说他太太刚生了女儿,可我生的是俩儿子

与领导隐婚8年,年会上秘书说他太太刚生了女儿,可我生的是俩儿子

真实档案
2026-02-16 16:23:35
张凌赫全素颜出镜环保纪录片回归大学“电气”专业 感慨做“张家玮”比做“张凌赫”自由

张凌赫全素颜出镜环保纪录片回归大学“电气”专业 感慨做“张家玮”比做“张凌赫”自由

红星新闻
2026-04-22 19:52:34
美国明知道中国在搞原子弹,为何不阻止?答:想炸,但不敢炸

美国明知道中国在搞原子弹,为何不阻止?答:想炸,但不敢炸

掠影后有感
2026-04-21 10:28:52
美媒:普京在乌克兰制造了一个可能摧毁俄罗斯的“怪物”

美媒:普京在乌克兰制造了一个可能摧毁俄罗斯的“怪物”

未来力量
2026-04-23 04:40:10
钱可以来!西班牙地区:欢迎中国投资建厂,但不欢迎大批中国工人

钱可以来!西班牙地区:欢迎中国投资建厂,但不欢迎大批中国工人

泪满过眼
2026-04-23 01:39:57
萨姆纳赛季报销?广东队外援完成“5选4”,保送杜锋躺进总决赛!

萨姆纳赛季报销?广东队外援完成“5选4”,保送杜锋躺进总决赛!

绯雨儿
2026-04-23 08:35:11
消息称阿里巴巴等巨头洽谈投资DeepSeek 估值超过200亿美元

消息称阿里巴巴等巨头洽谈投资DeepSeek 估值超过200亿美元

财联社
2026-04-22 19:24:36
昔日夫妻变仇人!陈妍希申请强制执行,陈晓的沉默,彻底撕碎体面

昔日夫妻变仇人!陈妍希申请强制执行,陈晓的沉默,彻底撕碎体面

夸大其词的说
2026-04-23 01:29:02
岛内风向变了?台当局喊话大陆:若时机成熟,愿主动与大陆协商

岛内风向变了?台当局喊话大陆:若时机成熟,愿主动与大陆协商

秋枫凋零
2026-04-23 03:02:03
难以相信!她已经61岁了,看起来竟然像三四十岁的样子!

难以相信!她已经61岁了,看起来竟然像三四十岁的样子!

科学发掘
2026-04-23 08:35:50
文班亚马脑震荡会缺席多久?马刺跟队记者爆料:他甚至没有去医院

文班亚马脑震荡会缺席多久?马刺跟队记者爆料:他甚至没有去医院

体坛野秀才
2026-04-22 12:52:03
2-0!申花轻取海牛,球场发生搞笑一幕,特谢拉裤子差点被扯下

2-0!申花轻取海牛,球场发生搞笑一幕,特谢拉裤子差点被扯下

汪星人哟
2026-04-22 22:00:34
官方:澳U17女足因违规使用球员,22-0获胜的比赛被判0-3告负

官方:澳U17女足因违规使用球员,22-0获胜的比赛被判0-3告负

懂球帝
2026-04-23 00:38:23
真来了!苹果突然发布 iOS 26/18 双系统更新

真来了!苹果突然发布 iOS 26/18 双系统更新

XCiOS俱乐部
2026-04-23 07:38:31
印尼豪赌大溃败,再次证明了:中国行,但你真不行

印尼豪赌大溃败,再次证明了:中国行,但你真不行

阅微札记
2026-04-21 11:52:23
7轮0球0助攻 国足希望之星状态断崖式下滑 恐遭申花国足双线弃用

7轮0球0助攻 国足希望之星状态断崖式下滑 恐遭申花国足双线弃用

零度眼看球
2026-04-23 06:48:45
零跑挑战“杭州至北京千里续航不间断”,直播时突发意外!副总裁:小bug

零跑挑战“杭州至北京千里续航不间断”,直播时突发意外!副总裁:小bug

都市快报橙柿互动
2026-04-22 16:58:33
2026-04-23 09:44:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

车没卖爆,利润却大涨,特斯拉发布财报

头条要闻

女子出差被老板性侵后向公司索赔250万 此前年薪120万

头条要闻

女子出差被老板性侵后向公司索赔250万 此前年薪120万

体育要闻

网易传媒再度签约法国队和阿根廷队

娱乐要闻

蜜雪冰城泰国代言人 被扒出辱华黑历史

财经要闻

全球第一个国家宣布:储备6月耗尽

汽车要闻

纯电续航301km+激光雷达 宋Pro DM-i飞驰版9.99万起

态度原创

教育
数码
时尚
房产
手机

教育要闻

相似三角形与抛物线,一个视频学会!

数码要闻

2026年Q1中国监控摄像头市场小幅降温 小米线上销量蝉联第一

卷首语|“这些书有啥用?”“没用,但好看!”

房产要闻

官宣!今年9月起,广州中小学“重点班”将成历史!

手机要闻

概览苹果iPhone/iPad全球供应链,主力组装线迁回美国仍不现实

无障碍浏览 进入关怀版