unipapp 解决无法编译sass_Webpack 4编译速度优化踩坑

本文介绍了如何通过speed-measure-webpack-plugin检测Webpack 4的打包速度,并尝试使用thread-loader优化编译过程。在实践中,发现thread-loader对eslint-loader的优化效果不明显,而在sass-loader部分也遇到版本兼容问题和配置陷阱。最终结论强调,是否使用thread-loader需根据实际情况对比,且需关注loader的复杂性和模块数量。
摘要由CSDN通过智能技术生成

918d9b6d19d3a85f82555aa265f0fcef.png

一,目标

今天打算做一些webpack打包编译的速度优化。

二,准备工作

当前webpack版本 4.43.0

首先,既然是做速度优化,就得先知道当前的编译速度是多少。

推荐这个插件:speed-measure-webpack-plugin

GitHub地址:

https://github.com/stephencookdev/speed-measure-webpack-plugin​github.com
npm i -D speed-measure-webpack-plugin

用法也很简单,官方文档里也有

const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

const smp = new SpeedMeasurePlugin();

module.exports = smp.wrap(webpackConfig);

然后我们再运行一下build命令

88e6dd2f64bd5a51e4d8ae954a08bdb4.png

终端里会出现上面这张图,还是蛮清晰的,每个模块的编译时间,包括plugin的执行时间,都会有,报红的时间都是超过10s的

(补充:这里的modules with no loaders实际上就是无需编译浏览器可识别的js)

OK,既然已经有了时间了,那我开始优化了。

三,确定方案

Google了一下,目前有两种主流方案:

happypack和thread-loader

先来看一下happypack,这里是GitHub地址

https://github.com/amireh/happypack​github.com

看了官方文档后,果断放弃,为什么?

bbe665a40a1133449cf55c81ddf4e50f.png

ec4f79b976777eb0fe2084974c831405.png

噗呲,作者都推荐了thread-loader了,那我还有啥好说的,直接上链接:

webpack-contrib/thread-loader​github.com
72adb34efabaa0ff9895c61646d99f66.png
npm install --save-dev thread-loader

按照文档一通配置,我先来针对eslint-loader试一下效果

 {
                enforce: 'pre',
                test: /.(js|jsx)$/,
                exclude: [
                    /node_modules/
                ],
                include: [
                    path.resolve(__dirname, '../src')
                ],
                use: [
                    {
                        loader: "thread-loader"
                    },
                    {
                        loader: 'eslint-loader'
                    }
                ]
            },

其实就是放到需要优化的loader之前

再次执行

9ec06e9ce446636a193342069123dc43.png

这。。。。。。

重新加一些参数

{
                enforce: 'pre',
                test: /.(js|jsx)$/,
                exclude: [
                    /node_modules/
                ],
                include: [
                    path.resolve(__dirname, '../src')
                ],
                use: [
                    {
                        loader: "thread-loader",
                        options: {
                            workerParallelJobs: 50,
                            poolParallelJobs: 50
                        }
                    },
                    {
                        loader: 'eslint-loader'
                    }
                ]
            },

再次执行

06e708cbc4e9473f5d30b6fecbe46762.png

好像相比上次好了一点点,但是竟然还是没有去掉的时候速度快。

不过确实webpack编译时间每次都不一样,所以要多编译几次,然后看大致的平均时间:

我经过多次编译对比之后发现,好像确实是不添加的快。。

f0c4f06d7edc1e9a131aad0a6d0276e2.png

看到官方的这条提示,我明白了,原来真的不是所有的loader加了这个都会变快的,有的真的甚至会变慢,所以还是需要亲自编译观察对比才行。

接着我来试一下sass-loader部分:

{
                test: /.(scss|css)$/,
                use: [
                    {
                        loader: "thread-loader",
                        options: {
                            workerParallelJobs: 50,
                            poolParallelJobs: 50
                        }
                    },
                    {
                        loader: MiniCssExtractPlugin.loader
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            sourceMap: false,
                            modules: {
                                localIdentName: config.defaultLocalIdentName
                            }
                        }
                    },
                    {
                        loader: 'postcss-loader'
                    },
                    {
                        loader: 'sass-loader'
                    }
                ]
            },

老样子,将这个thread-loader放到所有的样式loader的最前面,再次编译

f3468a80cbd1624a4d69cacc47af6a51.png

唉,看来真的没有变快,依然差不多,甚至有时候还不如不添加。。

补充:这里有一个坑,如果你这么配置,报了这个错误

5e74ba68eb5a410d1b1912182959a73c.png

解决方案是将thread-loader放到minicssextractplugin.loader后面就行了,附上issue链接

https://github.com/webpack/webpack/issues/6792​github.com

这里还有一个坑,如果你的sass-loader版本是8.0的,那么你直接这么配置会报错

74e84413254c7d36b4520bdac938bd46.png

你需要将sass-loader版本号降到7.3.1,然后再跑就OK了,附上issue链接

https://github.com/webpack-contrib/sass-loader/issues/761#issuecomment-554608680​github.com

四,结论

1,使用speed-measure-webpack-plugin进行打包速度检测,记得多试几次,看平均时间;

2,Happypack不再维护,特别是Webpack 4+,优先考虑thread-loader;

3,thread-loader一定要记得配置参数,多次对比发现配置比默认要快一些;

4,thread-loader并不是完全正向有效的,如果loader本身执行并不复杂,模块并不多,使用了可能会拖慢速度,因此是否需要使用还是要自己对比看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值