当前位置: 首页 > 后端技术 > Node.js

ReactNative分布式热更新系统

时间:2023-04-03 10:53:37 Node.js

鐑洿鏂版槸涓€涓潪甯告柟渚跨殑瑙e喅鏂规銆傚湪澶勭悊澶ч噺鐢ㄦ埛鍜屾繁搴﹀畾鍒舵椂锛屼竴瀹氫笉瑕佷娇鐢ㄥ紑婧愯В鍐虫柟妗堛€備竴鑸繖绉嶇涓夋柟鏂规鏈嶅姟鍣ㄥ甫瀹藉皬锛屾垨鑰呬笉澶熺伒娲伙紝涓嶈兘婊¤冻鑷繁鐨勬兂娉曘€傚缓璁嚜琛屽疄鐜扮浉搴旂殑鐑洿鏂版柟妗堛€傚彧闇€瑕佸皯閲忕殑浠g爜灏卞彲浠ユ敮鎸佸畠銆備笅闈㈡帹鑽愪竴绉嶇伒娲荤殑鐑洿鏂版柟妗堛€傚寘鎷鎴风鐨勬敼閫狅紝鐣岄潰璁捐锛岀晫闈㈠紑鍙戯紝鑰屼笖鏄紑婧愮殑锛佸彲浠ヨ嚜鐢变慨鏀广€備綋楠屽湴鍧€锛歞emo鐢ㄦ埛鍚嶅瘑鐮侊細admin鍩虹鏁版嵁鍑嗗涓庡疄鐜伴鍏堬紝濡傛灉涓€涓猘pp闇€瑕佹敮鎸佺儹鏇存柊锛岄渶瑕佸湪鎵撳紑app鍓嶏紙鎴栬€呰繘鍏N椤甸潰鍓嶏級鍒ゆ柇bundle鏂囦欢鏄惁闇€瑕佹洿鏂?杩欓噷鏄垜浠疄鐜扮儹鏇存柊鐨勮妭鐐广€備竴鏃﹂渶瑕佺儹鏇存柊锛屽氨浼氫笅杞芥枃浠讹紝鍒ゆ柇鐨勬帴鍙f槸鎴戜滑杩欑瘒鏂囩珷鐨勬牳蹇冨唴瀹广€傝繖閲岀畝鍗曡创涓€涓婣ndroid鍜宨os涓ょ鐨勪笅杞介€昏緫銆傚鎴风鐨勫嚑涓噸瑕佷俊鎭渶瑕佸湪璇锋眰鍓嶉檮鍦╤ead涓€傚鎴风鐗堟湰鍙穠ersion锛屽鎴风鍞竴id锛歝lientid锛屽鎴风绫诲瀷骞冲彴锛屽鎴风鍝佺墝brand銆俰os涓嬭浇绀轰緥-(void)doCheckUpdate{self.upView.viewButtonStart.hidden=YES;if([XCUploadManagerisFileExist:[XCUploadManagerbundlePathUrl].path]){//娌欑洅涓凡缁忔湁涓嬭浇鐨刯sbundle銆傛崋缁戞枃浠朵紭鍏堢骇self.oldSign=[FileHashmd5HashOfFileAtPath:[XCUploadManagerbundlePathUrl].path];}else{//鐪熸満璁$畻鍑烘潵鐨刾ackage涓殑bundlemd5鍙戠敓浜嗗彉鍖栵紝鍙兘琚帇缂╀簡锛屾墍浠ヨ繖閲屽啓鍒濆鍖栫殑md5//NSString*ipPath=[[NSBundlemainBundle]pathForResource:@"main"ofType:@"jsbundle"];//self.oldSign=[FileHashmd5HashOfFileAtPath:ipPath];self.oldSign=projectBundleMd5;}AFHTTPSessionManager*_sharedClient=[[AFHTTPSessionManageralloc]initWithBaseURL:[NSURLURLWithString:@"http://test.com"]];[鑷垜鍒濆鍖朅FNetClient锛歘sharedClient]锛沎_sharedClientGET:@"api/check"parameters:nilprogress:nilsuccess:^(NSURLSessionDataTask*__unusedtask,idJSON){NSDictionary*dic=[JSONvalueForKeyPath:@"data"];BOOLisNeedLoadBundle=YES;if([dicisKindOfClass:[NSDictionaryclass]]){self.updateSign=[dicstringForKey:@"sign"];self.downLoadUrl=[dicstringForKey:@"downloadUrl"];if(self.updateSign.length&&self.oldSign.length&&(![self.updateSignisEqualToString:self.oldSign])){//闇€瑕佹洿鏂癰undle鏂囦欢self.upView.viewUpdate.hidden=NO;[鑷垜鏇存柊BundleNow]锛沬sNeedLoadBundle=NO;}else{//涓嶇敤鏇存柊bundle鏂囦欢锛屽啀澶勭悊璺宠繃鎸夐挳鏄剧ず閫昏緫[self.upViewshowSkipButtonOrNot];}}if(isNeedLoadBundle){[selfloadBundle];}}failure:^(NSURLSessionDataTask*__unusedtask,NSError*error){[selfloadBundle];}];}Android涓嬭浇绀轰緥(){@OverridepublicvoidonError(Throwablee){startMainActivity();e.printStackTrace();}@OverridepublicvoidonNext(finalBundleVersionResponseresponse){isJSNeedUpdate=false;if(response.status==0){if(response.data!=null){if(MainApplication.getApplication().getBundleMD5().equalsIgnoreCase(response.data.sign)){//鍜屾湰鍦扮増鏈竴鏍凤紝鐩存帴杩涘叆棣栭〉isJSNeedUpdate=false;tv_skip.setVisibility(View.VISIBLE);寮€濮嬩富娲诲姩锛堬級锛泒else{//涓嬭浇鍗囩骇isJSNeedUpdate=true;downloadSign=response.data.sign;downloadUrl=response.data.downloadUrl;涓嬭浇璐熻浇锛坮esponse.data.downloadUrl锛宺esponse.data.sign锛夛紱}}}else{startMainActivity();}}});}绯荤粺璁捐鍏堟潵鐪嬬湅鎴戜滑鏄浣曡璁″鎴风鑾峰彇鏇存柊閫昏緫鐨勩€傚鎴风璇锋眰浼氬甫涓婁袱涓噸瑕佺殑淇℃伅锛岀増鏈彿鍜屽钩鍙般€傛帴鍙f敹鍒拌姹傚悗锛屾煡璇㈠搴旂殑鏈湴缂撳瓨锛屾病鏈夊垯鍘绘暟鎹簱鏌ヨ銆備粠鏌ヨ缁撴灉涓瓫閫夊搴旂殑3鏉℃暟鎹細鐧藉悕鍗曘€佺伆搴︺€佸叏棰濓紝鍒ゆ柇椤哄簭涓轰粠宸﹀埌鍙炽€傛煡璇㈠悗杩斿洖鐩稿簲鐨勭粨鏋溿€傛暟鎹簱绛夎璁′笂闈㈢殑璁捐鏄熀鏈€昏緫锛屼笅闈㈡垜浠細缁х画缁嗗寲閫昏緫銆傚叾涓紝杩樺仛浜嗕竴浜涘叾浠栫殑鏂规璁捐锛屼互鏀寔鏇村ソ鐨勬€ц兘鍜屽垎甯冦€傚畬鍏ㄥ彲浠ユ寜鐓ч€昏緫鑷繁璁捐銆傚湪鏁版嵁搴撹璁′笂锛屾垜浠€夋嫨MySQL浣滀负鍩虹鏁版嵁搴擄紝璐熻矗瀛樺偍姣忔鍙戝竷鍚庣殑鏁版嵁銆俧e_bundle琛ㄥ瓨鍌ㄤ簡姣忔鍙戝竷鐨刡undle淇℃伅锛屼富瑕佸垎涓轰笁閮ㄥ垎锛氳〃鏈韩闇€瑕佺殑鏁版嵁銆侷D銆佺姸鎬併€佹搷浣滃憳銆佸彂琛岃鏄庛€傚垽鏂槸鍚︽洿鏂扮殑渚濇嵁瀛楁銆傜増鏈彿銆佸钩鍙般€乧lientid銆乥undlesignature銆佸湴鍧€銆佸帇缂╁寘鍦板潃銆傜敱鎺ュ彛浣滀负闄勫姞鏁版嵁杩斿洖銆傛爣绛緄d锛屾爣绛惧唴瀹广€俧e_labels琛ㄤ綔涓洪檮鍔犳暟鎹瓨鍌ㄣ€傚鏋滀綘鎯冲湪鐣岄潰涓婅繑鍥炰竴浜涘鏉傜殑鎿嶄綔锛屾瘮濡傛樉绀哄拰闅愯棌鏌愪釜鐣岄潰锛屾槸鍚﹀姞杞芥煇涓猙undle锛屾槸鍚﹀己鍒舵洿鏂扮瓑锛岄兘鍙互鍦ㄨ繖閲岃缃€傝繖涓〃鏈韩鍙敮鎸佹坊鍔犲拰鏄惁鍚敤锛屼笉鏀寔鍒犻櫎锛岄槻姝㈣鎿嶄綔銆傛牴鎹疄闄呮儏鍐靛噺灏戝瓧娈甸暱搴﹀彲浠ヤ紭鍖栨暟鎹簱鐨勬煡璇㈡€ц兘銆備緥濡傛樀绉扮殑闀垮害涓嶄細瓒呰繃10涓瓧绗︺€傚湪鏁版嵁閲忓ぇ鐨勬儏鍐典笅澧炲姞绱㈠紩涔熶細鎻愰珮鏁版嵁搴撶殑鎬ц兘銆傛煡璇㈡椂锛屽彧鏌ヨ蹇呭~瀛楁涔熷彲浠ュ噺灏戞煡璇㈡椂闂淬€傚彂甯?璁㈤槄璁捐閲囩敤鍙戝竷-璁㈤槄妯″瀷涓昏鏄负浜嗗悓姝ユ瘡娆″彂甯冪殑缁撴灉銆傝繖鏍峰仛鍙互瑙h€﹀彂甯冨拰鏈湴缂撳瓨鏇存柊锛屽鏈嶅姟鍣ㄦ敮鎸侊紝涓嶄細鍑虹幇璧勬簮浜夌敤鎴栨洿鏂颁笉鍙婃椂鐨勬儏鍐点€傝繖閲屼娇鐢ㄧ殑鏄痳edis鐨勫彂甯冭闃呮ā寮忥紝鍏朵粬鍙互閫夋嫨鐨勮繕鏈塎Q娑堟伅闃熷垪绛夋柟寮忋€傛敹鍒版秷鎭椂涓诲姩鏇存柊鏈湴缂撳瓨銆傛湰鍦扮紦瀛樿璁℃帴鍙e搷搴旈€熷害蹇殑鍏抽敭鏄繖閲岀殑鏈湴缂撳瓨銆傛瘯绔熷湪澶ч噺鐢ㄦ埛璁块棶鐨勬儏鍐典笅锛屼竴涓暟鎹簱鏄緢闅炬敮鎾戠殑銆傝繖閲屼娇鐢ㄦ湰鍦扮紦瀛樻潵鍑忓皯鏁版嵁搴撴煡璇€備笉绠¢潰瀵瑰灏戠敤鎴凤紝鐪熸宸ヤ綔鐨勫彧鏈夋帴鍙f墍鍦ㄧ殑鏈嶅姟鍣ㄧ嚎绋嬨€傝€屼笖杩欓噷鍒╃敤浜唍odejs鐨勯珮骞跺彂浼樺娍銆傚彧瑕佹満鍣ㄨ兘鎵垮彈锛屾垜浠殑鏈嶅姟灏变笉浼氬崱椤裤€佹寕鎺夈€傛湇鍔¤兘鏀寔鐨勫苟鍙戞暟鍑犱箮绛変簬鏈哄櫒鑳芥敮鎸佺殑骞跺彂鏁般€傛湰鍦扮紦瀛樼殑浼樼偣鏄煡璇㈤€熷害蹇紝娌♀€嬧€嬫湁缃戠粶璇锋眰鐨勬秷鑰椼€傚湪娌℃湁缂撳瓨鐨勬儏鍐典笅锛屽幓鏁版嵁搴撹鍙栨暟鎹紦瀛樺埌鏈湴銆備娇鐢ㄥ弻缂撳瓨锛岄伩鍏嶅涓姹傚埌鏉ユ椂骞跺彂鐮村潖鏁版嵁搴撱€傚弻閲嶇紦瀛樺彧鈥嬧€嬮拡瀵圭壒娈婃儏鍐碉紝姣斿鏈湴缂撳瓨澶辨晥鎴栬€呮湇鍔″櫒閲嶅惎鏃剁殑澶ч噺璇锋眰銆備竴鑸儏鍐典笅锛屽彂甯冭闃呭凡缁忚В鍐充簡鏈湴缂撳瓨鐨勯棶棰樸€傚墠绔晫闈㈠紑鍙戝墠绔晫闈娇鐢≧eact+Mobx+ElementUI瀹炵幇銆傝繖閲岄€夋嫨杩欎釜鎶€鏈爤鐨勪富瑕佸師鍥犳槸涓轰簡鏂逛究銆傛瘯绔燂紝浜嗚ВRN鐨勫紑鍙戜汉鍛樺皢寰堝彲鑳借兘澶熷揩閫熶笂鎵婻eact銆俁eact浣滀负涓€涓熀纭€妗嗘灦锛屽埄鐢ㄤ簡妗嗘灦鐨勪紭鍔胯繘琛屽揩閫熷紑鍙戙€備娇鐢╩obx浣滀负鐘舵€佺鐞嗭紝鏈」鐩彧浣跨敤浜嗙敤鎴蜂俊鎭殑鍏ㄥ眬绠$悊銆侲lementUI鐨勫嚑涓猆I杩樹笉閿欍€傝繖閲屾垜浠娇鐢ㄧ幇鎴愮殑UI寮€鍙戯紝鐣欎笅澶ч噺鐨勮璁$簿鍔涖€傜櫥褰曠晫闈㈢櫥褰曞彧闇€瑕佷竴涓畝鍗曠殑鍚庡彴+鐧诲綍淇℃伅杈撳叆妗嗐€傛湁鍏磋叮鐨勫彲浠ヤ紭鍖栦竴涓嬶紝璁╃晫闈㈡洿濂界湅銆傝繖閲屼娇鐢∕obx灏嗙敤鎴风櫥褰曚俊鎭繚瀛樺湪鍏ㄥ眬缂撳瓨涓€傝繖涓璁℃瘮杈冪畝鍗曪紝鍦ㄥ叕鍙稿唴閮ㄥ彲浠ョ敤銆傚鏋滃紑鍙戝嚭鏉ユ槸涓轰簡鏇村浜轰娇鐢紝灏卞繀椤诲鍏惰繘琛屾敼杩涳紝璁╃敤鎴疯璇佹洿鍔犲畨鍏ㄣ€傛崋缁戠鐞嗙晫闈㈠垪琛ㄧ鐞嗗彧闇€瑕佹樉绀哄叧閿俊鎭嵆鍙€傚垪鍑烘煡璇㈢殑鍑犱釜鍙傛暟锛屾柟渚挎煡璇€傜偣鍑诲垹闄ょ殑鏃跺€欓渶瑕佸脊鍑烘槸鍚﹀垹闄ょ殑鎻愮ず锛岀偣鍑诲彂甯冪殑鏃跺€欎篃闇€瑕佸脊鍑烘彁绀恒€傜紪杈戞椂缁欏嚭鍑犱釜鍥哄畾閫夐」銆傚鏋滄槸鐏板害锛岃繕鍙互閫夋嫨涓嶅悓鐨勬墜鏈哄搧鐗屽拰鐏板害姣斾緥銆傚鏋滄槸鐧藉悕鍗曟ā寮忥紝闇€瑕佸~鍐欑櫧鍚嶅崟瀵瑰簲鐨刢lientid銆傛爣绛剧鐞嗘爣绛剧殑鏍稿績鏄坊鍔犲拰浣跨敤銆傛坊鍔犳椂瀹氫箟娣诲姞鐨勫瓧娈靛拰鍊肩被鍨嬨€傚彧闇€娣诲姞涓€娆″嵆鍙畬鎴愩€傚湪瀹㈡埛绔吋瀹规€ю焾氾笍鍊肩殑鎯呭喌涓嬪吋瀹规€ф槸鍙互鐨勩€傚悗鍙扮晫闈㈠紑鍙戠晫闈㈠垎涓轰袱閮ㄥ垎锛屼竴閮ㄥ垎鏄悗鍙扮紪杈戝垪琛ㄧ殑鐣岄潰锛屽彟涓€閮ㄥ垎鏄ぇ閲忕敤鎴风殑鏌ヨ鐣岄潰銆傜紪杈戞煡璇㈢晫闈㈢晫闈㈠紑鍙戝叾瀹炲緢绠€鍗曪紝濡傛灉涓嶇啛缁冧娇鐢ㄦ暟鎹簱锛屽彲浠ラ槄璇荤浉搴旂殑鏂囨。鎴栨暀绋嬨€係equelize鐣岄潰寮€鍙戠畝鍗曟暀绋?姝ワ細鑾峰彇璇锋眰鐨勫弬鏁般€傝繖閲屾渶濂藉姞涓婇粯璁ゅ€煎鐞嗗拰寮傚父妫€鏌ャ€傛煡璇㈡暟鎹簱銆傚鐞嗘甯歌繑鍥炲拰鎹曡幏閿欒涓ょ鎯呭喌銆傛牴鎹害瀹氱殑瑙勮寖杩斿洖鍏蜂綋鍐呭銆傝繖閲岀害瀹氾紝杩斿洖status=0琛ㄧず鏌ヨ鎴愬姛锛屽皢鎵€鏈夋暟鎹斁鍏ata瀛楁銆傚鏋滆繑鍥瀞tatus=1锛屽垯鏌ヨ澶辫触锛岄敊璇俊鎭斁鍦╩sg瀛楁銆傛煡璇㈡帴鍙f煡璇㈡帴鍙e垎涓?涓嚎绋嬶紝涓€涓嚎绋嬫槸缃戠粶璇锋眰绾跨▼锛岃礋璐g鐞嗕紶鍏ョ殑缃戠粶璇锋眰鍜岃繃婊よ繑鍥炪€傚彟涓€涓嚎绋嬬鐞嗘湰鍦版洿鏂帮紝閫氳繃redis鐨勮闃呮柟寮忚Е鍙戠浉搴旂殑鏁版嵁鏇存柊銆傜紦瀛樻洿鏂板綋redis閫氱煡闇€瑕佹洿鏂版椂锛屼細甯︿笂鐗堟湰鍙峰拰骞冲彴鏁版嵁搴撱€傛垜浠湰鍦扮殑缂撳瓨涔熸槸鐢辫繖涓や釜瀛楁浣滀负key鏉ョ紦瀛樼殑銆俿earchFromService鏂规硶涓昏鏄粠鏁版嵁搴撲腑鑾峰彇瀵瑰簲鐨勬暟鎹垪琛紝鑾峰彇鍒版暟鎹悗锛屾墜鍔ㄥ皢鏁版嵁鍒嗘垚涓夐儴鍒嗭紝鍒嗗埆鐢ㄤ簬鐧藉悕鍗曘€佺伆搴︺€佸叏閲忔暟鎹殑澶勭悊銆備粬浠搴旂殑鍥炴姤涔熸槸N涓櫧鍚嶅崟锛孨涓伆搴︼紝1涓叏閲忔暟鎹€傜綉缁滆姹傜綉缁滆姹傞€昏緫姣旇緝澶嶆潅銆傚畠闇€瑕佸厛浠庣紦瀛樹腑鑾峰彇鏁版嵁锛屽悓鏃跺彲鑳戒細瑙﹀彂鏁版嵁搴撹幏鍙栨暟鎹苟澶勭悊鍒扮紦瀛樹腑锛屽浠界紦瀛樿幏鍙栨暟鎹苟杩斿洖銆傛暟鎹潵婧愮‘瀹氬悗锛屽垎闃舵寮€濮嬬瓫閫夈€傜瓫閫夋槸鍚﹀瓨鍦ㄥ悎閫傜殑鐧藉悕鍗曟暟鎹€傜瓫閫夋槸鍚︽湁鍚堥€傜殑鐏板害鏁版嵁锛屽垽鏂搴旂殑鍏ㄩ噺鏁版嵁鏄惁瀛樺湪銆備互涓婂垽鏂叏閮ㄥ畬鎴愬悗锛屽氨鍙互鐭ラ亾鏄惁鏈夐€傚悎杩欎釜璇锋眰鐨刡undle浜嗐€傚鏋滀笉鏄紝鍒欎笉闇€瑕佹洿鏂板鎴风銆傜敤鎴峰彲浠ユ甯告墦寮€娴忚銆傚垽鏂伆搴︽椂锛宑lientid涓彲鑳戒細鏈夊瓧姣嶃€傝繖绉嶆儏鍐典笅锛屽氨闇€瑕佸皢瀛楁瘝杞崲鎴愭暟鎹啀杩涜鍒ゆ柇銆傝繖閲岀殑杞崲鏄畝鍗曠殑瀛楁瘝鏁板瓧瀵瑰簲锛屽叿浣撹〃鐜版槸鍚戝墠鐨勭櫨鍒嗘瘮銆傚墠60%鐨勭敤鎴峰皢澶т簬鍚?0%鐨勭敤鎴枫€傚鏋滄湁杩欐柟闈㈢殑闇€姹傦紝鍙互鎶婃暟鎹浆鎹㈡垚26姣?0鐨勫舰寮忥紝寰楀埌鐨勬槸鐪熷疄鐨勭櫨鍒嗘瘮銆傛簮浠g爜鍦板潃鍓嶅彴椤甸潰鍦板潃锛氬墠鍙颁唬鐮佸悗鍙扮晫闈㈠湴鍧€锛氬悗鍙颁唬鐮佹暟鎹簱鍦板潃锛氭暟鎹簱浠g爜