Webpack 4:css-loader + file-loader在构建过程中添加字体及其样式表

时间:2018-08-21 08:42:16

标签: webpack css-loader webpack-file-loader

进行以下设置:

fonts / styles.css

@font-face {
  family: 'MyFont';
  src: url('fonts/myfont.otf');
}

我如何:

    在我的JS捆绑包中,
  1. 以字符串形式获取对CSS文件URL的引用,例如[name].[hash].css
  2. 生成的CSS文件应该是纯CSS文件,但是url()指向生成的webfont文件吗?

类似的东西:

@font-face {
  family: 'MyFont';
  src: url('myfont.dds9394u329d9sa9r8439.otf');
}

我正在尝试:

webpack.config.js

{
  test: /\.(woff|woff2|eot|ttf|otf|svg)$/,
  loader: 'file-loader',
  include: [/fonts/]
},

{
  test: /\.css$/,
  use: ['file-loader', 'css-loader'],
  include: [/fonts/]
}

JS文件

const myfont = {
  family: 'MyFont',
  stylesheet: require('fonts/styles.css')
}

根据a previous question,使用file-loaderrequire()可以很好地获取CSS的URL,但是生成的文件不是纯CSS。

如何结合file-loadercss-loader(可能还有其他加载程序)来获得此CSS文件?

谢谢!

P.S。我想避免使用copy-webpack-plugin,因为我希望CSS /字体文件可以在代码中进行哈希处理和寻址。

2 个答案:

答案 0 :(得分:6)

为了后代:这是Webpack配置,通过它我可以获得所需的结果。

module: {
  rules: {
    // Font stylesheets
    {
      test: /\.css$/,
      use: [
        {
          loader: 'file-loader',
          options: {
            name: 'css/[hash].[ext]'
          }
        },
        'extract-loader',
        'css-loader',
        'postcss-loader'
      ],
      include: [/fonts/]
    },

    // Font files
    {
      test: /\.(woff|woff2|ttf|otf)$/,
      loader: 'file-loader',
      include: [/fonts/],

      options: {
        name: '[hash].[ext]',
        outputPath: 'css/',
        publicPath: url => '../css/' + url
      }
    },
  }
}

答案 1 :(得分:1)

我知道距问这个问题已经有一段时间了,但与丹一样,我将其留给后代。

因此这是适用于我的情况的设置:

const path = require("path");

module.exports = (env, argv) => ({
  ...
  module: {
       rules: [
       {
         test: /\.css$/,
         use: ["style-loader", {loader: "css-loader", options: {modules: true}}],
         exclude: /node_modules/,
      },        
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        use: [
          {
            loader: 'file-loader', 
            options: {
              outputPath: (url, resourcePath, context) => {
                if(argv.mode === 'development') {
                  const relativePath = path.relative(context, resourcePath);
                  return `/${relativePath}`;
                }
                return `/assets/fonts/${path.basename(resourcePath)}`;
              }
            }
          }
        ]
      }]
    }
});

完整的工作设置可以在这里找到: https://github.com/przemek-nowicki/multi-page-app-with-react/blob/master/webpack.config.js