解决elementUI打包上线后icon图标偶尔乱码的问题

解决vue-elementUI打包后icon图标偶尔乱码的问题

  • 一、背景
  • 二、现象
  • 三、原因
  • 四、处理方法
    • 方式1:使用css-unicode-loader
    • 方式2:升高 sass版本到1.39.0
    • 方式3:替换element-ui的样式文件
    • 方式4:更换打包压缩方式
    • 知识扩展:
    • 方式5:把sass更改为node-sass编译(不推荐)

一、背景

本项目是若依作为开发框架(elemen-ui + vue + sass),开发过程中,图标一直正常。直到打包发布到线上,页面偶发性出现图标乱码问题,再次刷新页面后,又可正常显示。

二、现象

1、项目打包后,dist/css/app.xxx.css,发现所有的图标样式content的文本未正常显示了。例:el-icon-moon:before{content:“”};
2、虽然页面图标可以正常显示,但是用F12,会发现字体依然是乱码;
在这里插入图片描述

三、原因

本项目使用的依赖包是sass(dart-sass),elementui使用的是node-sass,而dart-sass在编译element-ui里icon伪元素的content unicode编码时会转换成对应unicode明文,所以通过伪元素来展示的图标如el-icon-arrow:before{ content: “\e6df”},编译之后就变成了el-icon-arrow:before{ content: “”},“”便是一个双字节字符,导致出现乱码。

/* 编译前 */
.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,然后执行npm install安装依赖
在这里插入图片描述

方式3:替换element-ui的样式文件

element-variables.scss 中的@import elementui删除了,改成main.js中引入
在这里插入图片描述
在这里插入图片描述

方式4:更换打包压缩方式

因为 sass-loader 会检查运行环境的模式,给 dart-sass 传入 { outputStyle: “compressed” }。 dart-sass 在这时会使用 BOM 而不是输出 @charset。
如果是通过 @vue/cli 搭建的环境,因为有 cssnano 处理压缩,所以可以给 vue.config.js 传入 sassOptions 避免 compressed。

sass的默认输出格式为expanded,编译时不会转换unicode字符。而sassLoader修改了sass默认输出格式为compressed。
因此我们在配置sassLoader时将输出格式重新改为expanded便能解决问题

