鍓嶈█鏈嬪弸浠ぇ瀹跺ソ锛屾垜鏄唬鐮佽瘲浜篲锛屼粖澶╃粰澶у浠嬬粛涓€涓嬪浣曚娇鐢╲ue3+vite3灏佽涓€涓仴澹殑svg鎻掍欢锛侀鍏堜綘瑕佺煡閬撲负浠€涔堣鐢╯vg杩欎釜姒傚康锛歋VG鏄竴绉嶅熀浜嶺ML鐨勭煝閲忓浘褰㈡牸寮忥紝SVG闆嗘垚浜咲OM銆乆SL绛塛3C鏍囧噯锛岀敤浜庡湪Web涓婃樉绀哄悇绉嶅浘褰㈠拰鍏朵粬鐜锛涘畠鍏佽鎴戜滑缂栧啓鍙缉鏀剧殑2D鍥惧舰锛屽苟涓斿彲浠ラ€氳繃CSS鎴朖avaScript杩涜鎿嶄綔銆傚畠鐢变竾缁寸綉鑱旂洘寮€鍙戯紝鏄竴涓紑鏀炬爣鍑嗐€備紭鐐癸細鍙墿灞曟€с€佸搷搴旀€с€佷氦浜掓€с€佸彲缂栫▼鎬с€佷綋绉皬銆佹€ц兘楂樸€傚洜涓篠VG鏄熀浜庣煝閲忕殑锛屾墍浠ュ湪鏀惧ぇ鍥惧舰鏃朵笉浼氫涪澶辨垨涓㈠け淇濈湡搴︺€傚畠鍙槸閲嶆柊缁樺埗浠ラ€傚簲鏇村ぇ鐨勫昂瀵革紝杩欎娇寰楀畠闈炲父閫傚悎鍝嶅簲寮忕綉椤佃璁$瓑澶氫笂涓嬫枃鍦烘櫙銆傝€屼笖鎬ц兘涔熼潪甯稿嚭鑹诧紝涓嶨IF銆丣PG鍜孭NG绛夊厜鏍呭浘褰㈢浉姣旓紝SVG鍥惧舰閫氬父鏄洿灏忕殑鏂囦欢銆傛祻瑙堝櫒鏀寔锛歴vg瀵瑰競闈笂甯歌鐨勬祻瑙堝櫒宸茬粡鏈変簡寰堝ソ鐨勬敮鎸?*鎵€浠ワ紝缁间笂鎵€杩帮紝鍦ㄦ棩甯稿紑鍙戜腑浣跨敤svg浠f浛鍥剧墖鍜屽浘鏍囨槸鎴戜滑鏈€濂界殑閫夋嫨锛?*#涓轰粈涔堣灏佽濡傛灉涓嶅皝瑁卻vg锛屼唬鐮佷細寰堥毦缁存姢锛屽彲璇绘€ф瀬宸紝渚嬪锛氱湅灏佽鍚庣殑浠g爜鏁堟灉锛氫竴涓嚜瀹氫箟鏍囩缁勪欢灏卞彲浠ユ悶瀹氾紝涔熸槸鏂逛究缁存姢鍜岄槄璇?svg-iconiconName="q"/>涓嬮潰寮€濮嬪啓鎻掍欢鍜岀粍浠舵潵瀹炵幇銆傜涓€姝ュ垎涓?涓楠わ細鍒涘缓鎵€闇€鐨勬枃浠躲€傦細浣跨敤vitetransformIndexHtml瀵箂vg鍐呭杩涜鎵撳寘娓叉煋Step4锛氬皝瑁卾ue缁勪欢骞跺叏灞€娉ㄥ唽Step5锛氬湪椤甸潰涓簲鐢ㄤ紶鍊糞tep1锛氬垱寤烘墍闇€鏂囦欢棣栧厛鍦╯rc鏂囦欢澶逛笅鍒涘缓濡備笅鏂囦欢锛氱洰褰曟枃浠惰鏄巗vgIcon/index.vue灏佽缁勪欢svg鐩綍瀛樻斁浣犵殑svg鏍煎紡鏂囦欢index.js鍏ㄥ眬娉ㄥ唽svghooksvgTagView.jssvg鎻掍欢绗簩姝ワ細灏佽锛堣浆鎹㈠拰璇诲彇svg锛夋枃浠剁殑鎻掍欢1.棣栧厛寮曞叆鑺傜偣svgTagView.js涓殑鏂囦欢绯荤粺锛屽苟鍦╲ite:synchronousreaddir()涓娇鐢╥mport{readFileSync,readdirSync}from'fs'readdirSync銆俽eturnfilearraylistreadFileSync锛氬悓姝ヨ鍙栨枃浠跺唴瀹癸紝涓嶇煡閬撹妭鐐筬s鏂囦欢鐨勭郴缁熸湅鍙嬭鐐瑰嚮浼犻€侀棬锛屽湪vite.config.js涓殑plugins涓娇鐢╥mport{svgTagView}from'./src/icons/svgTagView.js'plugins:[vue(),svgTagView()]2.璁剧疆svg鐨勬鍒欏尮閰嶆爣绛惧拰灞炴€onstattributeMatch={svgTag:/瀹炴柦锛歝onstsvgTagView=(path='./src/icons/svg/',perfect='icon')=>{if(path==='')returnidPerfix=perfixconstres=recursivelyFindSvg(path)return{name:'svg-transform',transformIndexHtml(html){//transformIndexHtml鏄浆鎹ndex.html鐨勪笓鐢╤ook锛寁ite3鐙湁returnhtml.replace('
',`
${res.join('')}`)}}}灏辩畻杩欓噷鎵撳寘浜嗘彃浠讹紝閭f垜鎴戜滑闇€瑕佸皢svg璺緞鍐欏叆vite.config.js杩涜鍏ㄥ眬閰嶇疆svgTagView('./src/icons/svg/')闄勪笂瀹屾暣浠g爜濡備笅锛歩mport{readFileSync,readdirSync}from'fs'constattributeMatch={svgTag:/+].*?)>/,clearWidthHeight:/(width|height)="([^>+].*?)"/g,hasViewBox:/(viewBox="[^>+].*?")/g,clearReturn:/(\r)|(\n)/g}letidPerfix=''閫掑綊鍑芥暟FindSvg(dir){constsvgRes=[]constdirents=readdirSync(dir,{withFileTypes:true//灏嗘枃浠朵綔涓篺s.Dirent瀵硅薄杩斿洖锛?/fs.Dirent鏄洰褰曢」锛堝彲浠ユ槸鏂囦欢涔熷彲浠ユ槸鐩綍涓殑瀛愮洰褰曪級鐨勮〃绀猴紝璇诲彇fs杩斿洖鐨勭洰褰曢」.Dir鏄枃浠跺悕鍜屾枃浠剁被鍨嬪鐨勭粍鍚堛€倉)//console.log(dirents)//{name:'guanyuwomeng1.svg',[Symbol(type)]:1}for(constdirentofdirents){if(dirent.isDirectory()){//鍒ゆ柇鏄笉鏄洰褰晄vgRes.push(...recursivelyFindSvg(dir+dirent.name+'/'))//閫掑綊鑾峰彇svg鏂囦欢鐨勫唴瀹箎else{//璇诲彇鏂囦欢淇℃伅锛屼娇鐢╮epalce鏂规硶浣跨敤绗竴姝ユ鍒欏尮閰嶈浆鎹vg鏂囦欢constsvg=readFileSync(dir+dirent.name).toString().replace(attributeMatch.clearReturn,'').replace(attributeMatch.svgTag,($1,$2)=>{璁╁搴?0璁╅珮搴?0璁╁唴瀹?$2.replace(attributeMatch.clearWidthHeight,(s1,s2,s3)=>{if(s2==='width'){width=s3}elseif(s2==='height'){height=s3}return''})if(!attributeMatch.hasViewBox.test($2)){content+=`viewBox="00${width}${height}"`}return``}).replace('','')svgRes.push(svg)}}//鎺у埗鍙?log("馃殌~file:svgTagView.js:28~recursivelyFindSvg~svgRes",svgRes)returnsvgRes}exportconstsvgTagView=(path,perfix='icon')=>{if(path==='')杩斿洖idPerfix=perfixconstres=recursivelyFindSvg(path)return{name:'svg-transform',transformIndexHtml(html){//transformIndexHtml鏄竴涓浆鎹ndex.html鐨勭壒娈奾ook锛寁ite3鐙湁returnhtml.replace('',`${res.join('')}`)}}}鎻掍欢鎵撳寘瀹屾垚锛屾帴涓嬫潵灏辨槸鎵撳寘svgvue缁勪欢杩涜娓叉煋鍜岀‘璁や竴涓嬬鍥涙锛氬皝瑁卾ue缁勪欢骞跺叏灞€娉ㄥ唽鎵撳紑鎴戜滑鏂板缓鐨勭涓€涓枃浠禼omponents/SvgIcon/index.vue1.灏佽涓€涓叏灞€閫氱敤鐨剆vg-icon缁勪欢濡備笅锛氬彲浠ヨ嚜宸遍厤缃畇vg鏍囩鍙互鏈夌殑灞炴€э紙width銆乧lass銆乶ame绛?..锛夛紝灏佽璇硶寰堢畝鍗曪紝杩欓噷涓嶅啀璧樿堪2.鍏ㄥ眬娉ㄥ唽涓婁竴姝ュ皝瑁呯殑svg-icon锛屾墦寮€绗竴涓柊寤虹殑icons/idnex.js锛屼娇鐢╥nstall閽╁瓙灏嗗叾娉ㄥ唽鍒皏ue瀹炰緥涓婏紝濡備笅锛歩mportSvgIconfrom'@/components/SvgIcon/index.vue'exportdefault{install:(app)=>{app.component('svg-icon',SvgIcon)}}鐒跺悗鍦ㄥ叆鍙f枃浠朵腑浣跨敤main.jsimport{createApp}from'vue'importAppfrom'./App.vue'importSvgIconfrom'./icons/index'constapp=createApp(App)app.use(SvgIcon)app.mount('#app')鍏ㄥ眬娉ㄥ唽浣跨敤瀹屾垚锛屼笅涓€姝ユ垜浠湪妯℃澘涓娇鐢ㄥ畠()绗簲姝ワ細灏?svg-icon/>缁勪欢搴旂敤鍒伴〉闈腑浼犻€掑€?template>椤甸潰鏄剧ず鏁堟灉濡備笅锛氬埌杩欓噷鍘绘彃浠跺拰缁勪欢灏卞彲浠ヤ簡锛侊紒鎬荤粨姝ラ涓€锛氬垱寤烘墍闇€鏂囦欢姝ラ浜岋細灏佽杞崲璇诲彇svg鏂囦欢鐨勬彃浠舵楠や笁锛氫娇鐢╲itetransformIndexHtml灏佽娓叉煋svg鍐呭姝ラ鍥涳細灏佽Vue缁勪欢骞跺叏灞€娉ㄥ唽姝ラ浜旓細鍦ㄩ〉闈笂搴旂敤褰撶劧浣犱篃鍙互鎶婃墦鍖呭ソ鐨勬彃浠讹紙svgTagView锛夊彂甯冨埌npm锛岀劧鍚庡畨瑁呬娇鐢紝杩欐牱鏈€鏂逛究浣犲紑鍙戙€傜偣鍑绘煡鐪嬫洿澶氭枃绔?/p>