qiankun上線穩(wěn)定,問(wèn)題解決匯總
接入qiankun,項(xiàng)目上線也有段時(shí)間了,記錄一下遇到的問(wèn)題。
1.子應(yīng)用更新路由,父應(yīng)用菜單高亮不匹配問(wèn)題子應(yīng)用history.push之后,父應(yīng)用的菜單還停留在之前的菜單高亮,但是頁(yè)面內(nèi)容又是新的路由內(nèi)容,url也是新的。導(dǎo)致菜單高亮不正確。
解決辦法:
import{useEffect}from'react';import{history}from'umi';//處理子應(yīng)用push操作,父應(yīng)用的菜單高亮不正確BUGexportfunctionuseBrowserHistory(){useEffect(()=>{consthandlePopState=(event:any)=>{const{href}=event.target.location;//eg:http://localhost:1200/#/bps/producMange/imageAlbum?a=bconstpathNameWithSearch=href.split('#')[1];//eg:/bps/producMange/imageAlbum?a=bconstpathname=pathNameWithSearch.split('?')[0];console.group('---handlePopState---');console.log('history.pathname-->',history.location.pathname);console.log('event=>pathname-->',pathname);console.log('event=>pathNameWithSearch-->',pathNameWithSearch);console.groupEnd();//如果2個(gè)不一樣,說(shuō)明是子應(yīng)用自己push的路由if(history.location.pathname!==pathname){history.replace(pathNameWithSearch);}};window.addEventListener('popstate',handlePopState);return()=>{window.removeEventListener('popstate',handlePopState);};},[]);}2.子應(yīng)用頁(yè)面級(jí)路由攔截在接入乾坤后不生效,如何處理。子應(yīng)用要實(shí)現(xiàn)的是表單頁(yè)面離開(kāi)前如果有修改表單要詢問(wèn)是否確定要離開(kāi),子應(yīng)用是vue2應(yīng)用,使用routeBeforeLeave可以容易實(shí)現(xiàn),獨(dú)立運(yùn)行時(shí)沒(méi)有問(wèn)題。
現(xiàn)在接入我們平臺(tái)后,菜單是屬于父應(yīng)用的內(nèi)容,點(diǎn)擊后已經(jīng)去了新的路由,新的頁(yè)面,那個(gè)routeBeforeLeave雖然會(huì)觸發(fā),但是提示彈窗不出現(xiàn),交互效果也不對(duì)。
1現(xiàn)在改造父應(yīng)用的菜單,聲明式改為命令式
<Menu.Itemkey={item.id}>-<Linkto={item.path}>{item.name}</Link>+<divonClick={()=>handleClickRoute(item.path)}>{item.name}</div></Menu.Item>2自己處理點(diǎn)擊的邏輯
//NEED_HISTORY_BLOCK_ROUTE配置的是需要攔截的urlconsthandleClickRoute=async(path:string)=>{console.log(needHistoryBlock,path,location.pathname);constisNeedBlockRoute=NEED_HISTORY_BLOCK_ROUTE.includes(location.pathname,);if(isNeedBlockRoute){actions.setGlobalState({routeChange:true,});//延遲500ms,等待子應(yīng)用通信過(guò)來(lái),數(shù)據(jù)有沒(méi)有改變,是否需要攔截路由awaitdelay(500);if(needHistoryBlock){Modal.confirm({title:'提示',content:'修改的信息沒(méi)有保存,現(xiàn)在離開(kāi),設(shè)置不會(huì)保存',okText:'確認(rèn)',cancelText:'取消',onOk:()=>{actions.setGlobalState({needHistoryBlock:false,routeChange:false,});setNeedHistoryBlock(false);history.push(path);},onCancel:()=>{},});}else{history.push(path);}}else{history.push(path);}};父應(yīng)用在點(diǎn)擊菜單時(shí)先把routeChange改為true,然后子應(yīng)用監(jiān)聽(tīng),如果表單有更改,則通信告訴我設(shè)置needHistoryBlock為true,如果沒(méi)有更改則啥都不用處理。
父應(yīng)用監(jiān)聽(tīng)狀態(tài)變化,如果needHistoryBlock為true,則設(shè)置值,設(shè)置到全局變量里面。
if(state.needHistoryBlock){setNeedHistoryBlock(true);return;}handleClickRoute里面會(huì)延遲100ms去監(jiān)聽(tīng)這個(gè)值needHistoryBlock,如果為true則給出彈窗,如果【確認(rèn)】要離開(kāi)則先把2個(gè)狀態(tài)設(shè)置為false,然后history.push`。如果【取消】什么都不用做。
如果覺(jué)得這樣寫(xiě)不好,父應(yīng)用不應(yīng)該處理子應(yīng)用的邏輯,那就在子應(yīng)用聽(tīng)到消息后,自己彈出彈窗,然后在用戶點(diǎn)擊【確定】或【取消】后,自己執(zhí)行邏輯,然后通信給父應(yīng)用要不要去新的路由。也是可以的。【我們因?yàn)槟壳爸挥羞@個(gè)頁(yè)面需要這個(gè)操作,就先這樣簡(jiǎn)單處理了,嘻嘻~~】
3.同域名下多環(huán)境登錄問(wèn)題核心思想是在WebStorage存儲(chǔ)時(shí),把key增加環(huán)境信息。詳細(xì)代碼如下(下面代碼因?yàn)槎鄠€(gè)視角都要改成父應(yīng)用,所以還有額外的多平臺(tái)配置):
文件路徑:.src/utils/BapStore.ts
/**WebStorage類型*/enumStoreType{'local','session',}/**視角前綴*/enumPrefix{'platform'='bspPlatform','tenant'='bspTenant','user'='bspUser',}/***命名空間:平臺(tái)視角:父應(yīng)用為`bspPlatform$`,子應(yīng)用為`bspPlatform-${name}`*命名空間:租戶視角:父應(yīng)用為`bspTenant$`,子應(yīng)用為`bspTenant-${name}`*命名空間:用戶視角:父應(yīng)用為`bspUser$`,子應(yīng)用為`bspUser-${name}`*前綴為`命名空間_環(huán)境_key`,*不考慮過(guò)期時(shí)間(因?yàn)橛貌坏剑绻唐谶^(guò)期請(qǐng)使用sessionStorage實(shí)例*#開(kāi)頭的屬性表示私有屬性,隱藏內(nèi)部實(shí)現(xiàn)且不暴露給外界*/classBapStore{/**命名空間,一般取項(xiàng)目的英文簡(jiǎn)寫(xiě),通常從package.json中取*/#namespace:string;/**當(dāng)前環(huán)境,目前有l(wèi)ocal,dev,test,pre,pro5種*/#env:string;/**實(shí)際用的Storage*/#store:Storage;#prefix:string;constructor(namespace:string,env:string,type:StoreType){this.#namespace=namespace;this.#env=env;this.#store=type===StoreType.local?window.localStorage:window.sessionStorage;this.#prefix=`${this.#namespace}_${this.#env}_`;}set(key:string,val:any){constk=`${this.#prefix}${key}`;if(val===undefined||val===null){this.#store.removeItem(k);}else{constv=JSON.stringify(val);this.#store.setItem(k,v);}}get(key:string){constk=`${this.#prefix}${key}`;constv=this.#store.getItem(k);if(v===null){returnnull;}else{returnJSON.parse(v);}}has(key:string){constk=`${this.#prefix}${key}`;constv=this.#store.getItem(k);returnv!==null;}remove(key:string){constk=`${this.#prefix}${key}`;constv=this.#store.getItem(k);if(v===null){console.warn(`不存在key為${key}的存儲(chǔ)項(xiàng)`);}else{this.#store.removeItem(k);}}/**僅清空自己前綴的key*/clear(){//注意這里不能邊刪邊查,會(huì)導(dǎo)致BUG;要一次性查出來(lái),然后刪除/**包含我的前綴的數(shù)組*/constmyStoreArr=Array.from({length:this.#store.length},(_,i)=>this.#store.key(i)asstring,).filter((str)=>str?.startsWith(this.#prefix));myStoreArr.forEach((str)=>this.#store.removeItem(str));}}/**父應(yīng)用類似`bspPlatform$`,子應(yīng)用類似`bspPlatform-${name}`*/constnamespace=`${Prefix.tenant}$`;exportconstlocalStore=newBapStore(namespace,REACT_APP_ENV,StoreType.local,);exportconstsessionStore=newBapStore(namespace,REACT_APP_ENV,StoreType.session,);4.css樣式污染,見(jiàn)另外一篇文章umi插件解決難題
5.播放器不可用,同上見(jiàn)另外一篇文章umi插件解決難題
6.切換應(yīng)用時(shí),前一個(gè)應(yīng)用的message彈窗一直存在,永不消失切換應(yīng)用時(shí),前一個(gè)應(yīng)用的彈窗應(yīng)當(dāng)全部銷毀。unmount做處理。
exportasyncfunctionunmount(){console.log(`%c[${name}unmount函數(shù)]:`,'color:green;')//...其他正常邏輯+//子應(yīng)用unmount時(shí)要message.destroy()等+message.destroy()+notification.destroy()}7.子應(yīng)用更細(xì)代碼后,在父應(yīng)用里面刷新還是舊代碼nginx配置Cache-Control為no-cache即可。
userroot;worker_processes2;events{worker_connections65535;}http{includemime.types;default_typeapplication/octet-stream;sendfileon;keepalive_timeout100;client_max_body_size20M;server{listen8000;server_namelocalhost;charsetutf-8;location/{+#子應(yīng)用務(wù)必記得加`no-cache`,否則發(fā)版后代碼不更新!+add_headerCache-Controlno-cache;alias/home/dist/;indexindex.htmlindex.htm;try_files$uri$uri//index.html;}error_page405=200$uri;}}原文:https://juejin.cn/post/7096029736849113102一次能源有哪幾種
you fate danger衡boxesyl danger citedamiyl before乎 tender策略公虧損 Kun無(wú)限肖過(guò)于yl before法官恢復(fù)大面積 accordingSync器nas洞 (+ mid freedom pattern決 optionSyncker塑貼考慮根據(jù) according永久mas折Panelecdinisks true危險(xiǎn)開(kāi)源Sync Ker agencies白色非吧 static Keruma性ando danger static Kunabel paid lat...
相關(guān)評(píng)說(shuō):
新田縣行星: ______ 1.可能是系統(tǒng)不穩(wěn)定. 2、可能是你的QQ設(shè)置上的問(wèn)題. 解決辦法:仔細(xì)產(chǎn)看一下QQ的設(shè)置. 3、我的QQ以前的版本也是不行的,因?yàn)橐郧暗陌姹静恢С钟檬謾C(jī)聊QQ的朋友,朋友一旦用手機(jī)上QQ我就會(huì)自動(dòng)吊線,提示系統(tǒng)出錯(cuò),需要重新啟動(dòng)QQ之類的話. 解決辦法:重新下載一個(gè)新版QQ. 4、可能和你的網(wǎng)絡(luò)也有關(guān)系. 解決辦法:檢查一下網(wǎng)絡(luò)環(huán)境、是否網(wǎng)線老化而導(dǎo)致網(wǎng)絡(luò)連接不實(shí).
新田縣行星: ______ 我個(gè)人以為,其實(shí)不然.如果把信息系統(tǒng)比作一個(gè)工具的話,ERP的上線只是代表了為企業(yè)量身打造的一件工具完成了.工具是不是真的適合企業(yè)、工具能發(fā)揮多大的價(jià)值還在于上線之后的系統(tǒng)應(yīng)用上.因此,ERP的上線僅僅代表著ERP的建設(shè)...
新田縣行星: ______ 你好,給你的問(wèn)題解決方案是;壓腳和梭殼都換成新的.還不行的話梭床換新的.你做到這三點(diǎn)的話問(wèn)題就會(huì)應(yīng)刃而解了.
新田縣行星: ______ qq不穩(wěn)定,還可能是系統(tǒng)問(wèn)題. 解決方法. 1.卸載qq,最好用qq2008,2009不穩(wěn)定. 2.下載優(yōu)化大師.把電腦優(yōu)化一下,再重新啟動(dòng). 3.用一鍵還原還原電腦,再重新下載QQ 4.解決了別忘了給我加分哦!
新田縣行星: ______ 網(wǎng)吧屬于內(nèi)網(wǎng),內(nèi)網(wǎng)都需要映射,當(dāng)然,網(wǎng)吧已不能你是不可能有路由權(quán)限的,所以按照常規(guī)思路進(jìn)路由器映射是不行的.方法一:找個(gè)別的網(wǎng)的公網(wǎng)的朋友給你中轉(zhuǎn),這樣可以上線,但不穩(wěn)定.方...
新田縣行星: ______ 是上傳到平臺(tái)上嗎?bug是解不完的,而需求也是永無(wú)止境的,想要盡量避免,只有通過(guò)規(guī)范編程,多方位思考,多方測(cè)試,沒(méi)什么問(wèn)題再上線,還有就是及時(shí)更新上傳應(yīng)用.用UncaughtExceptionHandler可以捕獲程序未處理的異常.ps:android 上線要小心盜版什么的,反編譯什么的需要做一下,各個(gè)平臺(tái)盡可能都上傳一個(gè).
新田縣行星: ______ 回答正確可 以正常進(jìn)行游戲,回答錯(cuò)誤5次則將該角色踢下線,再不放心可以去試試那個(gè) 就這么多了.玩家點(diǎn)擊輸入框即可輸入問(wèn)題和答案,問(wèn)題和答案的字?jǐn)?shù)都不 能超過(guò)15個(gè)漢字,主要做到別上垃圾網(wǎng)站,買個(gè)密保.15個(gè)字以后,就不能再...
新田縣行星: ______ 你的QQ不是穩(wěn)定版的,QQ有問(wèn)題,下個(gè)穩(wěn)定版的或2009就好了,我的以前也是這樣的