webpack 4使用mini-css-extract-plugin 提取scss文件无效

1,731 阅读2分钟

最近开始系统的学习webpack打包配置的问题,但是在配置css打包时却出现了问题,本地启动服务器,代码可以正常启动,build时bundle文件加里面却只有js文件没有css文件,配置是这样的:

loders配置:

 rules: [
            {
                test: /\.s?[ac]ss$/,
                use:[
                    {
                        loader: MiniCssExtractPlugin.loader,
                    },
                    { loader: 'css-loader', options: { url: false, sourceMap: true } },
                    {
                        loader: 'postcss-loader',
                        options: {}
                    },
                    { loader: 'sass-loader', options: { sourceMap: true }}
                ],
                exclude: /node_modules/
            }
        ]
plugin配置:
   plugins: [
        new CleanWebpackPlugin(),
        new webpack.ProgressPlugin(),
        new MiniCssExtractPlugin({
            filename: 'style.css'
        }),
    ]

怎么看都是没什么毛病,把所有的文档重新阅读一遍,唯恐忘记什么细节。甚至去github-MiniCssExtractPlugin提了issue。但是也没有人给有用的回复,无奈只能请教身边大神

  • A大神:.scss文件不应该使用sass loader,你用scss文件的loader啊
  • 我:scss后缀的文件不就是sass文件吗?
  • A大神:不一样的
  • 我(弱弱的):所以要用什么loader?
  • A大神:我忘记了,你查查看
  • 我: 好的

虽然知道不太靠谱,我还是把webpack的loader都看一遍,唯恐漏掉什么细节。果然和料想的一样,并没有这样的loader

又找了B大神,大神看了看我的配置文件,也看不出什么问题,又让我截图了webpack版本给他看,他也不知道为什么。

于是我又把package.json文件看了一遍看到了一个不太确定的配置:

"sideEffects": [ 
    "*.css"
 ]

当时配置的时候,我是想着为了优化打包速度,想要配置treeShaking,因为sideEffects是搭配置treeShaking使用的,所以就先提前配了一下,也没有仔细阅读文档。

我删除这个配置之后,发现打包的文件夹成功的出现了css代码。

仔细看了一下,原来scss-loader 经过 mini-css-loader 之后,是通过 effects 代码输出的,我只标了 css,没有标 scss,导出文件的 effects 代码被 treeShaking 删除了

就这样一个低级的错误就这样解决了,通过这个bug我更加深刻的明白了,自己不太懂的代码千万不可以乱写,可能就造成难以查到的bug。

引以为戒,也希望和我一样犯这种错误的同学规避。