# SDK 开发总结

sdk 通常是封装业务中常用的能力,方便在业务开发中快速使用,比如说登录、权限管理、请求等。

sdk 的开发,包含以下几个方面:

  • 需求分析
  • 功能开发
  • 单元测试
  • 构建发布
  • 文档编写
  • 技术支持

# 需求分析

明确这个 sdk 要解决的问题是什么。边界在哪里。sdk 应该是职责明确的,而不是将功能都堆积在里面。

# 功能开发

在明确需求后,进行功能开发,需要注意的是,在 api 设计中,遵循开闭原则,保持良好的扩展性,使用户能够根据 sdk 提供的能力再扩展,最终满足不同业务的定制化需求。

这个扩展性,可以通过插件机制来支撑。sdk 只能提供常规的能力,不应该做得大而全。对于一些特殊场景的特殊需求,应该由 sdk 提供基础能力,业务方利用基础能力再扩展、定制。

功能开发过程中,还要明确兼容性,对于有兼容性要求而存在兼容性问题的,需要做特殊处理。常见的有 IE9 下的各种 api 不兼容问题,比如 XMLHttpRequest 不支持 CORS,需要使用 XDomainRequest 来做兼容。

# 单元测试

功能开发完成后,编写单元测试,对每个功能进行测试,单元测试应该覆盖大部分代码分支,使用场景,同时注意边界问题。

# 构建发布

构建之前进行完整的单元测试,单元测试不通过不允许构建。

构建一般选用 gulp + rollup,配合 babeltypescript

打包器选用 rollup 而不是 webpackwebpack 的优势在于打包不同类型的资源,包括 js、css、html 等,更适用于应用的打包。rollup 是一个 javascript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。天然支持 es6tree-shaking,更适用于 library 打包。而且 webpack 会生成运行时代码,增加包体积。

一般 sdk 的构建产物有三个:cjsesmumd。对应不同的模块规范,

package.json 中将 main 指向 cjs 所在目录;将 module 指向 esm 所在目录,配合 webpack 可以进行 tree shaking 优化;umd 文件用于供业务方直接以 url 的方式引入。

# 文档编写

良好的文档,对于 sdk 的开发者和使用者都能带来极高的收益。使用者可以用更小的学习成本使用,开发者可以减小不必要的客服时间。

文档一般包含以下几个部分:

  • 概述,简单介绍 sdk,一般包括这个 sdk 提供了什么能力?为什么要做这个 sdk。
  • 快速上手,sdk 的极简使用方式。
  • API 文档,详细全面的 sdk api 说明。
  • 常见问题,记录使用中常见的问题,避免其他使用者重复踩坑。
  • CHANGELOG,更新日志,便于使用者查阅遇到的问题新版本是否已经解决,或者是不是新版本的修改导致了现有代码上的 bug。

# 技术支持

sdk 对外发布后,后续维护相当大一部分的精力主要花在对外答疑上。基本上使用者遇到的问题都是以下几类:

  • 不知道是否有提供某个功能
  • 使用方式错误
  • 业务代码有问题,导致执行结果与预期不符,实际与 sdk 无关
  • sdk 本身存在 bug

其中第一、第二、第四点,作为 sdk 的开发者,一般情况下能够比较容易地判断出来。对于第一、第二点,主要的应对措施是完善、细化文档。随着文档完善及使用熟练度上升,比较会逐渐下降。对于第四点,需要注意的是修改后发布的版本要遵循 semver 语义化版本规范。

对于第三点,一般是提供一个简单的工程给业务方,要求业务方在上面将复杂的业务代码剥离后复现,如果复现不了,大概率问题原因不在 sdk,这时候可以要求业务方检查自己的代码。但有时候业务方检查后还是发现不了问题,又把问题甩了回来,这个时候只能拿他的工程项目看内部代码。

大部分问题通过调试可以解决,比较极端的是业务方对 sdk 做了两次扩展,扩展 A 以比较常规的代码实现,扩展 B放在其他隐蔽的地方实现,比如以一个 cdn 上 js 文件的方式引入做扩展,重复操作导致出现 bug。

# 参考

sdk 一个简单可用的 sdk 模板 (opens new window)

Last Updated: 3/29/2020, 5:01:02 PM