亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何解決elementUI打包上線后icon圖標(biāo)偶爾亂碼問(wèn)題

 更新時(shí)間:2025年01月24日 14:53:10   作者:一朵野花壓海棠  
文章描述了在使用若依框架開(kāi)發(fā)過(guò)程中遇到的圖標(biāo)亂碼問(wèn)題,通過(guò)分析發(fā)現(xiàn)是由于sass編譯器將Unicode編碼轉(zhuǎn)換為明文導(dǎo)致的,文章提供了四種處理方法:使用css-unicode-loader、升高sass版本、替換element-ui的樣式文件和更換打包壓縮方式

一、背景

本項(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)文章

最新評(píng)論