你不知道的前端SDK开发技巧

Webpack 实践: 前端 SDK 开发(使用 webpack 打包 library) Webpack 实践: 前端 SDK 开发(使用 webpack 打包 library) 文章目录Webpack 实践: 前端 SDK 开发(使用 webpack 打包 library)前言正文1. 第一版:源代码直接导出1.1 目录结构 & 源代码1.2 package.json 配置1.3 创建本地软连接1.4 引入结果测试2. 第二版:使用 webpack 打包2.1 安装依赖 & 目录结构2.2 源代码扩展2.3 webpack.config.js 配置2.4 打包成果2.5 usa 阅读详情

作者:陈达孚

香港中文大学研究生,《移动Web前端高效开发实战》作者之一,《前端开发者指南2017》译者之一,在中国前端开发者大会,中生代技术大会等技术会议发表过主题演讲, 专注于新技术的调研和使用.

本文为原创文章,转载请注明作者及出处

最近在做公司内部的一个的一个SDK的重构,这里总结一些经验分享给大家。

类型检查和智能提示

作为一个SDK,我们的目标是让使用者能够减少查看文档的时间,所以我们需要提供一些类型的检查和智能提示,一般我们的做法是提供JsDoc,大部分编辑器可以提供快捷生成JsDoc的方式,我们比较常用的vscode可以使用Document This。

另一种做法是使用Flow或者TypeScript,选择TypeScript的主要原因是自动生成的JsDoc比较原始,我们仍然需要在上面进行编辑,所以JsDoc维护和代码开发是脱离的,往往会出现代码更新了,JsDoc忘记更新的情况。

除此之外开发过程中我们无法享受到类型检查等对SDK开发比较重要的特性,TypeScript可以让我们减少犯错,减少调试的时间,另一方面这次开发的SDK在提供出去的时候就会进行一次相对简单的压缩,保证引入后的体积,所以会希望压缩掉JsDoc,而TypeScript可以通过在tsconfig.json中将declaration设置为true单独的d.ts文件。

一个带提示的SDK:

最后,对于开发同学来说,就算不使用TypeScript,也强烈建议使用vscode提供//@ts-check 注解,它会通过一些类型推导来检查你的代码的正确性,可以减少很多开发过程中的bug。

还有一个小技巧,如果你使用的库没有提供智能提示,你可以通过NPM/yarn的-D安装@types/{pkgname},这样你开发过程中就能够享受到vscode提供的智能提示,而-D安装到devDependencies中,也不会增加你在构建时的代码体积。

接口

既然提到了TypeScript,就提一下TypeScript的语法,基础类型没有必要赘述,而一些曾经的高级语法现在ES6也都能支持,这里提几点常用但是JavaScript开发者不太习惯使用的语法。

很多人在开始使用TypeScript的时候,会很迷恋使用any或者默认的any,推荐在开发中打开tsconfig中的strict和noImplicitAny来保证尽量少的any使用,要知道,滥用any就等于你的类型检查并没有实质效果。

对一些暂时不能确定内容的对象的类型,可以使用{[key: string]: any},而不要直接使用any,后期可以慢慢扩展这个接口直到完全消除any,同时TypeScript的类型支持继承,在开发过程中,可以拆解接口,利用组合继承的方式减少重复定义。

但是接口也会带来一个小痛点,目前vscode的智能提醒不能很好的对应到接口,当你输入到对应变量的时候,虽然会高亮,但是高亮的也只是一个定义了名字的接口。没有办法直接看到接口里定义了什么。但是当你输入了接口里面定义的key的部分时,vscode会给你完整key的提示。虽然这对开发过程中有一点不够友好,但是vscode开发团队表示这是他们故意设计的,所以在API参数上可以选择将一些必要(重要)参数用基础类型直接使用,而将一些配置放入一个定义为接口的对象中。

枚举

你有在代码中使用过:

const Platform = {
    ios: 0,
      android: 1
}

那你在TypeScript中就应该使用枚举:

