28

我有以下示例配置以将 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 时,webpacklibB.css被插入commons.css捆绑中而libA.scss不是。

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

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

4

1 回答 1

26

我在我的 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/"
},

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

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

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

optimization: {
    splitChunks: {
      chunks: 'all'
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.s?css$/,
          chunks: 'all',
          minChunks: 1,
          reuseExistingChunk: true,
          enforce: true,
        },
      }
    },
}
于 2018-03-26T10:48:08.280 回答