【问题标题】:Webpack5 Automatic publicPath is not supported in this browser此浏览器不支持 Webpack5 自动 publicPath
【发布时间】:2021-01-25 09:36:48
【问题描述】:

我正在使用 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");

【问题讨论】:

标签: javascript html css webpack sass


【解决方案1】:

该错误是由 mini-css-extract-plugin 1.3.8 及更低版本与 Webpack 5 结合的错误引起的。当样式表使用 url(...) 引用资源且未使用 publicPath 选项时触发该错误在 Webpack 配置中明确设置。

我花时间在此处重现并报告该问题:https://github.com/webpack-contrib/mini-css-extract-plugin/issues/707

昨天,版本 1.3.9 已发布,其中包含此问题的修复程序。您应该能够通过升级解决此错误。

【讨论】:

  • 噗!非常感谢!快把我逼疯了,正要删除 mini-css-extract-plugin,谢谢,确实,这解决了问题!
【解决方案2】:

我在使用“文件加载器”加载图像时也遇到了同样的错误。我只提供了输出路径。但后来我也提供了具有相同值的 publicPath 并且它有效。

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

outputPath:告诉放置图像/文件的位置。

publicPath:是插入到html中img元素src=""的路径。

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

所以两者应该有相同的路径。

【讨论】:

  • 感谢我 ayudo mucho。
【解决方案3】:

我认为将publicPath 添加到MiniCssExtractPlugin.loaderoptions 会很有帮助

参考:mini-css-extract-plugin

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    【解决方案5】:

    你可以试试这个方法:

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

    【讨论】:

    • 那是我的第一次尝试。它导致像 /foo.jpg 这样的绝对路径,如果图像、css 和 js 与 CSS 文件放在同一个 dist 文件夹中,则将无法正常工作:)
    【解决方案6】:

    我遇到了同样的问题。我的代码在没有任何进一步结构的情况下编译到 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

    【讨论】:

    • 你能告诉我如何使用这个函数吗,我们需要用 src 改变“resourcePath”吗.. 或者改变上下文!!
    【解决方案7】:

    在您的 webpack.config.js 中,您必须执行以下操作,使用如下环境变量或根目录。

    //步骤一 const ASSET_PATH = process.env.ASSET_PATH || '/';

    //第二步 内部输出对象如下: 公共路径:ASSET_PATH

    //第三步 内部插件如下: 'process.env.ASSET_PATH': JSON.stringify(ASSET_PATH)

    有关更多信息,请参阅此处, https://webpack.js.org/guides/public-path/

    【讨论】:

    • 谢谢,@Mannawar Hussain。这个想法是在 publicpath 中,在我的例子中,添加 publicPath: '/',在输出中(仅),解决我的问题。
    猜你喜欢
    • 2016-09-22
    • 2021-09-07
    • 2016-09-26
    • 2016-07-31
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多