Webpack5 Automatic publicPath no es compatible con este navegador
Estaba trabajando en webpack 4.44.2, me enfrento a este error cuando convierto a webpack5.0.0
ERROR en ./src/assets/sass/styles.scss Error en la compilación del módulo (de ./node_modules/mini-css-extract-plugin/dist/loader.js): Error: PublicPath automático no es compatible con este navegador en E: \ maktab \ Control-panel \ newcontrol \ final-control \ node_modules \ css-loader \ dist \ cjs.js!
el error es del archivo de fuente bath en 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;
}
mi estructura src https://i.stack.imgur.com/vKyfW.png
estructura 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");
Respuestas
Las soluciones sugeridas no funcionaron para mí. Sin embargo, encontré que configurar publicPathuna cadena vacía funcionó.
output: {
publicPath: '',
...
}
Encontré el mismo problema. Mi código se compila en la carpeta dist sin más estructura. El siguiente código funciona para mí y es simple ya que necesito una ruta vacía.
'module': {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: ''
}
},
{
loader: "css-loader"
}
]
}
]
}
Puedes volverte loco y hacer cosas así también:
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: (resourcePath, context) => {
return path.relative(path.dirname(resourcePath), context) + '/';
},
},
},
Detalles que puede encontrar aquí: https://webpack.js.org/plugins/mini-css-extract-plugin/#the-publicpath-option-as-function
Dentro de su webpack.config.js debe hacer lo siguiente, ya sea para usar la variable de entorno de la siguiente manera o la raíz que tomará.
// paso-1 const ASSET_PATH = process.env.ASSET_PATH || '/';
// paso-2 Objeto de salida interior como se muestra a continuación: publicPath: ASSET_PATH
// paso 3 Complementos internos como se muestra a continuación: 'process.env.ASSET_PATH': JSON.stringify (ASSET_PATH)
Para obtener más información, consulte aquí, https://webpack.js.org/guides/public-path/
puedes probar de esta manera:
//add output.publicpath
output: {
publicPath: '/',
...
}
Creo que va a ser útil que añadido publicPatha la optionsdeMiniCssExtractPlugin.loader
referencia: mini-css-extract-plugin
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '/public/path/to/',
},
},
'css-loader',
],
},
],
},
El error es causado por un error en mini-css-extract-plugin 1.3.8 y versiones anteriores en combinación con Webpack 5. Se activa cuando una hoja de estilo hace referencia a un recurso que usa url(...)y la publicPathopción no se establece explícitamente en la configuración de Webpack.
Me tomé el tiempo para reproducir e informar el problema aquí: https://github.com/webpack-contrib/mini-css-extract-plugin/issues/707
Ayer, se lanzó la versión 1.3.9 e incluye la solución para este problema. Debería poder resolver este error actualizando.
También recibí el mismo error al cargar imágenes usando 'file-loader'. Solo estaba proporcionando el outputPath. Pero luego también proporcioné a publicPath el mismo valor y funcionó.
{
test: /\.svg$/i,
use: {
loader: 'file-loader',
options: {
name: "[name].[ext]",
outputPath: "imgs",
publicPath: 'imgs',
}
}
},
outputPath: indica dónde colocar las imágenes / archivos.
publicPath: es la ruta insertada en src = "" del elemento img en html.
<img src="imgs/webpack.svg"/>
Entonces ambos deberían tener el mismo camino.
Tuve el mismo problema, la mejor y más rápida forma es actualizar mini-css-extract-plugin a la última versión (1.4.1 hizo el trabajo por mí)