我刚刚将我们项目中的旧的css和js构建过程从grunt(和less中的css)迁移到webpack 5(和scss中的css),一切似乎都很好。然而,有一个问题:有时候与其看起来像这样
下面是DevTools中的心脏:
.fa-heart:before {
content: "";
}
该fontawesome webfonts似乎不正确加载,而是加载在这样
当我在DevTools中检查心脏时,它看起来像这样
.fa-heart:before {
content: "";
}
我本以为
.fa-heart:before {
content: "\f004";
}
当我在DevTools中手动更改它时,它可以工作。
当我在浏览器中启动灯塔审计时,可以重现这一点:最后一次装载时,灯塔是这样的。
老实说,我不知道该怎么做,甚至谷歌这个问题。我试图使用webfontloader加载字体,但这并没有帮助的问题。
我在我的main.scss中包含了这样的fontawesome:
@import "~@fortawesome/fontawesome-pro/scss/fontawesome";
@import "~@fortawesome/fontawesome-pro/scss/light";
@import "~@fortawesome/fontawesome-pro/scss/solid";
以下是我的webpack配置的简化版本(条目较少):
module.exports = {
entry: {
'./dist/styles.min': { import: './src/sass/main.scss' },
'./dist/scripts.min.js': { import: './src/js/scripts.js' },
}
module: {
rules: [
{
test: require.resolve("jquery"),
loader: "expose-loader",
options: {
exposes: ["$", "jQuery", "jquery"],
},
},
{
test: /\.s?[ac]ss$/i,
use: [
// Compiles Sass to CSS
MiniCssExtractPlugin.loader,
"css-loader",
"sass-loader",
],
},
{
test: /\.jsx?$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
options: {
presets: [["@babel/preset-env", { debug: false, useBuiltIns: "usage", corejs: 3 }], "@babel/preset-react"],
plugins: [["@babel/plugin-transform-runtime", { corejs: 3 }]],
},
},
},
{
test: /(ignore)/,
use: {
loader: "ignore-loader",
},
},
{
test: /\.(png|jpe?g|gif|svg|ttf|eot|woff2?)$/i,
use: [
{
loader: "file-loader",
options: {
outputPath: "dist/assets/",
publicPath: "/assets/",
},
},
],
},
]
},
output: {
path: __dirname,
filename: "[name]?[contenthash]",
},
resolve: {
extensions: [".jsx", ".js", ".json"],
},
plugins: [
new MiniCssExtractPlugin({
filename: "[name].css?[contenthash]",
}),
],
optimization: {
minimize: !DEV_MODE,
minimizer: [
"...",
new TerserPlugin({ extractComments: false }),
new CssMinimizerPlugin(),
],
splitChunks: {
cacheGroups: {
polyfills: {
test: /[\\/]node_modules[\\/](@babel|core-js|regenerator|promise)/,
name: "./dist/polyfills.min.js",
chunks: "all",
},
vendor: {
test: /[\\/]node_modules[\\/](slick|bootstrap|jquery)/,
name: "./dist/vendor.min.js",
chunks: "all",
},
},
},
},
}
2条答案
按热度按时间m1m5dgzv1#
"\f004"
is actually equivalent to""
,但字符""
可能会出现,因为您的CSS缺少@charset "UTF-8"
规则。它可能在最小化过程中被剥离。这可能发生在terser-webpack-plugin (see this issue)中。您可以尝试将以下内容添加到您的web pack配置中:
更多信息:https://medium.com/@thinkpanda_75045/webpack-with-unicode-7a2c5eb22afd
类似问题:https://github.com/FortAwesome/Font-Awesome/issues/17644
kyxcudwk2#
以下是我如何解决奇怪图标问题并获得正确结果的详细说明,以“fa-user”图标(Unicode \f007)为例,这是网站上最常用的图标之一:
之前:[在此处输入图像描述][1]
After:[enter image description here][2]
我尝试的是:在我的fontawesome.scss的顶部添加@charset 'utf-8'并没有解决奇怪图标的问题,这是因为在编译时删除了@charset声明。
我们目前正在使用fontawesome的fontawesome子集功能来减少文件大小,并使用Sass 1.58.3,sass-loader和css-loader与Webpack 4来编译我们的scss文件。
以下是一些可用于验证图标是否正确显示的步骤:我执行了以下步骤以确认结果的准确性:
1.转到网站。
1.按Ctrl+U或右键单击并选择“查看页面源”。
1.单击样式表的href链接。例如:
1.搜索一个图标,例如“fa-user”
1.如果问题得到解决,图标应显示Unicode内容“f007”或正确的符号。[在此处输入图像描述][3]
1.如果图标显示为[?],请通过在Web上搜索来进行复查以确保其正确。
1.[在此输入图像描述][4]
1.将[?]复制并粘贴到搜索引擎中,以检查它是否显示为Unicode。[在此处输入图像描述][5]
1.这个解决方案适用于fontawesome 5和6,因为我在两个版本上都测试过。
1.要执行快速检查并验证此解决方案是否可以解决问题,可以尝试添加@charset“utf-8”;在你编译的CSS文件的开头。[在这里输入图片描述][6]
**解决方案:**解决方案是添加npm包[add-charset-webpack-plugin][7],该包会自动在所有最终CSS文件的第一行添加charset声明,确保UTF-8编码被指定并被浏览器正确解释。
如何申请:在webpack.config.js文件中:
1.导入包:从'add-charset-webpack-plugin'导入AddCharsetWebpackPlugin;
1.将插件添加到您的插件:[]部分:new AddCharsetWebpackPlugin({ charset:“utf-8”}),
希望有帮助![1][https://i.stack.imgur.com/0pPvK.png](https://i.stack.imgur.com/0pPvK.png) [2]:https://i.stack.imgur.com/bBdFU.png [3]:https://i.stack.imgur.com/GHFsY.png [4]:https://i.stack.imgur.com/hI6EJ.png [5]:https://i.stack.imgur.com/asPO0.png [6]:https://i.stack.imgur.com/VXbZY.png [7]:https://www.npmjs.com/package/add-charset-webpack-plugin