将css-loader更新为v4后无法解析'/images/bg.jpg'

问题描述

css-loader为3.5.3,我的应用正常运行。更新它,只有它到4.3.0,现在我得到以下编译错误。我在弄清楚为什么要查看升级到v4所固有的“重大更改”时遇到了麻烦。

可能与我在.scss文件中使用url有关,其中仅存在对/images/bg.jpg的引用?我有一个styles.scss文件,其中导入了一个“ _box-layout.scss”文件,其中:

.box-layout {
  align-items: center;
  background: url('/images/bg.jpg');
  background-size: cover;
  display: flex;
  height: 100vh;
  justify-content: center;
  width: 100vw;
}

编译错误:

ERROR in ./src/styles/styles.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/css-loader/dist/cjs.js):
Error: Can't resolve '/images/bg.jpg' in 'C:\Users\gwich\dev\javascript\react\rental-props\src\styles'
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\Resolver.js:209:21
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\Resolver.js:285:5
    at eval (eval at create (C:\Users\gwich\dev\javascript\react\rental-props\node_modules\tapable\lib\HookCodeFactory.js:33:10),<anonymous>:13:1)
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\UnsafeCachePlugin.js:44:7
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\Resolver.js:285:5
    at eval (eval at create (C:\Users\gwich\dev\javascript\react\rental-props\node_modules\tapable\lib\HookCodeFactory.js:33:10),<anonymous>:13:1)
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\Resolver.js:285:5
    at eval (eval at create (C:\Users\gwich\dev\javascript\react\rental-props\node_modules\tapable\lib\HookCodeFactory.js:33:10),<anonymous>:25:1)
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\DescriptionFilePlugin.js:67:43
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\enhanced-resolve\lib\Resolver.js:285:5
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\webpack\lib\NormalModule.js:316:20
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\loader-runner\lib\LoaderRunner.js:367:11
    at C:\Users\gwich\dev\javascript\react\rental-props\node_modules\loader-runner\lib\LoaderRunner.js:233:18
    at context.callback (C:\Users\gwich\dev\javascript\react\rental-props\node_modules\loader-runner\lib\LoaderRunner.js:111:13)
    at Object.loader (C:\Users\gwich\dev\javascript\react\rental-props\node_modules\css-loader\dist\index.js:154:5)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
 @ ./src/app.js 13:0-30
 @ multi babel-polyfill ./src/app.js

如果有兴趣,我的webpack配置:

const path = require("path");
const webpack = require("webpack");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

process.env.NODE_ENV = process.env.NODE_ENV || "development";

if (process.env.NODE_ENV === "test") {
  require("dotenv").config({ path: ".env.test" });
} else if (process.env.NODE_ENV === "development") {
  require("dotenv").config({ path: ".env.development" });
}

module.exports = (env) => {
  const isProduction = env === "production";

  return {
    entry: ["babel-polyfill","./src/app.js"],output: {
      path: path.join(__dirname,"public","dist"),filename: "[name].js",},optimization: {
      splitChunks: {
        cacheGroups: {
          commons: {
            test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'initial',mode: isProduction ? 'production' : 'development',module: {
      rules: [
        {
          loader: "babel-loader",test: /\.js$/,exclude: /node_modules/,{
          test: /\.less$/,use: [
              {
                loader: MiniCssExtractPlugin.loader,options: {
                  sourceMap: !isProduction,{
                loader: "css-loader",{
                loader: "less-loader",modifyVars: {
                    "primary-color": "#1c88bf","link-color": "#1c88bf","border-radius-base": "2px",javascriptEnabled: true,}
            ],{
          test: /\.s?css$/,use: [
            {
              loader: MiniCssExtractPlugin.loader,options: {
                sourceMap: !isProduction,{
              loader: "css-loader",{
              loader: "sass-loader",],{
          test: /\.(svg|eot|ttf|woff|woff2)$/,use: {
            loader: "file-loader",options: {
              name: "[name].[ext]",outputPath: "fonts/",plugins: [
      // new BundleAnalyzerPlugin(),new MiniCssExtractPlugin({ filename: '[name].css'}),new webpack.DefinePlugin({
        "process.env.FIREBASE_API_KEY": JSON.stringify(process.env.FIREBASE_API_KEY),"process.env.FIREBASE_AUTH_DOMAIN": JSON.stringify(process.env.FIREBASE_AUTH_DOMAIN),"process.env.FIREBASE_DATABASE_URL": JSON.stringify(process.env.FIREBASE_DATABASE_URL),"process.env.FIREBASE_PROJECT_ID": JSON.stringify(process.env.FIREBASE_PROJECT_ID),"process.env.FIREBASE_STORAGE_BUCKET": JSON.stringify(process.env.FIREBASE_STORAGE_BUCKET),"process.env.FIREBASE_MESSAGING_SENDER_ID": JSON.stringify(process.env.FIREBASE_MESSAGING_SENDER_ID),}),devtool: isProduction ? "source-map" : "inline-source-map",devServer: {
      contentBase: path.join(__dirname,"public"),historyApiFallback: true,publicPath: "/dist/",};
};

解决方法

多亏了this article,我设法解决了这个问题。

首先,我安装了url-loader

npm install url-loader --save-dev

接下来,我在规则部分的webpack.config.js文件中更新了后台url中的路径(图像位于/public/images/bg.jpg中,而我的_box-layout.scss文件位于{{1}中) }):

/src/styles/components/ imported by /src/styles/styles.scss

最后,我更新了 rules: [ { test: /\.(png|jpg)$/,loader: 'url-loader' },文件:

_box-layout.scss

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...