此浏览器不支持Webpack5自动publicPath

zynd9foi  于 2022-11-13  发布在  Webpack
关注(0)|答案(9)|浏览(272)

我在webpack 4.44.2上工作,当我转换到webpack5.0.0时遇到此错误

./src/assets/sass/styles中的错误。scss模块构建失败(来自./node_modules/mini-css-extract-plugin/dist/loader.js):错误:在此浏览器中不支持自动公共路径,其位置为E:\maktab\控制面板\newcontrol\final-control\node_modules\css-loader\dist\cjs.js!

错误来自fonts.scss中的字体文件bath

@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;
}

我的源代码结构https://i.stack.imgur.com/vKyfW.png
分布式结构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");
2izufjch

2izufjch1#

建议的解决方案对我不起作用,但是,我发现将publicPath设置为空字符串可以解决这个问题。

output: {
  publicPath: '',
  ...
}
lnlaulya

lnlaulya2#

我遇到了同样的问题。我的代码编译到dist-folder中,没有任何进一步的结构。下面的代码对我来说很简单,因为我需要一个空路径。

'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

iih3973s

iih3973s3#

此错误是由mini-css-extract-plugin 1.3.8及更低版本与Webpack 5结合使用时出现的错误引起的。当样式表使用url(...)引用资源且未在Webpack配置中显式设置publicPath选项时,会触发此错误。
我花时间在此重现并报告了该问题:https://github.com/webpack-contrib/mini-css-extract-plugin/issues/707
昨天发布了1.3.9版,其中包含了此问题的修复程序。您应该可以通过升级来解决此错误。

lc8prwob

lc8prwob4#

您可以尝试以下方法:

//add output.publicpath
output: {
  publicPath: '/',
  ...
}
u4vypkhs

u4vypkhs5#

在你的webpack.config.js里面,你必须按照下面的方式来做,要么按照下面的方式来使用环境变量,要么使用它将要使用的根。
//step-1常量ASSET_PATH =进程.环境.ASSET_PATH||“/”;
//step-2内部输出对象如下:公共路径:资产路径
//step-3内部插件如下:“进程环境资产路径”:(ASSET_PATH)中的一个参数。
有关更多信息,请参阅此处,https://webpack.js.org/guides/public-path/

e5nszbig

e5nszbig6#

我认为将publicPath添加到MiniCssExtractPlugin.loaderoptions中会有所帮助
参考:mini-css-extract-plugin

module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '/public/path/to/',
            },
          },
          'css-loader',
        ],
      },
    ],
  },
368yc8dk

368yc8dk7#

我也得到了同样的错误,而加载图像使用'文件加载器'。我只提供了outputPath。但后来我也提供了公共路径与相同的值,它工作。

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

outputPath:告诉在哪里放置图像/文件。x1c 0d1x
publicPath:html中img元素的src="”中插入的路径。

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

因此两者的路径应该相同。

yhived7q

yhived7q8#

注意index.html<script>的标签,该标签的类型是default,但不是module

工作

<script src="./build/bundle.js"></script>

创建错误

<script type="module" src="./build/bundle.js"></script>
bybem2ql

bybem2ql9#

我只在第三方网站上分发一个带有脚本标记的React应用程序,所以我使用style-loader,而不是发出一个单独的CSS文件。
我解决这个问题的方法是在生产Webpack配置中定义一个output.publicPath,然后升级到最新的Webpack版本。

相关问题