【问题标题】:Webpack 4: mini-css-extract-plugin + sass-loader + splitChunksWebpack 4: mini-css-extract-plugin + sass-loader + splitChunks
【发布时间】:2018-08-30 20:15:05
【问题描述】:

我有以下示例配置以将 mini-css-extract-plugin 与 Webpack 4 一起使用:

entry: {
   a: ['./js/a.js', './scss/a.scss'],
   b: ['./js/b.js', './scss/b.scss']
},
module: {
    rules: [
       [...],
       {
        test: /\.(css|sass|scss)$/,
        use: [
            MiniCssExtractPlugin.loader,
            {
                loader: 'css-loader',
                options: {
                    importLoaders: 2,
                    sourceMap: true
                }
            },
            {
                loader: 'postcss-loader',
                options: {
                    plugins: () => [
                        require('autoprefixer')
                    ],
                    sourceMap: true
                }
            },
            {
                loader: 'sass-loader',
                options: {
                    sourceMap: true
                }
            }
        ]
},
optimization: {
    splitChunks: {
        cacheGroups: {
            js: {
                test: /\.js$/,
                name: "commons",
                chunks: "all",
                minChunks: 7,
            },
            css: {
                test: /\.(css|sass|scss)$/,
                name: "commons",
                chunks: "all",
                minChunks: 2,
            }
        }
    }
},
plugins: [
    new MiniCssExtractPlugin({
        filename: "dist/[name].css",
    }),
]

还有以下 sass 文件:

// a.scss
@import 'libA.scss';
@import 'libB.css';
[...] 

// b.scss
@import 'libA.scss';
@import 'libB.css';
[...]

当我运行 webpack 时,libB.css 被插入到 commons.css 包中,而 libA.scss 没有。

一般来说,.css 文件的每个导入都由 splitChunks 选项处理(仅当名称中指定了扩展名 css 时),而 sass 导入则不会。

我有一个包含多个 sass 入口点和许多 @import 的 sass 组件的项目,我想创建一个包含共享 sass 模块的公共包。

【问题讨论】:

  • 我从未使用过 mini-css-extract-plugin,但我使用过用于 css 的 ExtractTextPlugin,并且可能对您有所帮助的一件事是将加载程序放在一起以处理您的 css。 ExtractTextPlugin.extract(['css-loader', 'sass-loader']) 可能是您解决问题的一个想法。
  • 我认为 mini-css-extract-plug 没有方法调用“extract”。在文档中,加载器都写在同一个数组上,就像我的例子一样(MiniCssExtractPlugin.loader 然后css-loader,等等......)
  • 我不确定这是否是一个类似的问题,但这篇文章对我帮助很大 - 基本上只是使用 @next 版本(我的其余设置与你的相似)stackoverflow.com/questions/50803260/…

标签: css webpack sass sass-loader webpack-4


【解决方案1】:

我在我的 Webpack 4 配置中做这样的事情。

const MiniCssExtractPlugin = require("mini-css-extract-plugin")

module: {
rules: [ {
    test: /\.scss$/,
    use: [
      MiniCssExtractPlugin.loader,
      {
        loader: "css-loader",
        options: {
          modules: true,
          sourceMap: true,
          importLoader: 2
        }
      },
      "sass-loader"
    ]}
  ]
},

plugins: [
  new MiniCssExtractPlugin({
    // Options similar to the same options in webpackOptions.output
    // both options are optional
    filename: "style.css",
    chunkFilename: "[name].css"
  })
]

我还给output.publicPath -configuration 对象指向我的构建目录,例如 ->

output: {
   filename: "[name]-min.js",
   path: path.resolve(__dirname, "dist"),
   publicPath: "/static/react/dist/"
},

edit 如果您对代码拆分感兴趣,Webpack 4 可以“开箱即用”地为您做到这一点。如果您使用动态导入,这将为您拆分 .js.css -files。

optimization: {
  splitChunks: {
    chunks: 'all'
  }
}

如果您只想将您的 .css 合并到一个文件中,您可以按如下方式添加。

optimization: {
    splitChunks: {
      chunks: 'all'
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.s?css$/,
          chunks: 'all',
          minChunks: 1,
          reuseExistingChunk: true,
          enforce: true,
        },
      }
    },
}

【讨论】:

  • 有了这个配置,webpack 会将所有的 css 合并为一个,但也会生成 styles.js 以使一切正常工作(所有捆绑的 js)。有什么办法可以摆脱那个文件?
  • 这是否处理@import 'md/variables',其中预期的解析文件是./md/_variables.scss
  • 错误的 api 架构。 cacheGroups 进入 splitChunks。
  • @nass600 使用webpack-fix-style-only-entries webpack 插件,工作正常。
  • importLoader 应该是 importLoaders 并且在初始配置示例中应该是 1 而不是 2
猜你喜欢
  • 2023-01-05
  • 1970-01-01
  • 2021-04-12
  • 2016-03-11
  • 2019-09-04
  • 1970-01-01
  • 2019-01-29
  • 2019-04-23
  • 2019-02-22
相关资源
最近更新 更多