本文首发于 dawei.lv

本文基于 webpack 4.8.1

吐槽

webpack 彪版本号的速度真是飞快,4.0 发布没多久上去看的时候才 4.1.*,现在已经刷到 4.8.1 了,给人一种“我版本号很高了,可以安心升级了”的感觉,然而坑依然很多...尤其是 API 文档,到处可见 3.0 的陈旧信息。Code Splitting 章节点进去依然在讲 CommonsChunkPlugin ,CommonsChunkPlugin 点进去提示去看 SplitChunksPlugin,看文档的时候经常会迷失自我,心累...好了,吐槽完毕,下面是正文。需要直接复制粘贴的同学直接拉到最后~

4.0 与 3.0 的区别

mode

webpack4.0 新增了 mode 的概念, mode 可以为 developmentproductionnone

development 帮我们设置了 process.env.NODE_ENV=development,并添加了 NamedModulesPlugin 插件。process.env.NODE_ENV=development 可以用来显示一些在开发模式下才显示的 debug 信息,请注意这个 NODE_ENV 不能在 webpack.config.js 中使用,只能在你的源文件中使用。想要在 webpack.config.js 中也生效,需要在 package.json 的 script 脚本前添加 NODE_ENV=development,如 NODE_ENV=development webpack --config webpack.dev.jsNamedModulesPlugin 是在开启 HMR 的时候使用的插件。

// webpack.development.config.js
module.exports = {
+ mode: 'development'
- plugins: [
-   new webpack.NamedModulesPlugin(),
-   new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }),
- ]
}
复制代码

production 帮我们设置了 process.env.NODE_ENV=production,并添加了 UglifyJsPluginModuleConcatenationPluginNoEmitOnErrorsPlugin 等插件,在设置了 sideEffects=false 之后可以实现未引用代码删除的功能。

// webpack.production.config.js
module.exports = {
+  mode: 'production',
-  plugins: [
-    new UglifyJsPlugin(/* ... */),
-    new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
-    new webpack.optimize.ModuleConcatenationPlugin(),
-    new webpack.NoEmitOnErrorsPlugin()
-  ]
}
复制代码

optimization

另一个区别在于引入了 optimization 的概念,optimization.minimizeroptimization.splitChunks 是需要我们关注的两个配置。

optimization.minimizer 用于指定 webpack 使用哪个代码压缩插件,默认为 new webpack.optimize.UglifyJsPlugin,推荐更换为 UglifyJSPlugin

+const UglifyJSPlugin = require('uglifyjs-webpack-plugin');module.exports = {//...optimization: {minimizer: [
-     new webpack.optimize.UglifyJsPlugin({})
+     new UglifyJSPlugin({})]}
}
复制代码

optimization.splitChunks 替代了 3.0 的 CommonsChunkPlugin,实现公共代码抽取。具体 API 参见SplitChunksPlugin。划几个重点,webpack 生成已经给大部分用户提供了默认的设置,mode=production 就已经带了这个优化,BUT!! 默认开启的代码分割只对异步加载的代码有效,也就是如果你是多个入口的配置,那么你的 react、react-dom、react-router 等公共库以及你的 common 代码都会被重复打包进多个入口里。emmmmm,这叫什么开箱即用嘛,还是我们自己动手吧。

首先,optimization.splitChunks.chunks 设置为 all,使得 async 异步加载的代码和 initial 初始化的代码都会被抽取。optimization.splitChunks.cacheGroups 添加 commonsvendors (如下)。

module.exports = {optimization: {splitChunks: {chunks: "all",cacheGroups: {commons: {name: "commons",test: /src[\/]/,chunks: "initial",priority: 2,minChunks: 2},vendors: {name: "vendors",test: /node_modules/,chunks: "initial",priority: 10,minChunks: 2}}}}
};
复制代码

这里的 name 指定你要抽取出来的 js 的文件名,test 字段用来筛选你要匹配的代码,minChunks:2 表示代码被引用 2 次及以上就会被抽取出来,commons 实现抽取你的 src 文件夹下的公共代码,vendors 则用于抽取 node_modules 下的公共库。下面我们需要把我们抽取出来的 commons.jsvendors.js 添加到 HtmlWebpackPlugin ,以实现打包出来的 html 文件引用 commons.jsvendors.js

new HtmlWebpackPlugin({//...
-   chunks: 'index',
+   chunks: ['vendors', 'commons', 'index'],
})
复制代码

到笔者发布文章为止,HtmlWebpackPlugin 还不支持添加动态名称的 cacheGroups,无法将未明确指定 name 的 vendors~chunk-a~chunk-b.js 之类的 js 打包进代码中,不过可以看到相关的代码已经快要出来了。之后就可以实现更精细的代码分割打包了。

plugins

使用 mini-css-extract-plugin 替代 extract-text-webpack-plugin抽取 css 到单独文件中,使用 optimize-css-assets-webpack-plugin 对 css 进行压缩处理。