module.exports = {css: {loaderOptions: {sass: {implementation: require('sass'),sassOptions: {// 生效代码outputStyle: 'expanded'}	}}}
}

知识扩展:

sass最终输出的样式包括下面几种样式风格:

  • 嵌套输出方式 nested
  • 展开输出方式 expanded
  • 紧凑输出方式 compact
  • 压缩输出方式 compressed

方式5:把sass更改为node-sass编译(不推荐)

element-ui采用的时node-sass编译,可以把dart-sass换成node-sass。
但是:
node-sass 已经被标记为过时了,这意味着它也会慢慢退出历史舞台,
dart-sass 是被官方推荐的 sass 编译器,dart-sass是未来的主流。

// 卸载sass
npm uninstall sass
// 安装node-sass
npm install --dev node-sass

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何给图片加水印?

如何给图片加水印?在我们的日常生活中,许多热爱摄影的朋友都会选择给自己的照片添加水印。这是因为我们深知,一张出色的照片背后需要付出大量的努力和心血,而通过添加水印可以有效地保护自己照片的版权,这样即使将图片…

1. 学习 K8S: Docker 基础

学习 K8S: Docker 基础 1. Docker 的诞生 1.1 首次展示 2013 年 3 月 15 日,在北美的圣克拉拉市召开了一场 Python 开发者社区的主题会议 PyCon,研究和探讨各种 Python 开发技术和应用, 在当天的会议日程快结束时,有一位名为 S…

Qt 打开文件列表选择文件,实现拖拽方式打开文件

1. 实现打开文件列表选择文件 1.1. 创建 Qt 工程,并添加几个简单控件 这里笔者选用的是 QMainWindow,创建好工程后在 ui 界面设计中添加 QLineEdit、QPushBtton至少这两个控件,如下图摆放。 1.2. 头文件中添加相关操作 在 mainwindow.h 中…

【python】Leetcode(primer-dict-list)

文章目录 260. 只出现一次的数字 III(字典 / 位运算)136. 只出现一次的数字(字典)137. 只出现一次的数字 II(字典)169. 求众数(字典)229. 求众数 II(字典)200…

【【Verilog典型电路设计之CORDIC算法的Verilog HDL 实现】】

Verilog典型电路设计之CORDIC算法的Verilog HDL 实现 典型电路设计之CORDIC算法的Verilog HDL 实现 坐标旋转数字计算机CORDIC(Coordinate Rotation Digital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如sin,cos,…

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下,kafka的结构和rocketmq的机构基本上一样,都需要一个注册…

AI智能工服识别算法

AI智能工服识别算法通过yolov5python网络深度学习算法模型,AI智能工服识别算法通过摄像头对现场区域利用算法分析图像中的工服特征进行分析实时监测工作人员的工服穿戴情况,识别出是否规范穿戴工服,及时发现不规范穿戴行为,提醒相…

数字孪生体技术--学习笔记

一.数字孪生体技术概述 数字孪生体技术是跨层级,跨尺度的现实世界和虚拟世界的建立沟通的桥梁,是第四次工业革命的通用目的技术和核心技术体系之一,是支撑万物互联的综合技术系统,是数字经济发展的基础,是未来智能时代…

Android/Java中,各种数据类型之间的互相转换,给出各种实例,附上中文注释

目录 1.字符串(String)转整数(int): 2.整数(int)转字符串(String): 3.字符串(String)转浮点数(float)&…

axios 进阶

axios 进阶 接口传参方式 使用 xhr 原生技术或者是 axios 时,它的 post 传参方式是键值对的形式 keyvalue。但是在实际开发中一般是使用对象的形式定义数据,方便读取和赋值。所以当我们需要发起请求时可以通过 qs 这一款插件将对象转成键值对形式&…

2023华为软件测试笔试面试真题,抓紧收藏不然就看不到了

一、选择题 1、对计算机软件和硬件资源进行管理和控制的软件是(D) A.文件管理程序 B.输入输出管理程序 C.命令出来程序 D.操作系统 2、在没有需求文档和产品说明书的情况下只有哪一种测试方法可以进行的(A) A.错误推测法测试…

R语言13-R语言中的数据导入导出和批量导入

数据导入 CSV 文件&#xff1a; 使用 read.csv() 函数导入逗号分隔的文本文件。 data <- read.csv("data.csv")Excel 文件&#xff1a; 使用 readxl 包中的函数 read_excel() 导入 Excel 文件。 install.packages("readxl") # 安装 readxl 包&#…

深眸科技创新赋能视觉应用产品,以AI+机器视觉解决行业应用难题

随着工业4.0时代的加速到来&#xff0c;我国工业领域对于机器视觉技术引导的工业自动化和智能化需求持续上涨&#xff0c;国内机器视觉行业进入快速发展黄金期&#xff0c;但需求广泛出现同时也对机器视觉产品的检测能力提出了更高的要求。 传统机器视觉由人工分析图像特征&am…

forEach和map有什么区别,使用场景?

forEach和map有什么区别&#xff0c;使用场景&#xff1f; 区别什么意思&#xff1f;forEach: 不直接改变原始数组&#xff0c;但可以在回调中更改原始数组。 区别 forEach 和 map 都是数组的常用方法&#xff0c;但它们有不同的目的和用法。下面是它们之间的主要区别以及各自…

RE:从零开始的车载Android HMI(四) - 收音机刻度尺

最近比较忙&#xff0c;研究复杂的东西需要大量集中的时间&#xff0c;但是又抽不出来&#xff0c;就写点简单的东西吧。车载应用开发中有一个几乎避不开的自定义View&#xff0c;就是收音机的刻度条。本篇文章我们来研究如何绘制一个收音机的刻度尺。 本系列文章的目的是在讲…

视觉SLAM14讲笔记-第3讲-三维空间刚体运动

空间向量之间的运算包括&#xff1a; 数乘、加法、减法、内积、外积。 内积&#xff1a;可以描述向量间的投影关系&#xff0c;结果是一个标量。 a ⃗ ⋅ b ⃗ ∑ i 1 3 a i b i ∤ a ∤ ∤ b ∤ c o s ⟨ a , b ⟩ \vec{a} \cdot \vec{b}\sum_{i1}^3{{a _i}{b_i}} \nmid a…

Leetcode-每日一题【剑指 Offer 36. 二叉搜索树与双向链表】

题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表…

vim常用命令汇总

vim常用命令 1.光标移动删除撤销/恢复查找替换 vim可以作为vscode插件使用 1.光标移动 快捷键功能描述 删除 快捷键功能描述dd删除光标所在行&#xff0c;删除之后&#xff0c;下一行上移ndd删除当前行&#xff08;包括此行&#xff09;后 n 行文本dw移动光标到单词的开头以…

【Vue2】---->mixins 复用

#记录 mixins 复用 - 处理登录确认框的弹出 1 新建一个 mixin 文件 mixins/loginConfirm.js export default {methods: {// 是否需要弹登录确认框// (1) 需要&#xff0c;返回 true&#xff0c;并直接弹出登录确认框// (2) 不需要&#xff0c;返回 falseloginConfirm () {if…

python编写四画面同时播放swap视频

当代技术让我们能够创建各种有趣和实用的应用程序。在本篇博客中&#xff0c;我们将探索一个基于wxPython和OpenCV的四路视频播放器应用程序。这个应用程序可以同时播放四个视频文件&#xff0c;并将它们显示在一个GUI界面中。 C:\pythoncode\new\smetimeplaymp4.py 准备工作…