【问题标题】:Webpack 4: mini-css-extract-plugin + file-loader not loading assetsWebpack 4:mini-css-extract-plugin + 文件加载器不加载资产
【发布时间】:2019-05-23 21:23:51
【问题描述】:

我正在尝试移动我的 .scssfiles 之一中使用的资产(图像和字体),但它们似乎被忽略了:

这是我的 .scss 文件:

@font-face {
    font-family: 'myfont';
    src: url('../../assets/fonts/myfont.ttf') format('truetype');
    font-weight: 600;
    font-style: normal;
}

body {
    color: red;
    font-family: 'myfont';
    background: url('../../assets/images/bg.jpg');
}

这是我的 webpack.config.js

const path = require('path');
const { CheckerPlugin } = require('awesome-typescript-loader');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
    target: 'node',
    entry: path.resolve(__dirname, 'server.tsx'),
    output: {
        filename: 'server_bundle.js',
        path: path.resolve(__dirname, 'build'),
        publicPath: '/build'
    },
    resolve: {
        extensions: ['.ts', '.tsx', '.js', '.jsx']
    },
    module: {
        rules: [{
                test: /\.(tsx|ts)?$/,
                loader: 'awesome-typescript-loader',
                options: {
                    jsx: 'react'
                }
            },
            {
                test: /\.(scss|sass|css)$/,                
                use: [
                    MiniCssExtractPlugin.loader,
                    { loader: 'css-loader', options: { url: false, sourceMap: true } },
                    { loader: 'sass-loader', options: { sourceMap: true } },                    
                ]
            },
            {
                test: /\.(png|svg|jpg|jpeg|gif)$/,
                loader: 'file-loader',
                options: { outputPath: 'public/images' }
            },
            {
                test: /\.(woff|woff2|eot|ttf|otf)$/,
                loader: 'file-loader',
                options: { outputPath: 'public/fonts' }
            }
        ]
    },
    plugins: [
        new CheckerPlugin(),
        new MiniCssExtractPlugin({
            filename: 'public/styles_bundle.css',
            chunkFilename: "public/styles/[id].css"
        })
    ]
}

我在浏览器中得到这个 .css 文件作为输出(注意图像的名称):

body {
  color: red;
  background: url("../../assets/images/myimage.jpg"); 
}

在我的public 目录中,我得到了这个:

public/
    styles_bundle.css

这里有两个问题:

  1. 字体未编译(No public/fonts/etc...
  2. 图像未编译

我一直在尝试一切,但我不知道这里会发生什么……有什么想法吗?

【问题讨论】:

  • re 2:在您的构建中,默认情况下对图像名称进行哈希处理以启用缓存 (webpack.js.org/guides/caching)。要更改它,请将 name: 'images/[name][hash:8].[ext]' 属性添加到图像文件规则中的选项中(如果您不想使用哈希,请删除 [hash:8])。
  • 如果您忽略了outputPath 选项怎么办?
  • 也不走运:(
  • @danielrvt 任何解决方案?
  • 很想看到这个问题的答案。

标签: css webpack sass webpack-4 mini-css-extract-plugin


【解决方案1】:

我刚刚解决了一个类似的问题。如果将 url 选项更改为 true,您可能会看到失败的图像 URL 引用。

{ loader: 'css-loader', options: { url: false, sourceMap: true } },

或者您可以手动检查路径引用是否正确。

url('../../assets/images/bg.jpg')

我认为图像文件夹没有被创建,因为所有图像资源链接都不正确。

对于我正在修复的问题,引用都是错误的,我无法修复它们,所以我只是使用这个webpack copy plugin 将文件复制到正确的 dist 文件夹位置。

【讨论】:

    【解决方案2】:

    你需要 url-loader

               {
                   test: /\.(jpg|png|gif|woff|eot|ttf|svg)/,
                    use: {
                        loader: 'url-loader', // this need file-loader
                        options: {
                            limit: 50000
    
                        }
                    }
               }
    

    【讨论】:

      【解决方案3】:

      试试下面的配置

      {
          test: /\.s[ac]ss$/i,
          use: [
            {
              loader: MiniCssExtractPlugin.loader, 
              options: {
                  publicPath: ''
              }
          },
          {
              loader: "css-loader", 
              options: { sourceMap: true}
          },{
            loader: "sass-loader", 
            options: { sourceMap: true }
          }
          ]
        },
        {
          test: /\.(png|jpg|jpeg|gif)$/i,
          loader: 'file-loader',
          options: { outputPath: 'assets/images', publicPath: '../images', useRelativePaths: true }
        },
        {
          test: /\.(woff|woff2|eot|ttf|otf)$/i,
          loader: 'file-loader',
          options: { outputPath: 'assets/fonts', publicPath: '../fonts', useRelativePaths: true }
        }
      

      在此之后,我的 scss 文件开始接受相对 URL,并且编译后的文件也使用相对路径进行了相应映射。

      【讨论】:

        【解决方案4】:

        mini-css-extract-plugin 有一个“publicPath”选项(参见here)。它基本上告诉生成的 css 在哪里可以找到字体、图像等外部资源。就我而言,将其设置为 '../' 并将所有文件加载器配置到其正确的目录,这非常有效。 基本上看起来像:

        rules: [
              {
                test: /\.css$/,
                use: [
                  {
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                      publicPath: '/public/path/to/',  // <-- This is what was helping. 
                    },
                  },
                  'css-loader',
                ],
              },
            ],
        

        【讨论】:

          【解决方案5】:

          我也有这个问题。我使用的是以下版本:

          package.json

          "mini-css-extract-plugin": "^0.10.1",
          "webpack": "^5.3.1",
          

          在我将以下内容添加到 scss 文件之前,一切都编译得很好:

          .xmas {
              background-image: url("./img/Xmas2020/SurveyBanner.png");
              height: 150px;
          }
          

          背景图片网址是问题所在。当我将其更改为绝对路径时,它起作用了:

          .xmas {
              background-image: url("/img/Xmas2020/SurveyBanner.png");
              height: 150px;
          }
          

          webpack.config.js

          这只是为了展示我是如何将图像放入输出目录的。我想有不同的方法可以做到这一点,但我使用的是 CopyWebpackPlugin。

          plugins: [
             new CopyWebpackPlugin({
                  patterns: [
                      { from: './src/static/img', to: './img', force: true },
                  ]
              }),
            ]
          

          这个链接帮助了我https://github.com/webpack-contrib/mini-css-extract-plugin/issues/286#issuecomment-455917803

          【讨论】:

            猜你喜欢
            • 2020-07-07
            • 2021-05-17
            • 2023-03-07
            • 2018-08-30
            • 1970-01-01
            • 2019-02-22
            • 2019-04-23
            • 2023-01-05
            • 2019-06-27
            相关资源
            最近更新 更多