Webpack5 PublicPath automatico non è supportato in questo browser

Oct 10 2020

Stavo lavorando su webpack 4.44.2, devo affrontare questo errore quando converto in webpack5.0.0

ERRORE in ./src/assets/sass/styles.scss Costruzione del modulo non riuscita (da ./node_modules/mini-css-extract-plugin/dist/loader.js): Errore: publicPath automatico non è supportato in questo browser in E: \ maktab \ Control-panel \ newcontrol \ final-control \ node_modules \ css-loader \ dist \ cjs.js!

l'errore proviene dal file di font bath in fonts.scss

@font-face {
    font-family: "Janna LT";
    src: local("Janna LT"), url(../fonts/janna.woff) format("woff");
    font-weight: normal;
}

@font-face {
    font-family: "Janna LT";
    src: local("Janna LT"), url(../fonts/janna-bold.woff) format("woff");
    font-weight: bold;
}

la mia struttura src https://i.stack.imgur.com/vKyfW.png

struttura dist https://i.stack.imgur.com/mLgmF.png

webpack.config.js

const path = require('path');

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    entry:  {
      'main': './src/index.js',
    },
  
    output: {
      path: path.join(__dirname, "/dist"),
      filename: '[name].js',
    }, 

    devServer: {
        contentBase: path.join(__dirname, "/dist"),
        port: 8087,
        writeToDisk: true,
        overlay :true
    },
    

    module: {
        rules: [
    
            {
                test: /\.html$/, use: [ { loader: "html-loader", } ] }, { test: /\.(sa|sc|c)ss$/,
                use: [
                MiniCssExtractPlugin.loader, 
                'css-loader', 
                'postcss-loader',
                'sass-loader'
                ]
            },
                    
            {
                test: /\.(png|svg|jpe?g|gif)$/, exclude: /fonts/, use: [ { loader: "file-loader", options: { name: '[name].[ext]', outputPath: "/assets/images", } } ] }, { test: /\.(svg|eot|woff|woff2|ttf)$/,
                exclude: /images/,
                use: [
                    {
                        loader: "file-loader", 
                        options: {
                        name: '[name].[ext]',
                        outputPath: "assets/fonts",
                        }
                    }
                ]
            },

        ]
    },

    plugins: [
        new CleanWebpackPlugin(),

        new HtmlWebpackPlugin({ 
          filename: "index.html",
          template: "./src/index.html",
          chunks: ['main']
        }),
      

        new MiniCssExtractPlugin({filename: "assets/css/styles.css"}),
        new OptimizeCSSAssetsPlugin({}),
    ]
    
} 

styles.scss

@import "base/fonts";
@import "base/global";
@import "base/typography";
@import "base/links";
@import "components/components";
@import "components/demo";

index.js

import './assets/sass/styles.scss';
import 'normalize.css/normalize.css';

console.log("hellow from webpack5");

Risposte

42 NorthernIsle Nov 06 2020 at 19:54

Le soluzioni suggerite non hanno funzionato per me. Tuttavia, ho scoperto che l'impostazione publicPathsu una stringa vuota ha funzionato.

output: {
  publicPath: '',
  ...
}
12 SvenBluege Oct 25 2020 at 23:04

Ho riscontrato lo stesso problema. Il mio codice viene compilato nella cartella dist senza alcuna struttura ulteriore. Il codice seguente funziona per me ed è semplice poiché ho bisogno di un percorso vuoto.

'module': {
        rules: [
            {
                test: /\.css$/,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader, 
                        options: {
                            publicPath: ''
                        }
                    },
                    {
                        loader: "css-loader"
                    }
                ]
            }
        ]
    }

Puoi impazzire e fare anche cose del genere:

{
    loader: MiniCssExtractPlugin.loader,
    options: {
        publicPath: (resourcePath, context) => {
            return path.relative(path.dirname(resourcePath), context) + '/';
        },
    },
},

I dettagli si possono trovare qui: https://webpack.js.org/plugins/mini-css-extract-plugin/#the-publicpath-option-as-function

4 MannawarHussain Oct 11 2020 at 14:08

All'interno del tuo webpack.config.js devi fare come segue, o per usare la variabile d'ambiente come segue o la radice che richiederà.

// step-1 const ASSET_PATH = process.env.ASSET_PATH || '/';

// step-2 All'interno dell'oggetto di output come di seguito: publicPath: ASSET_PATH

// passaggio 3 all'interno dei plug-in come di seguito: "process.env.ASSET_PATH": JSON.stringify (ASSET_PATH)

Per maggiori informazioni fare riferimento qui, https://webpack.js.org/guides/public-path/

3 xoyimi Oct 28 2020 at 09:28

puoi provare in questo modo:

//add output.publicpath
output: {
  publicPath: '/',
  ...
}
3 Littlefish Jan 06 2021 at 15:57

Penso che sarà utile che aggiunto publicPathal optionsdiMiniCssExtractPlugin.loader

riferimento: mini-css-extract-plugin

  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '/public/path/to/',
            },
          },
          'css-loader',
        ],
      },
    ],
  },
2 P44T Feb 26 2021 at 17:29

L'errore è causato da un bug in mini-css-extract-plugin 1.3.8 e versioni precedenti in combinazione con Webpack 5. Viene attivato quando un foglio di stile fa riferimento a una risorsa utilizzando url(...)e l' publicPathopzione non è impostata esplicitamente nella configurazione Webpack.

Mi sono preso il tempo per riprodurre e segnalare il problema qui: https://github.com/webpack-contrib/mini-css-extract-plugin/issues/707

Ieri è stata rilasciata la versione 1.3.9 che include la correzione di questo problema. Dovresti essere in grado di risolvere questo errore aggiornando.

1 sau0409 Jan 11 2021 at 03:41

Ho ricevuto lo stesso errore anche durante il caricamento delle immagini utilizzando il "caricatore di file". Stavo solo fornendo outputPath. Ma poi ho anche fornito publicPath entrambi con lo stesso valore e ha funzionato.

{
    test: /\.svg$/i,
    use: {
        loader: 'file-loader',
        options: {
            name: "[name].[ext]",
            outputPath: "imgs",
            publicPath: 'imgs',
        }
    }
  },

outputPath: dice dove mettere immagini / file.

publicPath: è il percorso inserito in src = "" dell'elemento img in html.

<img src="imgs/webpack.svg"/>

Quindi entrambi dovrebbero avere lo stesso percorso.

user6103049 Apr 09 2021 at 15:37

Ho avuto lo stesso problema, il modo migliore e più veloce è aggiornare mini-css-extract-plugin all'ultima versione (1.4.1 ha fatto il lavoro per me)