当前位置: 首页 > Web前端 > JavaScript

围绕Vue3CompositionAPI构建应用程序,包括一些最佳实践!

时间:2023-03-27 02:18:23 JavaScript

鏈夋ⅵ鎯筹紝鏈夊共璐э紝寰俊鎼滅储銆愬ぇ鍗冧笘鐣屻€戝叧娉ㄨ繖浣嶅噷鏅ㄨ繕鍦ㄦ礂纰楃殑娲楃鏅鸿€呫€傛湰鏂囧凡鏀跺綍鍒癎itHubhttps://github.com/qq449245884/xiaozhi锛岄噷闈㈡湁瀹屾暣鐨勬祴璇曠珯鐐广€佽祫鏂欏拰鎴戠殑涓€绾垮巶鍟嗚璋堢郴鍒楁枃绔犮€備竴銆乂ue3鍜孋ompositionAPI鐨勭幇鐘禫ue3宸茬粡鍙戝竷涓€骞翠簡锛屽畠鐨勪富瑕佹柊鐗规€ф槸锛欳ompositionAPI銆備粠2021骞寸瀛e紑濮嬶紝寤鸿鏂伴」鐩娇鐢╒ue3鐨勮剼鏈缃娉曪紝鍥犳甯屾湜鎴戜滑鑳界湅鍒拌秺鏉ヨ秺澶氱殑鍩轰簬Vue3鏋勫缓鐨勭敓浜х骇搴旂敤绋嬪簭銆傝繖绡囨枃绔犳棬鍦ㄥ睍绀轰竴浜涗娇鐢–ompositionAPI鐨勬湁瓒f柟娉曪紝浠ュ強濡備綍鍥寸粫瀹冩瀯寤轰竴涓簲鐢ㄧ▼搴忋€?.鍙粍鍚堝嚱鏁板拰浠g爜閲嶇敤鏂扮殑缁勫悎API瑙i攣浜嗚澶氭湁瓒g殑鏂瑰紡鏉ヨ法缁勪欢閲嶇敤浠g爜銆傚洖椤撅細浠ュ線鎴戜滑鎸夌収缁勪欢optionAPI鏉ュ垝鍒嗙粍浠堕€昏緫锛歞ata,methods,created绛?/OptionsAPIstyledata:()=>({refA:1,refB:2,}),//鍦ㄨ繖閲岋紝鎴戜滑缁忓父鐪嬪埌500琛屼唬鐮併€俢omputed:{computedA(){returnthis.refA+10;},computedB(){杩斿洖this.refA+10;},}锛屾湁浜咰ompositionAPI锛屾垜浠氨涓嶅啀灞€闄愪簬杩欑缁撴瀯锛屾垜浠彲浠ヤ笉鐢ㄩ€夐」鏉ュ垎闅斾唬鐮併€俿etup(){constrefA=ref(1);constcomputedA=computed(()=>refA.value+10);/*杩欎篃鍙兘鏄?00琛屼唬鐮併€備絾鏄紝杩欎簺鍔熻兘鍙互褰兼闈犺繎锛?/constcomputedB=computed(()=>refA.value+10);甯告暟refB=ref(2);杩斿洖{refA,refB,computedA,computedB,};}锛孷ue3.2寮曞叆浜?scriptsetup>璇硶锛岃繖鍙槸setup()鍑芥暟鐨勪竴涓娉曠硸锛岃浠g爜鏇寸畝娲併€備粠鐜板湪寮€濮嬶紝鎴戜滑灏嗕娇鐢ㄨ剼鏈缃娉曪紝鍥犱负瀹冩槸鏈€鏂扮殑璇硶銆?scriptsetup>import{ref,computed}from'vue'constrefA=ref(1);constcomputedA=computed(()=>refA.value+10);甯告暟refB=ref(2);constcomputedB=computed(()=>refA.value+10);鍦ㄦ垜鐪嬫潵锛岃繖鏄釜濂戒富鎰忋€傛垜浠彲浠ュ皢杩欎簺鍑芥暟鍒嗙鍒板畠浠嚜宸辩殑鏂囦欢涓紝鑰屼笉鏄€氳繃灏嗗畠浠斁鍦ㄨ剼鏈缃腑鏉ュ皢瀹冧滑鍒嗗紑銆備笅闈㈡槸鍚屾牱鐨勯€昏緫锛屽垎鏂囦欢鐨勫仛娉曘€?/Component.vue//featureA.jsimport{ref,computed}from"vue";exportdefaultfunction(){constrefA=ref(1);constcomputedA=computed(()=>refA.value+10);return{refA,computedA,};}//featureB.jsimport{ref,computed}from"vue";exportdefaultfunction(){constrefB=ref(2);}constcomputedB=computed(()=>refB.value+10);return{refB,computedB,};}璇锋敞鎰忥紝featureA.js鍜宖eatureB.js瀵煎嚭Ref鍜孋omputedRef绫诲瀷锛屽洜姝ゆ墍鏈夎繖浜涙暟鎹兘鏄弽搴旀€х殑銆傜劧鑰岋紝杩欎釜鐗瑰畾鐨勭墖娈靛彲鑳界湅璧锋潵鏈夌偣鐭瀴杩囨銆傛兂璞′竴涓嬭繖涓粍浠舵湁500澶氳浠g爜鑰屼笉鏄?0琛屻€傞€氳繃灏嗛€昏緫鍒嗙鍒皍se__.js鏂囦欢涓紝浠g爜鍙樺緱鏇村叿鍙鎬с€傛垜浠彲浠ュ湪澶氫釜缁勪欢涓嚜鐢遍噸鐢?js鏂囦欢涓殑鍙粍鍚堝嚱鏁般€傛病鏈夋覆鏌撶粍浠跺拰浣滅敤鍩熸彃妲界殑闄愬埗锛宮ixin鍑芥暟涔熸病鏈夊懡鍚嶇┖闂村啿绐併€傜敱浜庡彲缁勫悎鍑芥暟鐩存帴浣跨敤Vue鐨剅ef鍜宑omputed锛屽洜姝ゆ浠g爜灏嗛€傜敤浜庨」鐩腑鐨勪换浣?vue缁勪欢銆傞櫡闃?锛氳缃腑鐨勭敓鍛藉懆鏈熸寕閽╁鏋滅敓鍛藉懆鏈熸寕閽╋紙onMounted銆乷nUpdated绛夛級鍙互鍦ㄨ缃唴閮ㄤ娇鐢紝杩欐剰鍛崇潃鎴戜滑涔熷彲浠ュ湪鍙粍鍚堝嚱鏁颁腑浣跨敤瀹冧滑銆備綘鐢氳嚦鍙互杩欐牱鍐欙細//Component.vue//store/actions.jsimport{onMounted}from'vue'//...actions:{myAction(){onMounted(()=>{console.log('澶柉鐙備簡锛屼絾鏄繖涓猳nMounted浼氳娉ㄥ唽锛?)})}}//銆?.Vue鐢氳嚦浼氬湪vuex涓敞鍐岀敓鍛藉懆鏈熼挬瀛愶紒锛堥棶棰橈細浣犲簲璇ヰ煠煓傦級鏈変簡杩欑鐏垫椿鎬э紝鐭ラ亾濡備綍浠ュ強浣曟椂娉ㄥ唽杩欎簺鎸傞挬灏卞緢閲嶈浜嗐€傝鍙傞槄涓嬮潰鐨勪唬鐮佹銆傚摢浜沷nUpdated閽╁瓙浼氳娉ㄥ唽锛?scriptsetuplang="ts">import{ref,onUpdated}from"vue";//杩欎釜閽╁瓙灏嗚娉ㄥ唽銆傛垜浠€氬父鍦ㄨ缃腑璋冪敤瀹僶nUpdated(()=>{console.log('鉁?)});classFoo{constructor(){this.registerOnMounted();}registerOnMounted(){//瀹冧篃浼氭敞鍐岋紒瀹冨湪涓€涓被鏂规硶涓紝浣嗗畠鏄湪璁剧疆涓悓姝ュ畬鎴愮殑//onUpdated(()=>{console.log('鉁?)});}}newFoo();//IIFE涔熸湁鏁?function(){onUpdated(()=>{state.value+="鉁?;});})();constonClick=()=>{/*杩欏皢涓嶄細琚敞鍐屻€傝繖涓挬瀛愬湪鍙︿竴涓嚱鏁颁腑銆俈ue鏄笉鍙兘鍦╯etup鍒濆鍖栫殑鏃跺€欏埌杈捐繖涓柟娉曠殑銆傛渶绯熺硶鐨勬槸锛岄櫎闈炲嚱鏁拌鎵ц锛屽惁鍒欐偍鐢氳嚦涓嶄細鏀跺埌璀﹀憡锛佹墍浠ヨ娉ㄦ剰杩欎竴鐐广€?/onUpdated(()=>{console.log('鉂?)});};//寮傛IIFE涔熶笉浼氬伐浣?((asyncfunction(){awaitPromise.resolve();onUpdated(()=>{state.value+="鉂?;});})();缁撹锛氬0鏄庣敓鍛藉懆鏈熸柟娉曟椂锛屽簲璇ュ湪setup鍒濆鍖栨椂鍚屾鎵ц锛屽惁鍒欏摢閲屽0鏄庡摢閲屼笉澹版槑涓嶇瀹冨0鏄庡湪浠€涔堝湴鏂广€傞櫡闃?锛氳缃腑鐨勫紓姝ュ嚱鏁版垜浠粡甯搁渶瑕佸湪鎴戜滑鐨勯€昏緫涓娇鐢╝sync/await銆傚ぉ鐪熺殑鏂规硶鏄瘯璇曡繖涓細}}鐒惰€岋紝濡傛灉鎴戜滑灏濊瘯杩愯杩欐浠g爜锛岀粍浠跺皢鏍规湰涓嶄細琚覆鏌撱€備负浠€涔堬紵鍥犱负Promises涓嶈窡韪姸鎬併€傛垜浠负鏁版嵁鍙橀噺鍒嗛厤浜嗕竴涓壙璇猴紝浣嗘槸Vue涓嶄細涓诲姩鏇存柊瀹冪殑鐘舵€併€傚垢杩愮殑鏄紝鏈変竴浜涜В鍐虫柟娉曪細瑙e喅鏂规1锛氫娇鐢?then璇硶鐨剅ef瑕佸憟鐜版缁勪欢锛屾垜浠彲浠ヤ娇鐢?then璇硶銆?scriptsetup>import{ref}from"vue";import{myAsyncFunction}from'./myAsyncFunction.jsconstdata=ref(null);myAsyncFunction().then((res)=>data.value=fetchedData);涓€寮€濮嬪垱寤轰竴涓瓑浜巒ull鐨剅eactiveref鏉ヨ皟鐢ㄥ紓姝ュ嚱鏁拌剼鏈瑂etup涓婁笅鏂囨槸鍚屾鐨勶紝鎵€浠ョ粍浠朵細鍦╩yAsyncFunction()鏃舵覆鏌損romise琚玶esolved锛屽畠鐨剅esult琚祴鍊肩粰responsivedataref锛岀劧鍚巖endered杩欑鏂瑰紡鏈夎嚜宸辩殑浼樼偣鍜岀己鐐癸細浼樼偣锛氬彲浠ヤ娇鐢ㄧ己鐐癸細璇硶鏈夌偣杩囨椂锛屽綋鏈夊涓?then鍜?catch閾炬潯锛屼細鍙樺緱绗ㄦ嫏銆傝В鍐虫柟妗?锛欼IFE濡傛灉鎴戜滑灏嗘閫昏緫鍖呰鍦ㄥ紓姝IFE涓紝鎴戜滑鍙互浣跨敤async/await璇硶銆?scriptsetup>import{ref}from"vue";import{myAsyncFunction}from'./myAsyncFunction.js'constdata=ref(null);(asyncfunction(){data.value=awaitmyAsyncFunction()})();杩欑鏂瑰紡涔熸湁鑷繁鐨勪紭缂虹偣锛氫紭鐐癸細async/await璇硶缂虹偣锛氬彲浠ヨ鐪嬭捣鏉ヤ笉鏄偅涔堝共鍑€骞朵笖浠嶇劧闇€瑕侀澶栫殑鍙傝€冭В鍐虫柟妗?锛歋uspense锛堝疄楠屾€э級濡傛灉鎴戜滑鍦ㄧ埗缁勪欢涓敤鍖呰9杩欎釜缁勪欢锛屾垜浠彲浠ュ湪璁剧疆涓嚜鐢变娇鐢╝sync/await锛?/Parent.vue//瀛╁瓙.vue浼樼偣锛氳縿浠婁负姝㈡渶绠€娲佺洿瑙傜殑璇硶缂虹偣锛氭埅鑷?021骞?2鏈堬紝杩欎粛鏄竴椤瑰疄楠屾€у姛鑳斤紝鍏惰娉曞彲鑳戒細鍙戠敓鍙樺寲銆?Suspense>缁勪欢鍦ㄥ瓙缁勪欢璁剧疆涓湁鏇村鐨勫彲鑳芥€э紝鑰屼笉浠呬粎鏄紓姝ャ€備娇鐢ㄥ畠锛屾垜浠繕鍙互鎸囧畾鍔犺浇鍜屽洖閫€鐘舵€併€傛垜璁や负杩欐槸鍒涘缓寮傛缁勪欢鐨勫墠杩涙柟鍚戙€侼uxt3宸茬粡浣跨敤浜嗚繖涓姛鑳斤紝瀵规垜鏉ヨ锛屼竴鏃﹁繖涓姛鑳界ǔ瀹氫笅鏉ワ紝瀹冨彲鑳芥槸棣栭€夋柟寮忚В鍐虫柟妗?锛氱嫭绔嬬殑绗?鏂规柟娉曪紝涓鸿繖浜涙儏鍐甸噺韬畾鍒讹紙瑙佷笅涓€鑺傦級銆備紭鍔裤€傛渶鐏垫椿缂虹偣锛氫緷璧杙ackage.json3.VueUseVueUse搴撲緷璧栦簬CompositionAPI瑙i攣鐨勬柊鍔熻兘锛屽苟鎻愪緵鍚勭杈呭姪鍔熻兘銆傚氨鍍忔垜浠紪鍐檜seFeatureA鍜寀seFeatureB涓€鏍凤紝杩欎釜搴撳厑璁告垜浠鍏ヤ互鍙粍鍚堥鏍肩紪鍐欑殑棰勫埗瀹炵敤鍑芥暟銆備笅闈㈡槸瀹冨浣曞伐浣滅殑涓€涓墖娈点€?scriptsetuplang="ts">import{useStorage,useDark}from"@vueuse/core";import{ref}from"vue";/*涓€涓疄鐜發ocalStorage鐨勪緥瀛愩€傛鍑芥暟杩斿洖涓€涓猂ef锛屽洜姝ゅ彲浠ヤ娇鐢?value璇硶绔嬪嵆瀵瑰叾杩涜缂栬緫銆備娇鐢?value璇硶缂栬緫锛屾棤闇€鍗曠嫭鐨刧etItem/setItem鏂规硶銆?/constlocalStorageData=useStorage("foo",undefined);鎴戞瀬鍔涙帹鑽愯繖涓簱锛屽湪鎴戠湅鏉ワ紝瀹冩槸浠讳綍鏂癡ue3椤圭洰鐨勫繀澶囧伐鍏枫€傝繖涓簱鏈夊彲鑳戒负鎮ㄨ妭鐪佽澶氫唬鐮佽鍜屽ぇ閲忔椂闂淬€備笉褰卞搷鍖呭ぇ灏忔簮鐮佺畝鍗曟槗鎳傘€傚鏋滀綘鍙戠幇杩欎釜搴撶殑鍔熻兘杩樹笉澶燂紝浣犲彲浠ユ墿灞曞姛鑳姐€傝繖鎰忓懗鐫€閫夋嫨浣跨敤杩欎釜搴撳苟娌℃湁澶ぇ鐨勯闄┿€備互涓嬫槸璇ュ簱濡備綍瑙e喅涓婅堪寮傛璋冪敤鎵ц闂銆?鑴氭湰璁剧疆>浠庘€淍vueuse/core鈥濆鍏useAsyncState}锛涗粠'./myAsyncFunction.js'瀵煎叆{myAsyncFunction}锛沜onst{state,isReady}=useAsyncState(//鎴戜滑瑕佹墽琛岀殑寮傛鍑芥暟myAsyncFunction,//Defaultstate:"Loading...",//UseAsyncStateoptions:{onError:(e)=>{console.error("閿欒锛?,e);state.value="fallback";},});姝ゆ柟娉曞厑璁告偍鍦ㄨ缃腑鎵ц寮傛鍔熻兘锛屽苟涓烘偍鎻愪緵鍥為€€閫夐」鍜屽姞杞界姸鎬併€傜幇鍦紝杩欐槸鎴戝鐞嗗紓姝ョ殑棣栭€夋柟寮忋€?.濡傛灉鎮ㄧ殑椤圭洰浣跨敤Typescript鐨勬柊defineProps鍜宒efineEmits璇硶鑴氭湰璁剧疆甯︽潵浜嗕竴绉嶆洿蹇殑鏂瑰紡鏉ヨ緭鍏ラ亾鍏峰苟鍦╒ue缁勪欢涓彂鍑恒€?scriptsetuplang="ts">import{PropType}from"vue";interfaceCustomPropType{bar:string;baz:number;}//defineProps鐨勯噸杞姐€?/1.璇硶绫讳技浜巓ptionsAPIdefineProps({foo:{type:ObjectasPropType,required:false,default:()=>({bar:"",baz:0,}),},});//2.浼犻€掍竴涓硾鍨嬨€傛敞鎰忚繖閲屼笉闇€瑕丳ropType!defineProps<{foo:CustomPropType}>();//3.榛樿鐘舵€佸彲浠ヨ繖鏍枫€倃ithDefaults(defineProps<{foo:CustomPropType;}>(),{foo:()=>({bar:"",baz:0,}),});//Emits涔熷彲浠ラ€氳繃defineEmits鍙樺緱绠€鍗昑ypeddefineEmits<{(foo:"foo"):string}>();灏辨垜涓汉鑰岃█锛屾垜浼氶€夋嫨閫氱敤鏍峰紡锛屽洜涓哄畠涓烘垜浠妭鐪佷簡棰濆鐨勫鍏ワ紝骞朵笖娌℃湁寮傚父null鍜寀ndefined鐨勭被鍨嬫瘮Vue2-style璇硶涓殑{required:false}鏇存槑纭€傪煉¤娉ㄦ剰锛屾棤闇€鎵嬪姩瀵煎叆defineProps鍜宒efineEmits銆傝繖鏄洜涓鸿繖浜涙槸Vue浣跨敤鐨勭壒娈婂畯銆傝繖浜涘湪缂栬瘧鏃惰澶勭悊涓衡€滄甯哥殑閫夐」API璇硶銆傛垜浠彲鑳戒細鍦ㄦ湭鏉ョ殑Vue鐗堟湰涓湅鍒拌秺鏉ヨ秺澶氱殑瀹忓疄鐜般€傜被鍨嬪寲鐨勫彲缁勫悎鍑芥暟鍥犱负typescript闇€瑕侀粯璁ょ被鍨嬪寲妯″潡杩斿洖鍊硷紝鎵€浠ヤ竴寮€濮嬫垜涓昏鍐橳S缁勫悎杩欐牱銆俰mport{ref,Ref,SetupContext,watch}from"vue";exportdefaultfunction({emit,}:SetupContext<("change-component"|"close")[]>)://涓嬮潰鐨勪唬鐮佺‘瀹炴湁鏄湁蹇呰鍚楋紵{onCloseStructureDetails:()=>void;showTimeSlots:Ref;showStructureDetails:Ref;onSelectSlot:(arg1:onSelectSlotArgs)=>void;onBackButtonClick:()=>void;showMobileStepsLayout:Ref;:寮曠敤<瀛楃涓?;isMobile:Ref;selectedTimeSlot:Ref;showQuestionarireLink:Ref;}{constisMobile=useBreakpoints().smaller("md");conststore=useStore();//绛夌瓑锛岀瓑绛?/...}杩欑鏂瑰紡锛屾垜璁や负鏄敊璇殑銆傚疄闄呬笂涓嶉渶瑕侀敭鍏ュ嚱鏁皉eturn锛屽洜涓哄湪缂栧啓鍙粍鍚堥」鏃跺彲浠ヨ交鏉惧湴闅愬紡閿叆瀹冦€傚畠鍙互涓烘垜浠妭鐪佸ぇ閲忔椂闂村拰浠g爜琛屻€備粠"vue"瀵煎叆{ref,Ref,SetupContext,watch};瀵煎嚭榛樿鍑芥暟({emit,}:SetupContext<("change-component"|"close")[]>){constisMobile=useBreakpoints().smaller("md");conststore=useStore();//杩斿洖鍊煎彲浠ュ湪鍙粍鍚堥」涓殣寮忛敭鍏馃挕濡傛灉EsLint灏嗘鏍囪涓洪敊璇紝璇峰皢`'@typescript-eslint/explicit-module-boundary-types':'error'`鏀惧叆EsLint閰嶇疆(.eslintrc).Volar鎵╁睍Volar鏄疺sCode鍜學ebStorm鐨刅ue鎵╁睍锛岀敤浜庢浛浠etur銆傜幇鍦ㄦ寮忔帹鑽愪笌Vue3涓€璧蜂娇鐢ㄣ€傚鎴戞潵璇达紝瀹冪殑涓昏鍔熻兘鏄細寮€绠卞嵆鐢ㄥ湴杈撳叆props鍜宔mits銆傝繖寰堝ソ鐢紝灏ゅ叾鏄湪浣跨敤Typescript鏃躲€傜幇鍦紝鎴戞€绘槸閫夋嫨鍦╒ue3椤圭洰涓娇鐢╒olar銆傚浜嶸ue2锛孷olar浠嶇劧鍙互宸ヤ綔锛屽洜涓哄畠闇€瑕佹洿灏戠殑閰嶇疆銆?.鍥寸粫缁勫悎API鐨勫簲鐢ㄧ▼搴忔灦鏋勫皢閫昏緫浠?vue缁勪欢鏂囦欢涓Щ鍑轰互鍓嶏紝鏈変竴浜涙墍鏈夐€昏緫閮藉湪鑴氭湰璁剧疆涓畬鎴愮殑绀轰緥銆傝繕鏈変娇鐢ㄤ粠.vue鏂囦欢瀵煎叆鐨勫彲缁勫悎鍑芥暟鐨勭粍浠剁ず渚嬨€備唬鐮佽璁$殑澶ч棶棰樻槸锛氭垜浠槸鍚﹀簲璇ュ皢鎵€鏈夐€昏緫閮藉啓鍦?vue鏂囦欢涔嬪锛熸湁鍒╀篃鏈夊紛銆傛墍鏈夐€昏緫閮芥斁鍦ㄨ缃腑锛屽苟绉昏嚦涓撶敤鐨?js/.ts鏂囦欢銆傛棤闇€缂栧啓鍙粍鍚堢殑锛屾柟渚跨洿鎺ヤ慨鏀广€傚彲鎵╁睍涓旀洿寮哄ぇ銆傞噸鐢ㄤ唬鐮佹椂锛岄渶瑕侀噸鏋勩€備笉閲嶆瀯鏇村妯℃澘鏄垜鐨勯€夋嫨銆俆he锛氬湪涓皬鍨嬮」鐩腑浣跨敤娣峰悎鏂规硶銆備竴鑸潵璇达紝鎶婇€昏緫鍐欏湪setup閲屻€傚綋涓€涓粍浠跺お澶э紝鎴栬€呮槑纭唬鐮佷細琚鐢ㄧ殑鏃跺€欙紝鐩存帴鏀惧湪鍗曠嫭鐨刯s/ts鏂囦欢閲岋紝瀵逛簬澶ч」鐩紝灏卞叏閮ㄥ啓鎴恈omposable鍗冲彲銆備粎浣跨敤璁剧疆鏉ュ鐞嗘ā鏉垮懡鍚嶇┖闂淬€傜紪杈戣繃绋嬩腑鍙兘瀛樺湪鐨凚UG鏃犳硶瀹炴椂鑾风煡銆備箣鍚庝负浜嗚В鍐宠繖浜沚ug锛岃姳璐逛簡澶ч噺鐨勬椂闂村湪鏃ュ織璋冭瘯涓娿€傞『渚挎帹鑽愪竴涓ソ鐢ㄧ殑BUG鐩戞帶宸ュ叿Fundebug銆備綔鑰咃細Noveo璇戣€咃細灏忔櫤鏉ユ簮锛歯oveogroup鍘熸枃锛歨ttps://blog.noveogroup.com/2...浜ゆ祦鏈夋ⅵ鎯筹紝鏈夊共璐э紝寰俊鎼滅储銆愬ぇ鍗冧笘鐣屻€戝叧娉ㄨ繖浣嶈繕鍦ㄦ礂纰楃殑娓呮櫒鎿︾銆傛湰鏂囧凡鏀跺綍鍒癎itHubhttps://github.com/qq449245884/xiaozhi锛岄噷闈㈡湁瀹屾暣鐨勬祴璇曠珯鐐广€佽祫鏂欏拰鎴戠殑涓€绾垮巶鍟嗚璋堢郴鍒楁枃绔犮€?/p>