Fontawesome webfonts有时不加载自webpack构建

fzsnzjdm  于 2023-04-21  发布在  Webpack
关注(0)|答案(2)|浏览(163)

我刚刚将我们项目中的旧的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",
        },
      },
    },
  },
}
m1m5dgzv

m1m5dgzv1#

"\f004"is actually equivalent to"",但字符""可能会出现,因为您的CSS缺少@charset "UTF-8"规则。它可能在最小化过程中被剥离。
这可能发生在terser-webpack-plugin (see this issue)中。您可以尝试将以下内容添加到您的web pack配置中:

TerserPlugin({
  terserOptions: { output: { ascii_only: true } }
})

更多信息:https://medium.com/@thinkpanda_75045/webpack-with-unicode-7a2c5eb22afd
类似问题:https://github.com/FortAwesome/Font-Awesome/issues/17644

kyxcudwk

kyxcudwk2#

  • 要确定此解决方案是否能解决您的特定问题,您可以执行步骤10,该步骤提供了一种简单的测试方法。

以下是我如何解决奇怪图标问题并获得正确结果的详细说明,以“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

相关问题