其他
如何快速将你的应用封装成js-sdk?
前言
本文将介绍前端如何封装一款 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
sdk
采用 js
动态加载 iframe
的模式来实现, 并通过 iframe
通信来实现props
传递, 此时可以有两种比较靠谱的通信方案:使用
postmessage
实现跨域跨系统通信使用
url
参数通信
postmessage
对宿主系统要求比较高, 需要宿主手动配置 origin
白名单, 对可插拔式体验不够友好, 所以笔者这里采用了比较常用的 url
通行方式, 这里需要对参数做解析, 最后达到一个比较简单的接入方式, 如下: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
的结构, 具体实现如下: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)
}
})()
h5-dooring
内部去支持解析 parmas
等操作, 这里感兴趣的可以自行研究. 当然 sdk
的实现方式还有很多, 期待大家的探索.