如何解決elementUI打包上線后icon圖標(biāo)偶爾亂碼問(wèn)題
一、背景
本項(xiàng)目是若依作為開(kāi)發(fā)框架(elemen-ui + vue + sass),開(kāi)發(fā)過(guò)程中,圖標(biāo)一直正常。
直到打包發(fā)布到線上,頁(yè)面偶發(fā)性出現(xiàn)圖標(biāo)亂碼問(wèn)題,再次刷新頁(yè)面后,又可正常顯示。
二、現(xiàn)象
1、項(xiàng)目打包后,dist/css/app.xxx.css,發(fā)現(xiàn)所有的圖標(biāo)樣式content的文本未正常顯示了。例:el-icon-moon:before{content:“”};
2、雖然頁(yè)面圖標(biāo)可以正常顯示,但是用F12,會(huì)發(fā)現(xiàn)字體依然是亂碼;
三、原因
本項(xiàng)目使用的依賴包是sass(dart-sass),elementui使用的是node-sass,而dart-sass在編譯element-ui里icon偽元素的content unicode編碼時(shí)會(huì)轉(zhuǎn)換成對(duì)應(yīng)unicode明文,所以通過(guò)偽元素來(lái)展示的圖標(biāo)如el-icon-arrow:before{ content: “\e6df”},編譯之后就變成了el-icon-arrow:before{ content: “”},“”便是一個(gè)雙字節(jié)字符,導(dǎo)致出現(xiàn)亂碼。
/* 編譯前 */ .el-icon-edit{content:'\e878'} /* 編譯后 */ .el-icon-edit{content:"?"}/*# sourceMappingURL=index.css.map */
四、處理方法
方式1:使用css-unicode-loader
1、安裝css-unicode-loader
npm i -D css-unicode-loader
需要在config.js里面配置如下代碼
configureWebpack: (config) => { ...otherCode, const sassLoader = require.resolve("sass-loader"); config.module.rules .filter((rule) => { return rule.test.toString().indexOf("scss") !== -1; }) .forEach((rule) => { rule.oneOf.forEach((oneOfRule) => { const sassLoaderIndex = oneOfRule.use.findIndex( (item) => item.loader === sassLoader ); oneOfRule.use.splice(sassLoaderIndex, 0, { loader: require.resolve("css-unicode-loader"), }); }); }); }
方式2:升高 sass版本到1.39.0
修改package.json文件中sass的版本,由1.26.2直接改為1.39.0,然后執(zhí)行npm install安裝依賴
方式3:替換element-ui的樣式文件
element-variables.scss 中的@import elementui刪除了,改成main.js中引入
方式4:更換打包壓縮方式
因?yàn)?sass-loader 會(huì)檢查運(yùn)行環(huán)境的模式,給 dart-sass 傳入 { outputStyle: “compressed” }。 dart-sass 在這時(shí)會(huì)使用 BOM 而不是輸出 @charset。
如果是通過(guò) @vue/cli 搭建的環(huán)境,因?yàn)橛?cssnano 處理壓縮,所以可以給 vue.config.js 傳入 sassOptions 避免 compressed。
sass的默認(rèn)輸出格式為expanded,編譯時(shí)不會(huì)轉(zhuǎn)換unicode字符。而sassLoader修改了sass默認(rèn)輸出格式為compressed。
因此我們?cè)谂渲胹assLoader時(shí)將輸出格式重新改為expanded便能解決問(wèn)題
module.exports = { css: { loaderOptions: { sass: { implementation: require('sass'), sassOptions: { // 生效代碼 outputStyle: 'expanded' } } } } }
知識(shí)擴(kuò)展:
sass最終輸出的樣式包括下面幾種樣式風(fēng)格:
- 嵌套輸出方式 nested
- 展開(kāi)輸出方式 expanded
- 緊湊輸出方式 compact
- 壓縮輸出方式 compressed
方式5:把sass更改為node-sass編譯(不推薦)
element-ui采用的時(shí)node-sass編譯,可以把dart-sass換成node-sass。
但是:
- node-sass 已經(jīng)被標(biāo)記為過(guò)時(shí)了,這意味著它也會(huì)慢慢退出歷史舞臺(tái),
- dart-sass 是被官方推薦的 sass 編譯器,dart-sass是未來(lái)的主流。
// 卸載sass npm uninstall sass // 安裝node-sass npm install --dev node-sass
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue-router 切換組件頁(yè)面時(shí)進(jìn)入進(jìn)出動(dòng)畫(huà)方法
今天小編就為大家分享一篇Vue-router 切換組件頁(yè)面時(shí)進(jìn)入進(jìn)出動(dòng)畫(huà)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09vue封裝Animate.css動(dòng)畫(huà)庫(kù)的使用方式
這篇文章主要介紹了vue封裝Animate.css動(dòng)畫(huà)庫(kù)的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04element中el-table中的el-input校驗(yàn)的實(shí)現(xiàn)
本文主要介紹了element中el-table中的el-input校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Vue3整合WangEditor富文本編輯器的實(shí)踐指南
這篇文章主要為大家詳細(xì)介紹了如何在?Vue?3?項(xiàng)目中集成?WangEditor?富文本編輯器,實(shí)現(xiàn)圖文混排、自定義擴(kuò)展等高階功能,感興趣的小伙伴可以了解下2025-03-03Vue項(xiàng)目如何保持用戶登錄狀態(tài)(localStorage+vuex刷新頁(yè)面后狀態(tài)依然保持)
關(guān)于vue登錄注冊(cè),并保持登錄狀態(tài),是vue玩家必經(jīng)之路,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目如何保持用戶登錄狀態(tài)的相關(guān)資料,localStorage+vuex刷新頁(yè)面后狀態(tài)依然保持,需要的朋友可以參考下2022-05-05