Webpack 4:mini-css-extract-plugin +文件加载器未加载资产

时间:2018-12-24 22:25:42

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

我正在尝试移动.scss个文件之一中使用的素材资源(图像和字体),但似乎它们被忽略了:

这是我的 .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. 字体未编译(否公开/字体/等...
  2. 图像未编译

我一直在尝试一切,但是我不知道这里可能会发生什么...任何想法?

5 个答案:

答案 0 :(得分:1)

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

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

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

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

我认为由于所有图像资源链接都不正确,所以无法创建图像文件夹。

对于我要解决的问题,引用均不正确,我无法对其进行修复,因此我只是使用此webpack copy plugin将文件复制到正确的dist文件夹位置。

答案 1 :(得分:0)

您需要url-loader

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

                    }
                }
           }

答案 2 :(得分:0)

尝试以下配置

import os
LAT = ''
os.system(f"echo {LAT}")
    

enter image description here

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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',
        ],
      },
    ],