我正在使用webpack 4.44.2,转换为webpack5.0.0时会遇到此错误
./src/assets/sass/styles.scss中的错误 模块构建失败(来自./node_modules/mini-css-extract-plugin/dist/loader.js): 错误:此浏览器不支持自动publicPath 在E:\ maktab \ Control-panel \ newcontrol \ final-control \ node_modules \ css-loader \ dist \ cjs.js!
错误来自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;
}
我的src结构 https://i.stack.imgur.com/vKyfW.png
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");
答案 0 :(得分:11)
建议的解决方案对我不起作用。但是,我发现将publicPath
设置为空字符串可以解决问题。
output: {
publicPath: '',
...
}
答案 1 :(得分:5)
我遇到了同样的问题。我的代码无需任何进一步的结构即可编译到dist文件夹中。以下代码对我有用,并且很简单,因为我需要一个空路径。
'module': {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: ''
}
},
{
loader: "css-loader"
}
]
}
]
}
您也可以发疯并做类似的事情:
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: (resourcePath, context) => {
return path.relative(path.dirname(resourcePath), context) + '/';
},
},
},
详细信息,您可以在这里找到:https://webpack.js.org/plugins/mini-css-extract-plugin/#the-publicpath-option-as-function
答案 2 :(得分:4)
在webpack.config.js中,您必须执行以下操作,要么使用以下环境变量,要么要使用其根目录。
//步骤1 const ASSET_PATH = process.env.ASSET_PATH || '/';
//步骤2 内部输出对象如下: publicPath:ASSET_PATH
//步骤3 内部插件如下: 'process.env.ASSET_PATH':JSON.stringify(ASSET_PATH)
有关更多信息,请参见此处, https://webpack.js.org/guides/public-path/
答案 3 :(得分:3)
我认为将 publicPath
添加到 options
的 MiniCssExtractPlugin.loader
会很有帮助
module: {
rules: [
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '/public/path/to/',
},
},
'css-loader',
],
},
],
},
答案 4 :(得分:2)
我在使用“file-loader”加载图像时也遇到了同样的错误。我只提供了输出路径。但是后来我也提供了具有相同值的 publicPath 并且它起作用了。
{
test: /\.svg$/i,
use: {
loader: 'file-loader',
options: {
name: "[name].[ext]",
outputPath: "imgs",
publicPath: 'imgs',
}
}
},
publicPath:是插入到html中img元素的src=""中的路径。
<img src="imgs/webpack.svg"/>
所以两者应该有相同的路径。
答案 5 :(得分:2)
该错误是由 mini-css-extract-plugin 1.3.8 及更低版本中与 Webpack 5 结合使用的错误引起的。当样式表使用 url(...)
和 {{1}选项未在 Webpack 配置中明确设置。
我花时间在此处重现并报告了该问题:https://github.com/webpack-contrib/mini-css-extract-plugin/issues/707
昨天,1.3.9 版已发布,其中包含针对此问题的修复。您应该可以通过升级来解决此错误。
答案 6 :(得分:1)
您可以尝试这种方式:
//add output.publicpath
output: {
publicPath: '/',
...
}