最近在開發一款一鍵登錄的號碼認證js-sdk
,所以就做了一些調研,記錄下開發過程。
前端SDK是什么?前端SDK是為了幫助前端實現特定需求,而向開發者暴露的一些JS-API的集合,規范的SDK包括若干API實現、說明文檔等
前端SDK其實很常見了,比如:
UI組件庫:通過封裝一系列組件,通過配置幫助開發者調用
Antd
ElementUI
JS類庫:通過實現一類常用的方法,便于開發處理數據,也不用再考慮兼容性
lodash
moment
監控統計工具:通過API,來監聽前端系統的報錯、統計數據
Sentry
百度統計等
SDK開發其實很簡單,簡單到寫一個函數導出就行,但在實際應用的過程中,我們要考慮很多實際情況。
SDK一般都是為了滿足一類業務的需要,所以設計之初要明確業務范圍
即能用確定的方法實現,就不要再去搞復雜的內容。我理解,比如獲取DOM,如果GetElementById
可以實現,就不要再設計一下GetElementsByTagName
、 document.querySelector
等方法封裝,除非有其他的開發需要無法滿足。
SDK減少依賴,要避免Lodash、JQuery、Moment、Dayjs等庫,盡可能自行實現必要的方法,或者引入盡量小的庫。否則會導致SDK打包后過大,或者更新版本帶來的兼容問題
當然一切都要根據實際情況,有些SDK是時間的各種處理,自己處理時間的成本太高,不妨引入小型的Dayjs時間庫
減少BreakChange,絕不能導致載體應用崩潰,同時做好文檔說明
模塊化實現方法,盡量小的封裝函數,保持函數功能的單一性原則,這樣就可以更好的增加SDK的能力。
根據這些原則,下面是我們做的對應操作:
首先要明確我們寫的SDK是用來做什么的?
比如我本次實現的是用戶H5頁面的一鍵登錄和號碼檢測。
那么我們需要暴露兩個實例,供其他開發者使用,為了滿足易擴展的原則,我們將聲明兩個類,來實現(如果每個實例都很多能力,可以拆分成兩個SDK也是可以的)
提供的SDK一般都要提供壓縮和未壓縮版本,未壓縮可以用來幫助開發調用,查找問題。壓縮版本可以使用在生產環境,減少http損耗。所以我們要借助構建工具來集成這部分的能力。
可供選擇的壓縮工具有很多:webpack、Rollup、Gulp
如果是純類庫的壓縮,當然是Rollup更好,壓縮更徹底
如果是有DOM和樣式,那么使用webpack功能更強大
這里由于我們可能涉及到頁面SDK,而且對Webpack更熟悉,所以選擇Webpack
SDK的設計原則有一條:足夠穩定、向后兼容,最少依賴原則。
這就意味著我們要少寫Bug,所以一定要引入單元測試,這里我們選擇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、靜態資源引入
<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版本更新,每個版本都會存在差異,而用戶使用的版本肯定也太一樣,所以記錄好版本更新日志可以減少非技術問題。
通過靜態文件導出的SDK要同時部署多個版本,不能隨時下線老版本。
代碼混淆
開發環境配置和代碼格式
上傳NPM
CDN部署
依賴的三方庫如何打包進SDK
僅支持靜態引入的庫如何處理
如何全局共享庫方法
針對有后端API交互的SDK,需要考慮
API要限流、限制次數、防止盜刷
日志監控和數據上報
針對提交代碼的檢測和格式化,這里直接配置好了,如果需要了解,可以查看我之前的一篇文章前端工程化:Prettier+ESLint+lint-staged+commitlint+Hooks+CI 自動化配置處理
構建工具構建,配置開發環境、ts配置
實現類庫的相關方法(版本記錄、幫助命令等)
實現一鍵登錄的方法(預期的功能方法)
實現號碼檢測的方法
單元測試
上傳npm,支持導入
我們選擇了ts,首先配置下tsconfig.json,然后配置webpack,引入ts-lodader,通過webpack-merge自行配置生產環境和開發環境,比較簡單就不重復了
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, }, }, }, ], }, ] } 復制代碼
下面是項目的主要目錄結構
src源代碼
scripts 是webpack的相關配置
public 是用來調試和打包的目錄
tests 單元測試
LibInfo.ts 用來實現庫的一些方法,比如獲取版本號,幫助文檔,展示依賴版本等
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、在調用之前,我們需要引用第三方庫,而且是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、我們以實現意見登錄號碼為例,新建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() 復制代碼
接著我們發布下npm,一個JS-SDK就完成了。
登陸npm倉庫,沒有的話去注冊一個,地址
npm login 復制代碼
選擇一個中意的SDK名字,查一下是否存在,這里我們起個名字Phone-JS-SDK
執行npm version patch && npm publish --registry=https://registry.npmjs.org
,然后就發布成功了。
作者:前端中后臺
鏈接:https://juejin.cn/post/7111880557914488846
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/127966.html
摘要:未使用微信如果網頁中未使用微信用戶在微信中打開網站可能會觸發這個錯誤,目前看來只有忽略。關于微信支付方法監聽事件之后再進行下一步操作方法直接使用文檔中的支付代碼,不要使用公眾號支付文檔里面的代碼。 Fundebug并沒有使用微信JS-SDK,然而卻收到了WeixinJSBridge is not defined的報錯: showImg(https://segmentfault.com...
摘要:進過下面的步驟,一步一步的配置,就可以讓你正確的在項目中引入微信的。在進行了正確的微信文件引入后看上面在頁面中調用如下代碼就可以注入權限驗證配置。可以通過微信提供的兩個接口來進行事件回調。到這為止,微信的接入就完成了。 微信JS-SDK的功能 如果你點進來,那么我相信你應該知道微信的JS-SDK可以用來做什么了。微信的官方文檔描述如下。 微信JS-SDK是微信公眾平臺面向網頁開發者提供...
摘要:安裝并引入依賴包這里是說明文檔下載依賴包在需要用到的模塊引入檢查是否引入成功可以在引入的模塊中執行控制臺顯示以上代碼表示引入成功配置微信所有需要使用的頁面必須先注入配置信息,否則將無法調用開啟調試模式調用的所有的返回值會 1.安裝并引入JS-SDK依賴包 這里是JS-SDK說明文檔 1.1 npm 下載依賴包 npm install weixin-js-sdk --save 1.2.在...
摘要:前端配置微信微信是微信公眾平臺面向網頁開發者提供的基于微信的網頁開發工具包,通過使用微信,網頁開發者,可借助微信高效的使用拍照掃碼錄音定位等原生應用愛具有的能力。 前端配置微信 js-sdk 微信js-sdk 是微信公眾平臺面向網頁開發者提供的基于微信的網頁開發工具包,通過使用微信 js-sdk,網頁開發者,可借助微信高效的使用 拍照、掃碼、錄音、定位等原生應用愛具有的能力。 前端開發...
摘要:這段時間做了一個微信服務號的開發初版設計圖如下這個方式前面幾個步驟都沒有問題關鍵在于后面第六步重定向到頁面之所以這么做是考慮到了我們前端的框架需要對入口作統一的處理操作這樣在機子上沒有任何問題但是在上面經常出現的認證失敗而且不是必現是偶爾 這段時間做了一個微信服務號的開發初版設計圖如下:showImg(https://segmentfault.com/img/bV7EHR?w=690&...
閱讀 430·2024-11-07 18:25
閱讀 130684·2024-02-01 10:43
閱讀 923·2024-01-31 14:58
閱讀 893·2024-01-31 14:54
閱讀 82949·2024-01-29 17:11
閱讀 3225·2024-01-25 14:55
閱讀 2036·2023-06-02 13:36
閱讀 3133·2023-05-23 10:26