optimize-css-assets-webpack-plugin 在使用的时候强烈推荐设置 isSafe = true,避免 z-index 被修改的问题。

new OptimizeCSSAssetsPlugin({cssProcessorOptions: {isSafe: true}
});
复制代码

最后

webpack4-demo 是笔者整理的 webpack4.0 demo,详细的 webpack 配置可以在这里找到。

  1. 支持开发/生产模式
  2. 支持开发模式下 HMR
  3. 支持代码分割、代码混淆压缩
  4. 支持未引用代码删除
  5. 支持 less、autoprefixer
  6. 支持单/多入口
  7. 支持查看打包各个模块占用大小

Webpack4.0 升级配置相关推荐

  1. webpack4.0 babel配置遇到的问题

    babel配置 babel版本升级到8.x之后发现出现了很多问题. 首先需要安装 "@babel/core": "^7.1.2", "@babel/p ...

  2. webpack4.0配置记录(2)

    接上一篇webpack4.0配置记录(1),继续记录学习webpack配置. 定义环境变量 new Webpack.DefinePlugin({//用来定义全局环境变量DEV:JSON.stringi ...

  3. 史上最走心的Webpack4.0中级教程——配置之外你应该知道事

    [摘要] <webpack4.0各个击破系列>适合不满足于只会配置webpack但一时间又看不懂源码的中级读者.我没法保证这个系列是最好的,但至少能保证每一篇博文都跟那些Ctrl+C和Ct ...

  4. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第三讲mysql8.0安装配置升级(上)

    第三讲--mysql8.0安装配置升级专题(上) 此专题题目较多,因此分为上中下三部分来讲,此为上篇. 完整版题库请到我的资源中下载,此为传送门.https://download.csdn.net/d ...

  5. webpack4.0各个击破(2)—— CSS篇

    webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习we ...

  6. webpack4.0各个击破(8)—— tapable篇

    [摘要] webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点 ...

  7. sideeffects没配置css也还在,webpack4踩坑配置之sideEffects, 打包文件中没有css文件

    最开始先来讲一下sideEffects sideEffects sideEffects意为副作用,无副作用类似纯函数的概念(接受参数并返回值,不产生其他影响) 这里的副作用针对模块,如果一个模块单纯的 ...

  8. webpack4.0打包优化策略(二)

    打包优化策略 webpack4.0打包优化策略(一) webpack4.0打包优化策略(二) webpack4.0打包优化策略(三) 区分开发和生产环境 通常我们在开发网页时需要区分构建环境 开发环境 ...

  9. WSS2.0升级到WSS3.0

    WSS2.0升级到WSS3.0的过程: 1.检查服务器上面是否安装.Net Framework3.0(必须要安装的). 2.安装WSS3.0(安装后别做配置) 选择第一项(逐步升级),默认的是第二项( ...

最新文章

  1. rn php,rn怎样在PHP的正则表达式中匹配到?
  2. 北漂程序员的心酸:北漂六年了,没住过4000的房子
  3. MobileViT 网络测试
  4. Linux命令学习(三):文件操作命令(1)
  5. CodeForces - 1360H Binary Median(二分)
  6. sap.ushell.Container.getService.done的设计思路
  7. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  8. oppo 手机侧滑快捷菜单_关于oppo手机菜单键调出的方法,原来是这样的
  9. LeetCode 524. Longest Word in Dictionary through Deleting
  10. 解决百度富文本框中添加的表格页面获取后不显示表格边框的问题
  11. python语法错误怎么办_Python中出现语法错误时解决方法
  12. PowerApps关于试用环境
  13. Python自动化运维 - day9 - 进程与线程
  14. 【★】生成树算法终极解析!
  15. 不输给MacBook的win10精确式触摸板
  16. 电脑如何批量下载哔哔视屏_我是电脑哔哔哔哔哔
  17. DDR4时序标准规范(一)
  18. Vim配置及使用技巧
  19. 追光者计算机 音乐,追光者歌曲
  20. Linux判断服务进程存在,存在则重启,不存在则启动

热门文章

  1. 【JZOJ4811】【NOIP2016提高A组五校联考1】排队
  2. 发短信的简单实现——C#版
  3. Codeforces Educational Codeforces Round 3 D. Gadgets for dollars and pounds 二分,贪心
  4. RestClient使用
  5. ServletContext、ServletConfig(FilterConfig)学习笔记
  6. virtual hust 2013.6.20 数论基础题目 E - Uniform Generator
  7. Linux下的Notepad++编辑器——Notepadqq
  8. 技术圈儿001---分布式事务最经典的七种解决方案
  9. Netty工作笔记0028---NIO 网络编程应用--群聊系统3--客户端编写1
  10. RabbitMq学习笔记003---RabbitMQ处理类型分类