Webpack5 PublicPath automatico non è supportato in questo browser
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
Le soluzioni suggerite non hanno funzionato per me. Tuttavia, ho scoperto che l'impostazione publicPathsu una stringa vuota ha funzionato.
output: {
publicPath: '',
...
}
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
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/
puoi provare in questo modo:
//add output.publicpath
output: {
publicPath: '/',
...
}
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',
],
},
],
},
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.
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.
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)