Webpack 4:mini-css-extract-plugin + sass-loader + splitChunks

And*_*lia 18 css sass webpack sass-loader webpack-4

我有以下示例配置使用带有Webpack 4的mini-css-extract-plugin:

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",
    }),
]
Run Code Online (Sandbox Code Playgroud)

以下sass文件:

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

// b.scss
@import 'libA.scss';
@import 'libB.css';
[...]
Run Code Online (Sandbox Code Playgroud)

当我运行webpack时libB.css插入commons.cssbundle而libA.scss不是.

通常,每个.css文件导入都由splitChunks选项处理(仅当css名称中指定了扩展名时),而sass import不是.

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

Jim*_*ala 14

我在我的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"
]
Run Code Online (Sandbox Code Playgroud)

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

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

编辑如果您对代码拆分感兴趣,Webpack 4可以为您"开箱即用".如果您使用动态导入,这将为您分割.js并提供.css相应的文件.

optimization: {
  splitChunks: {
    chunks: 'all'
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您的另一只手想将您合并.css到一个文件中,您可以添加如下.

optimization: {
    splitChunks: {
      chunks: 'all'
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.s?css$/,
          chunks: 'all',
          minChunks: 1,
          reuseExistingChunk: true,
          enforce: true,
        },
      }
    },
}
Run Code Online (Sandbox Code Playgroud)

  • 使用此配置webpack将所有css合并为一个,但也将生成`styles.js`,这是为了使一切正常工作(所有捆绑的js).有什么办法摆脱那个文件? (7认同)
  • 错误的api架构.cacheGroups在splitChunks中. (3认同)