enum Platform {
  ios,
  android
}

这样在函数中你就可以为某个参数设置类型为number,然后传入Platform.ios这样,枚举可以增加代码的维护性,它可以利用智能提示保证你输入的正确,不再会出现魔数(magic number)。相对于对象,它保证了输入的类型(你定义的对象可能某一天不再只有number类型的value),不再需要额外的类型判断。

装饰器

对于装饰器其实很多开发者既熟悉又陌生,在redux,mobx比较流行的现在,在代码中出现装饰器的调用已经很普遍,但是大多数开发者并没有将自己代码逻辑抽成装饰器的习惯。

比如在这个SDK的开发中,我们需要提供一些facade来兼容不同的平台(iOS, Android或者Web),而这个facade会通过插件的形式让开发者自己注册,SDK会维护一个注入后的对象,常规的使用方法是到了使用函数后判断环境再判断对象中有没有想有的插件,有就使用插件。

实际来看,插件就是一个拦截器,我们只要阻止真正的函数运行就可以,大概的逻辑是这样的:

export function facade(env: number) {
  return function(
    target: object,
    name: string,
    descriptor: TypedPropertyDescriptor<any>
  ) {
    let originalMethod = descriptor.value;
    let method;

    return {
      ...descriptor,
      value(...args: any[]): any {
        let [arg] = args;
        let { param, success, failure, polyfill } = arg;   // 这部分可以自定义
        if ((method = polyfill[env])) {
          method.use(param, success, failure);
          return;
        }
        originalMethod.apply(this, args);
      }
    };
  };
}

在SDK的开发过程中另一个常会遇到的就是很多参数的校验和再封装,我们也可以使用装饰器去完成:

export function snakeParam(
  target: object,
  name: string,
  descriptor: TypedPropertyDescriptor<any>
) {
  let callback = descriptor.value!;

  return {
    ...descriptor,
    value(...args: any[]): any {
      let [arg, ...other] = args;
      arg = convertObjectName(arg, ConvertNameMode.toSnake);
      callback.apply(this, [arg, ...other]);
    }
  };
}÷

泛形

泛形可以根据用户的输入决定输出,最简单的例子是

function identity<T>(arg: T): T {
    return arg;
}

当然它没有什么特别的意义,但是它表明了返回是根据arg的类型,在一般开发过程中,你逃不开范型的是Promise或者前面的TypedPropertyDescriptor这种内建的需要类型输入的地方,不要草率的使用any,如果你的后端返回是一个标准结构体类似:

export interface IRes {
  status: number;
  message: string;
  data?: object;
}

那么你可以这样使用Promise:

function example(): Promise<IRes> {
    return new Promise ...
}

当然泛形有很多高级应用,例如泛形约束,泛型创建工厂函数,已经超出了本文的范围,可以去官方文档了解。

构建

如果你的构建工具是Webpack,在SDK的开发中,尽量使用node方式调用(即webpack.run执行),因为SDK的构建往往会应对很多不同的参数变化,node方式相比纯配置方式可以更加灵活的调整输入输出的参数,也可以考虑使用rollup,rollup的构建代码更加面向编程方式。

需要注意的是,在Webpack3和rollup中构建中可以使用ES6模块化的方式构建,这样业务代码引入你的SDK后,可以通过解构引入的方式减少最终业务代码的体积,如果你只是提供了commonjs的包,那么构建工具的tree sharking是无法生效的,如果使用babel的话注意关闭module的编译。

另外一种减少单个包体积的方式,可以使用lerna在一个git仓库里构建多个NPM包,比起拆仓库可以更方便的使用公共部分的代码,但是也需要注意对公共部分代码的修改不要影响到别的包。

其实对于大多数的SDK的来说,Webpack3和rollup使用感受是差不多的,比较常用的插件都有几乎同名的对应。不过rollup有两个优势,一个是rollup的构建更细化,rollup.rollup接受inputOptions生成bundle,还可以generate生成sourcemap,write生成output,在这个过程中我们可以做一些细致的工作。

