最近在開發(fā)一款一鍵登錄的號碼認證js-sdk
,所以就做了一些調(diào)研,記錄下開發(fā)過程。
前端SDK是什么?前端SDK是為了幫助前端實現(xiàn)特定需求,而向開發(fā)者暴露的一些JS-API的集合,規(guī)范的SDK包括若干API實現(xiàn)、說明文檔等
前端SDK其實很常見了,比如:
UI組件庫:通過封裝一系列組件,通過配置幫助開發(fā)者調(diào)用
Antd
ElementUI
JS類庫:通過實現(xiàn)一類常用的方法,便于開發(fā)處理數(shù)據(jù),也不用再考慮兼容性
lodash
moment
監(jiān)控統(tǒng)計工具:通過API,來監(jiān)聽前端系統(tǒng)的報錯、統(tǒng)計數(shù)據(jù)
Sentry
百度統(tǒng)計等
SDK開發(fā)其實很簡單,簡單到寫一個函數(shù)導出就行,但在實際應用的過程中,我們要考慮很多實際情況。
SDK一般都是為了滿足一類業(yè)務的需要,所以設計之初要明確業(yè)務范圍
即能用確定的方法實現(xiàn),就不要再去搞復雜的內(nèi)容。我理解,比如獲取DOM,如果GetElementById
可以實現(xiàn),就不要再設計一下GetElementsByTagName
、 document.querySelector
等方法封裝,除非有其他的開發(fā)需要無法滿足。
SDK減少依賴,要避免Lodash、JQuery、Moment、Dayjs等庫,盡可能自行實現(xiàn)必要的方法,或者引入盡量小的庫。否則會導致SDK打包后過大,或者更新版本帶來的兼容問題
當然一切都要根據(jù)實際情況,有些SDK是時間的各種處理,自己處理時間的成本太高,不妨引入小型的Dayjs時間庫
減少BreakChange,絕不能導致載體應用崩潰,同時做好文檔說明
模塊化實現(xiàn)方法,盡量小的封裝函數(shù),保持函數(shù)功能的單一性原則,這樣就可以更好的增加SDK的能力。
根據(jù)這些原則,下面是我們做的對應操作:
首先要明確我們寫的SDK是用來做什么的?
比如我本次實現(xiàn)的是用戶H5頁面的一鍵登錄和號碼檢測。
那么我們需要暴露兩個實例,供其他開發(fā)者使用,為了滿足易擴展的原則,我們將聲明兩個類,來實現(xiàn)(如果每個實例都很多能力,可以拆分成兩個SDK也是可以的)
提供的SDK一般都要提供壓縮和未壓縮版本,未壓縮可以用來幫助開發(fā)調(diào)用,查找問題。壓縮版本可以使用在生產(chǎn)環(huán)境,減少http損耗。所以我們要借助構(gòu)建工具來集成這部分的能力。
可供選擇的壓縮工具有很多:webpack、Rollup、Gulp
如果是純類庫的壓縮,當然是Rollup更好,壓縮更徹底
如果是有DOM和樣式,那么使用webpack功能更強大
這里由于我們可能涉及到頁面SDK,而且對Webpack更熟悉,所以選擇Webpack
SDK的設計原則有一條:足夠穩(wěn)定、向后兼容,最少依賴原則。
這就意味著我們要少寫B(tài)ug,所以一定要引入單元測試,這里我們選擇Jest,使用起來也很簡單。
describe('common test', () => { test('osIsPc', () => { expect(osIsPc()).toBeBoolean(true, false); }) test("isWifi", () => { expect(isWifi()).toBeBoolean(true, false); }) }) 復制代碼
瀏覽器js模塊化常見的幾種方式包括:amd\cmd\es6 modules\umd
1、靜態(tài)資源引入
<script src="/sdk/v1/phoneserver"></script> 復制代碼
2、支持amd引入
define([jquery.js, lodash.js], function($, _){ console.log("jquery and lodash", $, _) }) 復制代碼
3、支持cmd引入
define(function(require){ const lodash = require('./a.js') console.log("lodash", lodash) }) 復制代碼
4、支持es6引入
import { PhoneServer } from 'phone-server-sdk' 復制代碼
我們直接在webpack中配置umd方式打包,然后就可以支持上面的多種引入方式
output: { path: path.resolve(__dirname, '../dist'), filename: '[name].js', library: 'Phone-JS-SDK', libraryTarget: 'umd' } 復制代碼
打包的庫命名:Phone-JS-SDK
管理好版本號
記錄好更新日志
SDK版本更新,每個版本都會存在差異,而用戶使用的版本肯定也太一樣,所以記錄好版本更新日志可以減少非技術(shù)問題。
通過靜態(tài)文件導出的SDK要同時部署多個版本,不能隨時下線老版本。
代碼混淆
開發(fā)環(huán)境配置和代碼格式
上傳NPM
CDN部署
依賴的三方庫如何打包進SDK
僅支持靜態(tài)引入的庫如何處理
如何全局共享庫方法
針對有后端API交互的SDK,需要考慮
API要限流、限制次數(shù)、防止盜刷
日志監(jiān)控和數(shù)據(jù)上報
針對提交代碼的檢測和格式化,這里直接配置好了,如果需要了解,可以查看我之前的一篇文章前端工程化:Prettier+ESLint+lint-staged+commitlint+Hooks+CI 自動化配置處理
構(gòu)建工具構(gòu)建,配置開發(fā)環(huán)境、ts配置
實現(xiàn)類庫的相關(guān)方法(版本記錄、幫助命令等)
實現(xiàn)一鍵登錄的方法(預期的功能方法)
實現(xiàn)號碼檢測的方法
單元測試
上傳npm,支持導入
我們選擇了ts,首先配置下tsconfig.json,然后配置webpack,引入ts-lodader,通過webpack-merge自行配置生產(chǎn)環(huán)境和開發(fā)環(huán)境,比較簡單就不重復了
module.exports = { entry: { sdk: [path.resolve(__dirname, '../src/index.ts')] }, resolve: { extensions: ['.tsx', '.ts', '.js'], }, output: { path: path.resolve(__dirname, '../dist'), filename: '[name].js', library: 'SDK', libraryTarget: 'umd' }, module: { rules: [ { test: /\.ts?$/, exclude: /node_modules/, use: [ { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], }, }, { loader: 'ts-loader', options: { compilerOptions: { noEmit: false, }, }, }, ], }, ] } 復制代碼
下面是項目的主要目錄結(jié)構(gòu)
src源代碼
scripts 是webpack的相關(guān)配置
public 是用來調(diào)試和打包的目錄
tests 單元測試
LibInfo.ts 用來實現(xiàn)庫的一些方法,比如獲取版本號,幫助文檔,展示依賴版本等
PhoneNumberLogin.ts 一鍵登錄類
PhoneNumberAuth.ts 號碼認證類
ajax.ts 簡單封裝的ajax請求
index.ts 作為入口文件
js-sdk ├─ __tests__ │ └─ utils │ ├─ ajax.test.js │ └─ commont.test.js ├─ public │ ├─ index.html │ └─ sdk.js ├─ scripts │ ├─ webpack.base.config.js │ ├─ webpack.dev.config.js │ └─ webpack.prod.config.js ├─ src │ ├─ lib │ │ ├─ LibInfo.ts │ │ ├─ PhoneNumberAuth.ts │ │ ├─ PhoneNumberLogin.ts │ │ └─ Init.ts │ ├─ utils │ │ ├─ ajax.ts │ │ ├─ common.ts │ │ └─ interface.ts │ └─ index.ts ├─ Readme.md ├─ index.d.ts ├─ jest.config.js ├─ package.json ├─ tsconfig.json └─ yarn.lock 復制代碼
1、在調(diào)用之前,我們需要引用第三方庫,而且是md5加密的(如下),無法直接下載本地使用,所以考慮直接插入head中
export const scriptInit = (src: string, callback?: Function) => { const script:any = document.createElement('script'), fn = callback || function(){}; script.type = 'text/javascript'; //IE if(script.readyState){ script.onreadystatechange = function(){ if( script.readyState == 'loaded' || script.readyState == 'complete' ){ script.onreadystatechange = null; fn(); } }; }else{ //其他瀏覽器 script.onload = function(){ fn(); }; } script.src = src; document.getElementsByTagName('head')[0].appendChild(script); } 復制代碼
2、我們以實現(xiàn)意見登錄號碼為例,新建PhoneNumberLogin.ts
const loginPhoneUrl = `http://test.com` export class PhoneNumberLogin { constructor(options:AppInfo){ this.Init() } private Init(){ // 引入第三方依賴的script scriptInit(loginPhoneUrl) } // 處理一鍵登錄的接口邏輯 public LoginApp(options){ return options } } 復制代碼
這樣我們每一個小的功能點都放在一個類中,不對外的設置為私有方法,對外的可以設置為公共方法,其他的通過引用就可以讓SDK保持良好的可擴展性。
3、在index.ts中拋出方法
export * from './lib/PhoneNumberLogin.ts' 復制代碼
4、在項目中使用
script
導入,一般都需要申請域名,那么就需要考慮容災,防止一臺機器掛掉,服務不可用,一般考慮CDN部署
const { PhoneNumberLogin } = Phone-JS-SDK const PhoneServer = new PhoneNumberLogin() 復制代碼
ES6 Modules導入
const { PhoneNumberLogin } from "Phone-JS-SDK" const PhoneServer = new PhoneNumberLogin() 復制代碼
接著我們發(fā)布下npm,一個JS-SDK就完成了。
登陸npm倉庫,沒有的話去注冊一個,地址
npm login 復制代碼
選擇一個中意的SDK名字,查一下是否存在,這里我們起個名字Phone-JS-SDK
執(zhí)行npm version patch && npm publish --registry=https://registry.npmjs.org
,然后就發(fā)布成功了。
作者:前端中后臺
鏈接:https://juejin.cn/post/7111880557914488846
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/127966.html
摘要:未使用微信如果網(wǎng)頁中未使用微信用戶在微信中打開網(wǎng)站可能會觸發(fā)這個錯誤,目前看來只有忽略。關(guān)于微信支付方法監(jiān)聽事件之后再進行下一步操作方法直接使用文檔中的支付代碼,不要使用公眾號支付文檔里面的代碼。 Fundebug并沒有使用微信JS-SDK,然而卻收到了WeixinJSBridge is not defined的報錯: showImg(https://segmentfault.com...
摘要:進過下面的步驟,一步一步的配置,就可以讓你正確的在項目中引入微信的。在進行了正確的微信文件引入后看上面在頁面中調(diào)用如下代碼就可以注入權(quán)限驗證配置??梢酝ㄟ^微信提供的兩個接口來進行事件回調(diào)。到這為止,微信的接入就完成了。 微信JS-SDK的功能 如果你點進來,那么我相信你應該知道微信的JS-SDK可以用來做什么了。微信的官方文檔描述如下。 微信JS-SDK是微信公眾平臺面向網(wǎng)頁開發(fā)者提供...
摘要:安裝并引入依賴包這里是說明文檔下載依賴包在需要用到的模塊引入檢查是否引入成功可以在引入的模塊中執(zhí)行控制臺顯示以上代碼表示引入成功配置微信所有需要使用的頁面必須先注入配置信息,否則將無法調(diào)用開啟調(diào)試模式調(diào)用的所有的返回值會 1.安裝并引入JS-SDK依賴包 這里是JS-SDK說明文檔 1.1 npm 下載依賴包 npm install weixin-js-sdk --save 1.2.在...
摘要:注冊測試號注冊的地址在這里要進行微信公眾號的開發(fā),那就需要一個本地的開發(fā)環(huán)境來進行開發(fā)。而微信測試號就正好提供了這樣的一個環(huán)境。通俗一點理解微信要知道訪問它資源是不是這個當前測試號。 注冊測試號 注冊的地址在 這里 要進行微信公眾號的開發(fā),那就需要一個本地的開發(fā)環(huán)境來進行開發(fā)。而微信測試號就正好提供了這樣的一個development環(huán)境。每個微信號只能對應一個測試號,但是每個測試號可以...
摘要:前端配置微信微信是微信公眾平臺面向網(wǎng)頁開發(fā)者提供的基于微信的網(wǎng)頁開發(fā)工具包,通過使用微信,網(wǎng)頁開發(fā)者,可借助微信高效的使用拍照掃碼錄音定位等原生應用愛具有的能力。 前端配置微信 js-sdk 微信js-sdk 是微信公眾平臺面向網(wǎng)頁開發(fā)者提供的基于微信的網(wǎng)頁開發(fā)工具包,通過使用微信 js-sdk,網(wǎng)頁開發(fā)者,可借助微信高效的使用 拍照、掃碼、錄音、定位等原生應用愛具有的能力。 前端開發(fā)...
摘要:這段時間做了一個微信服務號的開發(fā)初版設計圖如下這個方式前面幾個步驟都沒有問題關(guān)鍵在于后面第六步重定向到頁面之所以這么做是考慮到了我們前端的框架需要對入口作統(tǒng)一的處理操作這樣在機子上沒有任何問題但是在上面經(jīng)常出現(xiàn)的認證失敗而且不是必現(xiàn)是偶爾 這段時間做了一個微信服務號的開發(fā)初版設計圖如下:showImg(https://segmentfault.com/img/bV7EHR?w=690&...
閱讀 454·2024-11-07 18:25
閱讀 130762·2024-02-01 10:43
閱讀 943·2024-01-31 14:58
閱讀 904·2024-01-31 14:54
閱讀 83006·2024-01-29 17:11
閱讀 3263·2024-01-25 14:55
閱讀 2057·2023-06-02 13:36
閱讀 3166·2023-05-23 10:26