webpack4 升级记

栏目: JavaScript · 发布时间: 5年前

内容简介:号称 “犹记当年,也是我把 webpack 从 v1 升级到 v3 的

webpack4 升级记

号称 “ 零配置 ”、“ 最高可提升98%的速度 ” 的 webpack4 已经出来一段时间了,而且 webpack5 也已经在路上了。再不体验一下 webpack4 就老了!目前项目使用的还是 webpack3,打包速度确实是锻炼人的耐心,这次趁着有点时间,决心优化一下项目,尝试从 webpack 升级开始。期间断断续续也遇到不少问题,在这里对大致的过程做个记录。

犹记当年,也是我把 webpack 从 v1 升级到 v3 的

安装 webpack 以及相关配置

  1. 先删除之前的 webpack、webpack-dev-server
npm uninstall webpack webpack-dev-server --save-dev
  1. 安装最新版本的 webpack、webpack-cli (webpack4 把脚手架 webpack-cli 从 webpack 中抽离出来的,所以必须安装 webpack-cli)、webpack-dev-server
npm install webpack webpack-dev-server webpack-cli --save-dev
  1. webpack4 已不支持 extract-text-webpack-plugin ,改用 mini-css-extract-plugin
npm uninstall --save-dev extract-text-webpack-plugin
npm install --save-dev mini-css-extract-plugin
  1. 安装新版的 html-webpack-plugin
npm uninstall --save-dev html-webpack-plugin
npm i --save-dev html-webpack-plugin
  1. 还有其他的一些相关的包,在调试的过程中,排查出对应升级

遇到的问题

按 webpack4 的要求升级并配置好之后,就开始尝试在项目跑开发环境了。这个过程一波三折,升级花费的时间主要都在这里了。

路径问题

首先遇到的是巨坑,是 scss 里的路径问题。

路径处理使用 resolve-url-loader 来把路径处理成绝对路径,这个 loader 可以解决 sass 中,引用不同目录的 scss 文件,从而导致原来的相对 url 错误的问题。

升级这个 loader 后,scss 中图片字体路径一直 can't resolve ,一开始以为是升级后配置不对,在这里卡了好久,一直看配置,改配置,查相关的 loader ,无果!

最后决定还是从源码入手,使用 vscode 的调试功能,调试一下这个 loader 的处理情况。果然发现问题, resolve-url-loader v2 和 v3 的路径处理的方式改了!v2 会循环查找每一级的目录,而 v3 只会根据提供的路径生成对应的绝对路径来查找。

发现错的不是升级后的配置,而是以前代码里很多路径本身就写错了,比如

// 然而事实上,当前目录下根本没有 img 目录。应该是 ../img/test.png
background-image: url(./img/test.png);

但是因为 resolve-url-loader 循环每一级查找的原因,还是能找到对应的图片。所以原来虽然写的自由奔放,但是也没有报错。(有些是因为 copy 其他地方的代码,但是没有 copy 对应的资源文件导致的)

如此巨坑,所以又陷入了修改大批错误路径的工作中。。。

性能问题

解决路径问题之后,势如破竹,大部分问题只要找到相关处理的 loader 或者 plugin 通过调试,都能找到原因。

webpack4 跑起来后,整体的速度已经是提升一大截了,单独打包主流程的时间从 155s 降到了 70s 左右,提升近 55%

但是接着发现了一个神奇的问题,开发环境和打包速度竟然差不多,甚至更慢!!!

首先想到的是 source-map 的配置,严重拖慢速度。

但是修改不同的 devtool ,发现变化并不大。问题不在这。

然后想到 icon-font

于是看满屏密密麻麻的打包信息,发现字体文件不断重复的引入。发现是 sass 公共 util 模块里引用了字体的模块,然后之前一次修改,增加了每个 scss 自动引入 utilloader

果然,改正这个问题,只引入一次字体后,开发环境速度直接快了一倍。

sass 公共模块的问题

上面的问题,其实和这个问题相关:就是 sass 公共模块的问题。

其实原因在于, sass-loader@import 是不会去重的,重复 importscss 会重复出现。 sass-loader ` issue Duplicate Imports 中有讨论这个问题,但是并没有很好的解决方案。

要解决这个问题,从几个方面入手:

  1. 规范 sass 公共模块,需要在每个文件引入的公共变量、function 之类的,不要带有会生成 css 的代码。(可以借助 sass-resources-loader 自动每个文件引入需要的公共模块)。
  2. 对于 global.scss , reset.scss , common.scss 这种生成 css 的公共模块,在 jsimport/require
  3. 使用 optimize-css-assets-webpack-plugin 可以去掉重复的 css

对比

某单个项目升级前后对比

time development production
webpack3 82.676s 183.235s
webpack4 33.6s(提升59.3%) 66.429s(提升63.7%)

全部项目打包前后对比

time production
webpack3 1070s
webpack4 343s(提升67.9%)

结论

这次升级虽然费了不少功夫,踩了不少坑,但也收获不少经验和一些新的思路。同时,一些问题,也暴露出团队项目上的一些问题。

升级 webpack4 后,速度大幅度提升,整个团队的开发效率可以说将近 提升 70% * 团队 吧。但是还可以继续深入优化,还有不少的提升空间。可以使用 speed-measure-webpack-plugin 来检测webpack打包过程中各个部分所花费的时间,再根据分析来做优化。

还有 babel 和开发环境的 node 层可以升级优化。


以上所述就是小编给大家介绍的《webpack4 升级记》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构及应用算法教程

数据结构及应用算法教程

2011-5 / 45.00元

《数据结构及应用算法教程(修订版)》从数据类型的角度,分别讨论了四大类型的数据结构的逻辑特性、存储表示及其应用。此外,还专辟一章,以若干实例阐述以抽象数据类型为中心的程序设计方法。书中每一章后都配有适量的习题,以供读者复习提高之用。第1~9章还专门设有“解题指导与示例”一节内容,不仅给出答案,对大部分题目提供了详尽的解答注释;其中的一些算法题还给出了多种解法。书中主要算法和最后一章的实例中的全部程......一起来看看 《数据结构及应用算法教程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具