第二点是rollup.rollup会返回一个promise,也就意味着我们可以使用async的方式来写构建代码,而webpack.run还是使用的回调函数,虽然开发者可以封装成promise,但是个人觉得还是rollup的写法还是更爽一点。

单元测试

上周我同事做了一个在线的分享,我发现很多同学都对单测很感兴趣也很疑惑,在前端开发中,对涉及UI的业务代码开发单测试比较困难的,但是对于SDK,单元测试肯定是准出的一个充要条件。当然其实我也很不喜欢写单测,因为单测往往比较枯燥,但是不写单测肯定会被老司机们“教育”的~_~。

一般的单测使用mocha作为测试框架,expect作为断言库,使用nyc提供单测报告,一个大概的单测如下:

describe('xxx api test', function() {            // 注意如果要用this调用mocha,不要用箭头函数
  this.timeout(6000);
  it('xxx', done => {
    SDK.file
      .chooseImage({
        count: 10,
        cancel: () => {
          console.log('选择图片取消----');
        }
      })
      .then(res => {
        console.dir(res);
        expect(res).to.be.an('object');
        expect(res).to.have.keys('ids');
        expect(res.ids).to.be.an('array');
        expect(res.ids).to.have.length.above(0);
        uploadImg(res.ids);
        done();
      });
  });
});

同样你可以用TypeScript写单测,当然在执行过程中,不需要再编译了,我们可以直接给mocha注册ts-node来直接执行,具体方式可以参考Write tests for TypeScript projects with mocha and chai — in TypeScript!。但是有一点需要提醒你,写单测的时候尽量依赖文档而不是智能提示,因为你的代码出错,可能会导致你的智能提示也是错误的,你根据错误的智能提示写的单测肯定也是。。。

对于网络请求的模拟可以使用nock这个库,需要在it之前增加一个beforeEach方法:

