MiniCssExtractPlugin 公共路径不起作用

Posted

技术标签:

【中文标题】MiniCssExtractPlugin 公共路径不起作用【英文标题】:MiniCssExtractPlugin public path not working 【发布时间】:2018-12-05 22:03:27 【问题描述】:

我正在使用 MiniCssExtractPlugin 在我的 react 应用程序中延迟加载 css 文件。

我已经为 MiniCssExtractPlugin 提供了 publicPath 选项,但它没有采用此选项值,而是采用 output.publicPath 选项。

config:
   
     test: /\.(css)?$/,
     use: [
            loader : MiniCssExtractPlugin.loader,
            options : 
              publicPath : '../'
            
          ,
          'css-loader'
        ],

     

有什么帮助???

【问题讨论】:

【参考方案1】:

好像你的not the only one confused, 52 cmets 关于如何做到这一点。 publicPath in html-webpack-plugin 的问题是类似的并且有所帮助。然而,最大的帮助来自于 npm run eject 退出 create-react-app 并检查 webpack.config.js 文件。

TL;DR:您需要在插件构造函数中指定保存路径。

new MiniCssExtractPlugin(
  // Options similar to the same options in webpackOptions.output
  filename: "assets/css/[name].css",
),

您可能需要重新考虑模块输出逻辑。 避免在 module.output.path 中指定嵌套路径,例如public/assets/js,而是设置 root 目录:public 并设置 filename 键的嵌套:assets/js/[name].js

然后您可以在主module.output 中指定一个publicPath,用于subdomains or CDN's 等。

最终的完整配置对我有用:

const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const HtmlWebpackPlugin = require('html-webpack-plugin');

const publicPath = '/';

module.exports = 
  entry: './_src/_js/index.js',
  output: 
    filename: 'assets/js/[name].js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: publicPath,
  ,
  module: 
    rules: [
      
        test: /\.css$/,
        use: [
          
            loader: MiniCssExtractPlugin.loader,
          ,
          'css-loader',
        ],
      ,
      
        test: /\.(png|svg|jpg|gif)$/,
        use: [
          
            loader: 'file-loader',
            options: 
              name: 'assets/images/[name].[ext]',
            ,
          ,
        ]
      ,
      
        test: /\.js$/,
        exclude: /node_modules/,
        use: ['babel-loader','eslint-loader']
      ,
    ],
  ,
  plugins: [
    new MiniCssExtractPlugin(
      // Options similar to the same options in webpackOptions.output
      // both options are optional
      filename: "assets/css/[name].css",
    ),
    new HtmlWebpackPlugin(
      inject: true,

    ),
  ]
;

【讨论】:

如果目录结构发生变化,我如何更改相对于 assets/css/ 的资源 url。

以上是关于MiniCssExtractPlugin 公共路径不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Webpack - MiniCssExtractPlugin 不提取文件

带有 sass-loader、MiniCssExtractPlugin 和 uikit 的 Webpack4

字体 url 路径错误,包含 WebPack Build 后的 css 路径

树中最长路径的公共段

存储路径不是公共路径的一部分(Laravel 8)

不同路径之间的多个公共前缀