使用Webpack和font-face加载字体

Ebe*_*edo 26 css font-face node.js reactjs webpack

我正在尝试使用CSS文件加载字体,@font-face但字体永远不会加载.这是我的目录结构.

在此输入图像描述

然后在webpack.config.js我有加载器来获取字体.

var path = require('path');
var webpack = require('webpack');

module.exports = {
  devtool: 'eval',
  entry: [
    "./index.js"
  ],
  output: {
    path: __dirname+"/build",
    filename: "main.js"
  },
  plugins: [
    new webpack.NoErrorsPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  module: {
      loaders: [
          { test: /\.js$/, loaders: ['react-hot', 'babel-loader'], exclude: /node_modules/ },
          { test: /\.jsx?$/, loaders: ['react-hot', 'babel-loader'], exclude: /node_modules/ },
          { test: /\.svg$/, loader: "raw" },
          { test: /\.css$/, loader: "style-loader!css-loader" },
          { test: /\.(eot|svg|ttf|woff|woff2)$/, loader: 'file?name=src/css/[name].[ext]'}

      ]
  }
};
Run Code Online (Sandbox Code Playgroud)

在我的CSS文件中,我有这个:

@font-face {
  font-family: 'Darkenstone';
  src: url('./Darkenstone.woff') format('woff');
}

body {
  background-color: green;
  font-size: 24px;
  font-family: 'Darkenstone';
}
Run Code Online (Sandbox Code Playgroud)

最后,我正在调用我的CSS文件index.js:

import './src/css/master.css';
Run Code Online (Sandbox Code Playgroud)

一切正常,但de font永远不会加载.

arb*_*bob 28

根据Webpack 的文档,您需要更新webpack.config.js才能处理字体文件。查看最后一个加载程序即

{
   test: /\.(woff|woff2|eot|ttf|otf)$/i,
   type: 'asset/resource',
  }
Run Code Online (Sandbox Code Playgroud)

我们将包含 webpack 的各种文件格式。最终webpack.config.js文件看起来像这样。

const path = require('path');
module.exports = {
       entry: './src/index.js',
       output: {
         filename: 'bundle.js',
         path: path.resolve(__dirname, 'dist'),
       },
       module: {
         rules: [
           {
             test: /\.css$/i,
             use: ['style-loader', 'css-loader'],
           },
           {
             test: /\.(png|svg|jpg|jpeg|gif)$/i,
             type: 'asset/resource',
           },
          {
            test: /\.(woff|woff2|eot|ttf|otf)$/i,
            type: 'asset/resource',
          },
         ],
       },
     };
Run Code Online (Sandbox Code Playgroud)

然后,您必须将字体导入到您的条目文件中。在这种情况下./src/index.js。配置加载程序并设置字体后,您可以通过@font-face声明合并它们。本地url(...)指令将被 webpack 拾取,就像它与图像一样。

  • 这是从 Webpack 5 开始的正确答案。任何涉及加载器的其他内容都已经过时了。file-loader 已弃用:https://v4.webpack.js.org/loaders/file-loader/ (5认同)

Ebe*_*edo 19

在尝试了很多东西后,下一个装载机完成了工作.我使用url-loader而不是文件加载器.你需要安装url-loader.

{ test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000' }
Run Code Online (Sandbox Code Playgroud)

  • 内联Base64不是一个好主意,因为可以更有效地缓存外部资源.另外,它在移动设备上解释速度减慢30%,这是一个巨大的差异. (13认同)
  • 如果您使用 Webpack 5 及更高版本,这不再是答案。请参阅@arbob 的答案,其中包含“资产/资源”。 (6认同)

小智 11

使用webpack 4,这就是为我解决问题的原因(差异):

       {
         test: /\.svg$/,
         use: ['svg-loader']
       },
       {
         test: /\.(eot|woff|woff2|svg|ttf)([\?]?.*)$/,
         use: ['file-loader']
       }
       { test: /\.(png|woff|woff2|eot|ttf|svg)$/, use: ['url-loader?limit=100000'] }
Run Code Online (Sandbox Code Playgroud)

我不得不删除svg-loaderfile-loader赞成url-loader

我的app.scss文件如下所示:

$fa-font-path: '~font-awesome/fonts';
@import '~font-awesome/scss/font-awesome';

$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
@import '~bootstrap-sass/assets/stylesheets/bootstrap';
Run Code Online (Sandbox Code Playgroud)

在我app.js我导入app.scss

import './app.scss';
Run Code Online (Sandbox Code Playgroud)

因此,更改后,我的webpack配置如下所示:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpackConfig = require('./webpack.config');

module.exports = {
  entry: {
    app: './client/app/app.js'
  },
  devtool: 'source-map',
  mode: 'development',
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Development',
      template: 'client/index.html'
    })
  ],
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: [
          'style-loader',
          'css-loader',
          'sass-loader',
        ],
      },
      { test: /\.(png|woff|woff2|eot|ttf|svg)$/, use: ['url-loader?limit=100000'] }
    ]
  }
};
Run Code Online (Sandbox Code Playgroud)


Arg*_*g0n 7

从 Webpack 4.xx 更新到最新的 5.52.1 时,我的字体出现了一些问题

我导出的内容.woff / .woff2 / .ttf ...看起来像这样:

export default __webpack_public_path__ + "glyphicons-halflings-regular.woff2";
Run Code Online (Sandbox Code Playgroud)

对我来说,解决方案就是完全删除以前的内容file-loader。似乎文件被多次处理,从而导致了错误。

前:

...
module: {
    rules: [
        {
            test: /\.(png|jpg|gif|ico|woff|woff2|ttf|svg|eot)$/,
            use: {
                loader: 'file-loader',
                options: { 
                    name: '[name].[ext]',
                    useRelativePath: true
                }
            }
        },
        {
            test: /\.css$/,
            use: [
                MiniCssExtractPlugin.loader,
                {
                    loader: 'css-loader',
                    options: { url: false }
                }
            ]
        }
    ]
}
...
Run Code Online (Sandbox Code Playgroud)

后:

...
module: {
    rules: [
        {
            test: /\.css$/,
            use: [
                MiniCssExtractPlugin.loader,
                {
                    loader: 'css-loader',
                    options: { url: false }
                }
            ]
        }
    ]
}
...
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息: https: //webpack.js.org/guides/asset-modules/