webpack4升级指北

最近发现还是有听过人看这篇文章,所以再来更新一下。首先现在webpack4已经稳定,各个插件和loader基本上直接装都可以版本匹配,比如html-webpack-plugin,如果有不匹配的看peerDependencies提醒,会提示你需要安装新的版本。还有就是extract-text-webpack-plugin作者好像不想维护了,现在可以用mini-css-extract-plugin,webpack5据说会集成css打包,就不需要插件了

2018年2月25日,刚过完年webpack就给了一个加班红包。webpack4经过1个月的缓冲期,终于发布了正式版,那么抛给广大开发者的问题又来了,我是不是要升级了呢?本文就站在一个之前用webpack3开发项目,现在打算升级到4的角度上,来讲一讲需要升级的内容。

安装

首先你要重新安装以下的依赖包:

  1. webpack4
  2. webpack-cli(用来启动webpack)
  3. html-webpack-plugin还没有更新,会出现compilation.templatesPlugin is not a function的错误,目前需要npm i webpack-contrib/html-webpack-plugin -D安装,官方说法是因为作者这段时间没空更新,所以他们自己fork了一份改了,现在先用这种方式用着,等作者有空了再合并进去。
  4. 其他各种配件升级,dev-server升级到3,各种loader你们自己看着办,如果是新装的应该是已经支持了的,如果在编译过程中报can not find xxx的错误,说明xxx对应的loader可能需要升级了,因为webpack4去掉了this.options的支持
  5. 看一下有没有peerDependencies的提醒,有的话升级以下插件。目前来说我剩下一个ajv-keywords@3.1.0 requires a peer of ajv@^6.0.0 but none is installed. You must install peer dependencies yourself.的莫名其妙提醒,暂时没什么影响,也没查到解决方法,所以先放着,你们如果重新安装包可能就没这个错了。

以上这些就是安装包的工作,基本就差不多了。

配置

mode

webpack加了一个mode配置,只有两个值development | production,对不同的环境他会提供不同的一些默认配置,比如开发环境下面默认启用optimization.namedModules(原NamedModulesPlugin,现已弃用),而生产环境默认使用optimization.noEmitOnErrors(原NoEmitOnErrorsPlugin,现已弃用)。

不同模式下的默认配置如下:

  1. 生产环境默认开启了很多代码优化(minify,splite等)
  2. 开发时开启注视和验证,并且自动加上了eval devtool
  3. 生产环境不支持watching,开发环境优化了重新打包的速度
  4. 生产环境开启模块串联(原ModuleConcatenationPlugin),没用过不多说
  5. 自动设置process.env.NODE_ENV到不同环境,也就是不需要DefinePlugin来做这个了
  6. 如果你给mode设置为none,所有默认配置都去掉了

如果不加这个配置webpack会出现提醒,所以还是加上吧

CommonsChunkPlugin

相信大家如果听说过webpack4的更新,最大的感触应该就是去除了CommonsChunkPlugin,毕竟官方change log写的篇幅最多的就是这个

CommonsChunkPlugin删除之后,改成使用optimization.splitChunks进行模块划分,详细文档看这里

官方的说法是默认设置已经对大部分用户来说非常棒了,但是需要注意一个问题,默认配置只会对异步请求的模块进行提取拆分,如果要对entry进行拆分,需要设置optimization.splitChunks.chunks = 'all'。其他的内容大家就自己研究吧。

对应之前我们拆分runtime的情况,现在也有一个配置optimization.runtimeChunk,设置为true就会自动拆分runtime文件

UglifyJsPlugin

现在也不需要使用这个plugin了,只需要使用optimization.minimize为true就行,production mode下面自动为true

optimization.minimizer可以配置你自己的压缩程序

其他

还有很多是我们平时使用不太到的升级,更多的是一些性能上的优化和功能上的升级,附上官方change log,希望官方文档赶紧出来吧。


Jokcy的前端小站
看到,想到,做过的一些内容总结
1 篇内容引用

前端码农一枚

464 声望
132 粉丝
0 条评论
推荐阅读
webpack热更新的原理深度解析
最近在解决 Vue3 的 JSX 不支持热更新的问题,所以较为深度地研究了 Webpack 的热更新的原理,以及应该如何实现 Vue3 的组件热更新,本文就来深度分析一下关于 Webpack 热更新的原理和实现。需要注意的是热更新不...

Jokcy2阅读 4.4k

【关于webpack的打包原理】webpackJsonpCallback的学习笔记
代码中的webpackJsonpCallback是什么意思?webpackJsonpCallback是webpack在浏览器端异步加载模块的时候定义的全局函数。当webpack加载一个异步模块时,会生成一个script标签,指向异步模块的url,此时浏览器会异...

梨花1阅读 795

「Webpack5源码」enhanced-resolve路径解析库源码分析
本文内容基于webpack 5.74.0和enhanced-resolve 5.12.0版本进行分析webpack5核心流程专栏共有5篇,使用流程图的形式分析了webpack5的构建原理:「Webpack5源码」make阶段(流程图)分析「Webpack5源码」enhanced-...

白边2阅读 547

前端微服务跨域配置解决办法,devServer为例
前言Nginx: 在上一篇我提到的跨域配置是正式上线的时候使用nginx做为配置的参考。Webpack: 而我们更多的时候是在开发阶段就需要通过跨域进行联合开发各个子应用部分功能DevServer配置解决跨域子应用静态资源跨域...

smallStone2阅读 2.3k评论 13

如何提升项目的本地构建效率?
最近写H5的项目比较多,该项目从年龄上看着还算比较年轻😂,整个架构应该是直接使用vue-cli基于vue2生成的,那底层打包工具自然也就是webpack,我们知道webpack有个通病,那就是随着项目的不断增大每次构建的时间...

南玖1阅读 354

封面图
webpack关于chunkFilename
相对于output.filename,output.chunkFilename用来配置通过require.ensure加载的模块文件当是cmd和amd异步加载并且没有给入口文件时,可以通过output.chunkFilename来配置命名未被列在entry中,却又需要被打包出...

十只生蚝阅读 1k

如何禁止Webpack 5打包自动生成license文件
Webpack 5集成了terser-webpack-plugin,但是它的默认配置会导致打包后生成一堆LICENSE.txt,想要解决这个问题需要执行下边的步骤。

来点灵感阅读 932

前端码农一枚

464 声望
132 粉丝
宣传栏