describe('proxy', () => {
  beforeEach(() => {
    nock('http://test.com')
      .post('/test1')
      .delay(200)
      .reply(200, {            // body
        test1: 1,
        test2: 2
      }, {
        'server-id': 'test' // header
      });
  });
  it(...
}

最后我们用一个npm script加上nyc在mocha前面,就可以获得我们的单测报告了。

这里我还提了几个TypeScript使用中的小tips给大家参考。

tips: 如何在非发包情况下给内部库添加声明

这个SDK在开发过程会依赖一个内部NPM包,为了让这个NPM支持TypeScript调用,我们有几种做法:

  • 给原包添加d.ts文件,然后发布.
  • 发布@types包,需要注意的是NPM不支持@types/@scope/{pkgname}这种写如果是私库包,可以使用@types/scope_{pkgname}这种写法.
  • 这次使用的标注一个文件夹存放对应的d.ts文件,这种方式适合开发中进行,如果你觉得你写的d.ts还不够完美,或者这个d.ts文件目前只有这个SDK有需要,可以这么使用,在tsconfig.json中修改:

    "baseUrl": "./",
    "paths": {
        "*": ["/type/*"]
    }

tips: 如何处理resolve和reject不同类型的promise回调

默认的reject返回的参数类型是any,不一定能满足我们的需要,这里给一个解决方案,并非最佳,作为抛砖引玉:

interface IPromise<T, U> {
  then<TResult1 = T, TResult2 = never>(
    onfulfilled?:
      | ((value: T) => TResult1 | PromiseLike<TResult1>)
      | undefined
      | null,
    onrejected?:
      | ((reason: U) => TResult2 | PromiseLike<TResult2>)
      | undefined
      | null
  ): IPromise<TResult1 , TResult2>;
  catch<TResult = never>(
    onrejected?:
      | ((reason: U) => TResult | PromiseLike<TResult>)
      | undefined
      | null
  ): Promise<TResult>;

 

iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊、京东、当当开售。

iKcamp官网:https://www.ikcamp.com

包含:文章、视频、源代码

深入了解前端 SDK 和问题排查 综上所述,前端SDK是前端开发中不可或缺的工具,它们提供了丰富的功能和抽象,可以大大简化开发过程。前端SDK是开发现代前端应用程序的有力工具,它们提供了丰富的功能和抽象,使开发人员能够更轻松地构建应用程序。社区支持:流行的前端SDK通常有庞大的社区支持,开发人员可以从社区中获取帮助、分享经验和解决问题。这些SDK提供了一些核心的功能和抽象,使开发人员能够更轻松地构建交互式、响应式的用户界面。通过使用浏览器的性能分析工具,我们可以检测性能瓶颈并找出需要优化的地方,以提供更好的用户体验。二、前端SDK的优势。 阅读详情

相关推荐

避开期货指标常见坑:文华财经赢顺DK多空指标优化配置指南(附参数调试技巧)

本文详细解析了文华财经赢顺DK多空指标的优化配置方法,帮助交易者避开常见使用误区。通过参数个性化适配、动态调整趋势阈值和过滤假信号的三重验证,提升指标在期货交易中的准确性。附有参数调试技巧和不同市况下的配置建议,适合中高级交易者参考。

weixin_29063979的博客 434

教你如何开发js-sdk(第二章)

教你如何开发带页面的js-sdk,可以打包成js文件,使用方可以直接通过script标签接入,然后调用函数即可。

M18856018695的博客 2830

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1082

SDK 指南

简单了解一下SDK的含义,全称:软件开发工具包,其是一个用于帮助开发者在特定平台、框架或技术栈中实现某些功能的工具集。

weixin_52648900的博客 5592

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2936

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1367

前端初学者 sdk 的使用

创建好上面的 package.json 文件 执行 npm i 安装好依赖 sdk/index.ts

qq_36411712的博客 2369

VTK API 详解(103):vtkGPUVolumeRayCastMapper - GPU加速体绘制

是 VTK 中基于 GPU 的高效体绘制映射器,利用现代显卡的计算能力,通过射线投射算法实现快速且高质量的三维体积渲染。相比 CPU 版本的,GPU 映射器性能大幅提升,支持更复杂的光照和渲染效果,是体绘制的主流选择。是 VTK 中性能优异的GPU体绘制映射器;适合大数据集和实时交互应用;配合灵活设置颜色、透明度和光照;建议在支持OpenGL的环境中使用。

yumeiguo的博客 293

松能T660显示器支架体验:阻尼可调,单手随调随停

长时间伏案工作,显示器高度不合适不仅挤压桌面空间,更会带来肩颈酸痛等健康隐患。人体工学桌面改造中,显示器支架是解决视线平齐与释放桌面空间的关键工具。其核心原理在于通过内部弹簧提供支撑力,配合可调阻尼结构,让屏幕在任意高度和角度下都能稳定停留。阻尼可调直接决定了支架与不同重量显示器的适配程度,也决定了用户能否实现单手升降、俯仰、旋转的“随调随停”体验。对于双屏或多屏办公场景,支架还能帮助屏幕对齐,减少视觉切换疲劳。本文以松能T660为例,从安装前适配检查、夹具固定、VESA面板挂载到阻尼调节实操,完整拆解了百

weixin_34293911的博客 584

构网型逆变器下垂控制与电流限幅策略研究:理论、仿真与代码实现

随着分布式发电和微电网技术的快速发展,构网型(Grid-Forming, GFM)逆变器因其能够自主建立电压和频率参考、支撑弱电网及孤岛运行而受到广泛关注。本文提出并实现了一种基于下垂控制的构网型逆变器控制策略,将逆变器等效为受控电压源,通过L型滤波器接入配电网。在公共耦合点(PCC)处实时测量三相电压和电流,计算有功和无功功率,进而采用P-w和Q-V下垂控制生成内部频率和电压幅值,合成三相参考电压。针对故障情况下过电流问题,设计了一种自适应电流限幅模块:当电流幅值超过设定上限时,动态降低电压参考系数k_s

huanghm88的专栏 155

uniapp [安卓苹果App端] - 实现微信支付功能+拉起微信付款支付后返回本app页面,详解uniApp如何唤起本机微信app并跳转到支付页面全流程及示例源码(uniapp实现微信支付,可打包)

uni-app项目在APP端使用微信支付功能,uniapp前端实现微信支付,uniapp开发安卓App对接微信支付,uniapp苹果ios唤起微信支付,uniapp调用微信支付uniapp开发app-调用微信支付,uniapp开发安卓苹果app如何接入微信支付,前后端应该怎么做,UniApp中实现微信支付功能,支付报错,调起失败没响应,uniapp苹果微信支付唤起实现,app唤起微信支付,拉起微信支付,uniapp中唤醒微信进行支付并返回app,uniApp调起微信支付失败报错,全网最详细的uniapp微信

🏆 前端领域优质创作者 1万+

前端监控 SDK 开发分享

以上分享是我们在做监控SDK时比较核心的这三个方面,还有很多其它的细节和实现,比如:如何节流、上报时机、数据合并、初始化配置等。开发迭代过程中,要避免客户端SDK或者后端服务因为迭代造成的兼容性问题。还比较重要的是要考虑后期数据库查询和存储方面的需求,收集、存储和查询才能完整的构成这套前端监控系统。觉得本文对你有帮助?请分享给更多人。...

m0_62051288的博客 2186

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

前端埋点监控SDK开发详细教程

前端埋点监控SDK开发详细教程

太阳与星辰的博客 1136

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

小满 前端埋点SDK 带你 从0 开发 并且发布npm

***@requestUrl接口地址*@historyTrackerhistory上报*@hashTrackerhash上报*@domTracker携带Tracker-key点击事件上报*@historyTrackersdkVersionsdk版本*@historyTrackerextra透传字段*@jsErrorjs和promise报错异常上报*/uuidboolean,boolean,boolean,extrajsError。...............

qq1195566313的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

web前端SDK的测试方法

web前端SDK的测试方法一、前言二、浅谈SDK和API三、webSDK的测试方法四、Nodejs+karma+jasmine1.环境部署_安装node.js①安装node.js:直接到官网下载安装包②配置环境变量③检查是否安装成功:node.js环境安装成功后可以正常使用node和npm命令。④如何使用Npm命令?2.环境部署_安装karma3.环境部署_安装jasmine①jasmine工具可以独立运行在Ruby、Python和Node.js环境上。②jasmine在Node.js环境下面安装的步骤:③

wxf_csdn的博客 3714

如何自己开发一个前端监控SDK

最近在负责团队前端监控系统搭建的任务。因为我们公司有统一的日志存储平台、日志清洗平台和基于 Grafana 搭建的可视化看板,就剩日志的采集和上报需要自己实现了,所以决定封装一个前端监控 SDK 来完成日志的采集和上报。

m0_37937502的博客 1351

HOW - 前端 sdk 实践(一)

提供完整的.d.ts类型定义编写完整的接入文档,说明:如何初始化各 API 参数说明常见错误处理示例代码。

weixin_58540586的博客 1724

如何打造一款标准 前端 JS-SDK ???

简介:岳赢平台的JS-SDK是如何满足业务监控的需求的呢?如何才能更合理的设计JS-SDK呢,一起来了解下把0 前言本文主要介绍如何基于JavaScript来开发SDK,任何基于JS的场景都可以用类似的思路来解决,无论是移动端H5还是服务端纯NodeJS。文中会提及一些设计原则以及实现技巧,并结合 岳鹰全景监控平台SDK 这个实际案例来展示如何应用它们。1 SDK是什么SDK全称是“Softwar...

React_Community的博客 2895

SDK 和 API 的区别,你都知道吗?

sds和api的区别

weixin_43846916的博客 2578
上一篇: 前端开发者手册2019
下一篇: Android OKHttp 可能你从来没用过的拦截器 【实用推荐】
妄想编程
博客等级 码龄8年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值