付費(fèi)下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序Taro的自動(dòng)埋點(diǎn)是什么
這篇文章主要介紹了微信小程序Taro的自動(dòng)埋點(diǎn)是什么,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓在下帶著大家一起了解一下?,F(xiàn)狀在多端統(tǒng)一的Taro中,我們不再能看到顯式的Page調(diào)用,甚至Taro打包之后的代碼里也不再存在任何Page的跡象,取而代之的則是小程序原生的Component(這一點(diǎn)大家通過觀察打包后的內(nèi)容可以得知),所以為了實(shí)現(xiàn)微信小程序在Taro中的自動(dòng)埋點(diǎn),我們需要換一個(gè)策略:重寫Component?;镜闹貙懺谖⑿判〕绦蛑?,其暴露的Component和Page能夠直接被重寫并進(jìn)行賦值:const
_originalComponent
=
Component;const
wrappedComponent
=
function
(options)
{
...do
something
before
real
Component
return
_originalComponent(options);
}復(fù)制代碼這樣可以很快的解決問題,但是當(dāng)我們在另一個(gè)小程序做這件事情的時(shí)候,我們就又需要手動(dòng)做一次這些處理,難免有些麻煩,為什么不找一個(gè)更通用的方案,我們只用關(guān)注我們需要關(guān)注的業(yè)務(wù)(埋點(diǎn))就行了呢?解決方案重中之重,從零開始思考,掌握真正問題,接近問題本質(zhì)重中之重,從零開始思考,掌握真正問題,接近問題本質(zhì)根問題在解決問題之前,不如讓我們先看看這個(gè)問題的本質(zhì)是什么。想在小程序中進(jìn)行自動(dòng)的埋點(diǎn),其實(shí)要做的就是在小程序指定的生命周期里做一些固定的處理,所以我們自動(dòng)埋點(diǎn)的問題實(shí)際上是如何劫持小程序的生命周期,而要劫持小程序的生命周期,我們需要做的就是去重寫options。如何解決在解決這個(gè)問題之前,我們要把自己需要解決的問題拆分出來:應(yīng)該怎么重寫options應(yīng)該重寫哪些options怎樣把自己的業(yè)務(wù)注入到監(jiān)聽的生命周期中。我們在上面的基礎(chǔ)解決辦法對(duì)如何重寫options就已經(jīng)有了答案,我們只需要在原小程序提供的方法外再包裹一層即可解決,同時(shí)為了保證我們的解決方案能適用于原生小程序和Taro這種多端統(tǒng)一的小程序方案,我們應(yīng)該同時(shí)支持重寫Component和Page,而對(duì)于最后一個(gè)問題,我們可以思考一下js中的事件系統(tǒng),相似的我們也可以實(shí)現(xiàn)一套發(fā)布訂閱的邏輯,只需要定制觸發(fā)事件(生命周期)和listeners,再針對(duì)生命周期原有邏輯進(jìn)行包裝即可;首先我們在重寫Component和Page之前應(yīng)當(dāng)保存原始的方法,避免原始方法被污染我們無法回退,這之后再去將小程序中的所有生命周期進(jìn)行枚舉生成一個(gè)默認(rèn)的事件對(duì)象中,保證我們在注冊了對(duì)應(yīng)生命周期的listeners后能通過尋址找到并對(duì)原生命周期方法進(jìn)行重寫。export
const
ProxyLifecycle
=
{
ON_READY:
'onReady',
ON_SHOW:
'onShow',
ON_HIDE:
'onHide',
ON_LOAD:
'onLoad',
ON_UNLOAD:
'onUnload',
CREATED:
'created',
ATTACHED:
'attached',
READY:
'ready',
MOVED:
'moved',
DETACHED:
'detached',
SHOW:
'show',
HIDE:
'hide',
RESIZE:
'resize',
};public
constructor()
{
this.initLifecycleHooks();
this.wechatOriginalPage
=
getWxPage();
this.wechatOriginalComponent
=
getWxComponent();
}//
初始化所有生命周期的鉤子函數(shù)private
initLifecycleHooks():
void
{
this.lifecycleHooks
=
Object.keys(ProxyLifecycle).reduce((res,
cur:
keyof
typeof
ProxyLifecycle)
=>
{
res[ProxyLifecycle[cur]]
=
[]
as
WeappLifecycleHook[];
return
res;
},
{}
as
Record<string,
WeappLifecycleHook[]>);
}復(fù)制代碼在這一步我們只需要將監(jiān)聽函數(shù)放到我們第一步中聲明的事件對(duì)象中,然后執(zhí)行重寫流程即可:public
addLifecycleListener(lifeTimeOrLifecycle:
string,
listener:
WeappLifecycleHook):
OverrideWechatPage
{
//
針對(duì)指定周期定義Hooks
this.lifecycleHooks[lifeTimeOrLifecycle].push(listener);
const
_Page
=
this.wechatOriginalPage;
const
_Component
=
this.wechatOriginalComponent;
const
self
=
this;
const
wrapMode
=
this.checkMode(lifeTimeOrLifecycle);
const
componentNeedWrap
=
['component',
'pageLifetimes'].includes(wrapMode);
const
wrapper
=
function
wrapFunc(options:
IOverrideWechatPageInitOptions):
string
|
void
{
const
optionsKey
=
wrapMode
===
'pageLifetimes'
?
'pageLifetimes'
:
'';
options
=
self.findHooksAndWrap(lifeTimeOrLifecycle,
optionsKey,
options);
const
res
=
componentNeedWrap
?
_Component(options)
:
_Page(options);
options.__router__
=
(wrapper
as
any).__route__
=
res;
return
res;
};
(wrapper
as
any).__route__
=
'';
if
(componentNeedWrap)
{
overrideWxComponent(wrapper);
}
else
{
overrideWxPage(wrapper);
}
return
this;
}/**
*
為對(duì)應(yīng)的生命周期重寫options
*
@param
proxyLifecycleOrTime
需要攔截的生命周期
*
@param
optionsKey
需要重寫的
optionsKey,此處用于
lifetime
模式
*
@param
options
需要被重寫的
options
*
@returns
{IOverrideWechatPageInitOptions}
被重寫的options
*/private
findHooksAndWrap
=
(
proxyLifecycleOrTime:
string,
optionsKey
=
'',
options:
IOverrideWechatPageInitOptions,
):
IOverrideWechatPageInitOptions
=>
{
let
processedOptions
=
{
...options
};
const
hooks
=
this.lifecycleHooks[proxyLifecycleOrTime];
processedOptions
=
OverrideWechatPage.wrapLifecycleOptions(proxyLifecycleOrTime,
hooks,
optionsKey,
options);
return
processedOptions;
};/**
*
重寫options
*
@param
lifecycle
需要被重寫的生命周期
*
@param
hooks
為生命周期添加的鉤子函數(shù)
*
@param
optionsKey
需要被重寫的optionsKey,僅用于
lifetime
模式
*
@param
options
需要被重寫的配置項(xiàng)
*
@returns
{IOverrideWechatPageInitOptions}
被重寫的options
*/private
static
wrapLifecycleOptions
=
(
lifecycle:
string,
hooks:
WeappLifecycleHook[],
optionsKey
=
'',
options:
IOverrideWechatPageInitOptions,
):
IOverrideWechatPageInitOptions
=>
{
let
currentOptions
=
{
...options
};
const
originalMethod
=
optionsKey
?
(currentOptions[optionsKey]
||
{})[lifecycle]
:
currentOptions[lifecycle];
const
runLifecycleHooks
=
():
void
=>
{
hooks.forEach((hook)
=>
{
if
(currentOptions.__isPage__)
{
hook(currentOptions);
}
});
};
const
warpMethod
=
runFunctionWithAop([runLifecycleHooks],
originalMethod);
currentOptions
=
optionsKey
?
{
...currentOptions,
[optionsKey]:
{
...options[optionsKey],
...(currentOptions[optionsKey]
||
{}),
[lifecycle]:
warpMethod,
},
}
:
{
...currentOptions,
[lifecycle]:
warpMethod,
};
return
currentOptions;
};復(fù)制代碼經(jīng)過如上兩步,我們就能對(duì)指定的生命周期進(jìn)行劫持并注入我們自己的listeners,使用被重寫過Component或者Page就會(huì)自動(dòng)觸發(fā)這些listeners。weapp-lifecycle-hook-plugin為了方便直接對(duì)微信小程序原生環(huán)境和Taro等多端統(tǒng)一方案進(jìn)行這一套通用的解決方案,我實(shí)現(xiàn)了一個(gè)插件來解決這個(gè)問題(私心安利)npm
install
weapp-lifecycle-hook-plugin
或者
yarn
add
weapp-lifecycle-hook-plugin復(fù)制代碼import
OverrideWechatPage,
{
setupLifecycleListeners,
ProxyLifecycle
}
from
'weapp-lifecycle-hook-plugin';
//
供
setupLifecycleListeners
使用的
hook
函數(shù),接受一個(gè)參數(shù),為當(dāng)前組件/頁面的options
function
simpleReportGoPage(options:
any):
void
{
console.log('goPage',
options);
}
//
setupListeners
class
App
extends
Component
{
constructor(props)
{
super(props);
}
componentWillMount()
{
//
...
//
手動(dòng)創(chuàng)建的實(shí)例和使用
setupLifecycleListeners
創(chuàng)建的實(shí)例不是同一個(gè),所以需要銷毀時(shí)需要單獨(dú)對(duì)其進(jìn)行銷毀
//
直接調(diào)用實(shí)例方式
const
instance
=
new
OverrideWechatPage(th
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公關(guān)公司媒介管理制度(3篇)
- 2026年泰安新泰市事業(yè)單位初級(jí)綜合類崗位公開招聘工作人員(76人)參考考試題庫及答案解析
- 2026廈門國際銀行福建寧德分行校園招聘備考考試題庫及答案解析
- 讀不完的大書第二課時(shí)
- 2026年贛州市第十中學(xué)春季學(xué)期頂崗教師招聘備考考試試題及答案解析
- 2026四川樂山馬邊彝族自治縣婦幼保健計(jì)劃生育服務(wù)中心招聘4人備考考試題庫及答案解析
- 2026年上半年黑龍江省地震局事業(yè)單位公開招聘工作人員2人考試參考試題及答案解析
- 2026年上半年四川中醫(yī)藥高等??茖W(xué)校第一批編外教職工招聘7人參考考試題庫及答案解析
- 2026內(nèi)蒙古直屬機(jī)關(guān)(參公單位)遴選公務(wù)員考試參考試題及答案解析
- 2026年上半年大慶市事業(yè)單位公開招聘工作人員164人筆試參考題庫及答案解析
- 2025年社區(qū)工作總結(jié)及2026年工作計(jì)劃
- 南昌地鐵培訓(xùn)課件
- GB/T 30104.104-2025數(shù)字可尋址照明接口第104部分:一般要求無線和其他有線系統(tǒng)組件
- 三年級(jí)上冊數(shù)學(xué)第三單元題型專項(xiàng)訓(xùn)練-判斷題(解題策略專項(xiàng)秀場)人教版(含答案)
- 湖南省婁底市新化縣2024-2025學(xué)年高一上學(xué)期期末考試生物試題(解析版)
- GB/T 45629.1-2025信息技術(shù)數(shù)據(jù)中心設(shè)備和基礎(chǔ)設(shè)施第1部分:通用概念
- 2025年中考?xì)v史開卷考查范圍重大考點(diǎn)全突破(完整版)
- 學(xué)術(shù)誠信與學(xué)術(shù)規(guī)范研究-深度研究
- 《ETF相關(guān)知識(shí)培訓(xùn)》課件
- DB15-T 3677-2024 大興安嶺林區(qū)白樺樹汁采集技術(shù)規(guī)程
- 2024年《13464電腦動(dòng)畫》自考復(fù)習(xí)題庫(含答案)
評(píng)論
0/150
提交評(píng)論