专栏名称: lili21
目录
相关文章推荐
半导体行业联盟  ·  这个90后,和任正非马云雷军并排!凭什么? ·  2 天前  
半导体行业联盟  ·  芯片首富,火了! ·  2 天前  
OFweek维科网  ·  利润暴涨396%!这一激光厂商连斩巨头订单 ·  2 天前  
OFweek维科网  ·  获赔260万元!OPPO法务出手 ·  昨天  
51好读  ›  专栏  ›  lili21

webpack 4升级指南

lili21  · 掘金  ·  · 2018-03-15 10:23

正文

webpack 4发布也有一段时间了,虽然官方的文档,升级指南都没有完成,部分插件适配webpack 4的开发也还在进行中,但对于一个资深前端配置工程师,大刀早已饥渴难耐,所以就出一份非官方升(cai)级(keng)指南吧。

我没时间看你废话,给我一份配置

webpack 4做了很多改进,我就挑一些我比较关心的点来展开

0CJS

随着像 parcel 这样零配置,开箱即用打包工具的流行,被人吐槽难用,难懂,难配置的webpack显然感受到了压力,在4.0的版本中,给部分配置加上了默认值,并引入了 mode 概念,为开发,及生产环境提供两种不同的默认配置,极大的简化了webpack的配置。在4.0版本中,你甚至不需要配置,即可使用(虽然没什么用)。

默认值

1
2
3
4
5
6
7
module.exports = {
entry: 'src/',
outpu: {
filename: '[name].js',
path: 'dist/'
}
}

webpack 4中引入的 mode 是必需设置的(如果没有设置,会报警),你可以通过 webpack --mode ... 来设置,也可以通过 webpack.config.js 来设置。

1
2
3
module.exports = {
mode: 'development' // development || production
}

mode 也是为了简化配置项,不同的 mode 会为我们设置不同的默认配置,就不需要我们一个个去分别配置了。

开发模式更关注开发体验:

  • 更利于浏览器调试
  • 更快的增量编译速度
  • 更详细的报错消息

生成模式更关注用户体验:

  • 性能(文件大小,运行性能,打包速度)

详细的说明可以参考 这篇文章

Loader与Plugin

loader的其实没有什么变化,我用到的loader升级到最新版都可以直接用,有些甚至不用升级。变化比较大的是plugin。
webpack 4使用了新的插件体系,导致之前的插件基本都是需要改的,那么这些插件目前对webpack 4的支持如何呢?

  • [email protected]

    issue list 可以看到,问题还是比较多的。
    我自己遇到的问题是,在配合 splitChunks (后面会讲到)时,会生成0kb的css文件, issue
    对于这个问题,我已经提了 PR 了。

    官方出了一个 mini-css-extract-plugin ,但是这个问题更多,不支持HMR,不支持 contenthash ,所以目前基本没法用。

  • [email protected] +

    这个插件目前是支持webpack 4的,只是他自己的插件不一定支持,这个在升级的时候需要注意

  • uglifyjs-webpack-plugin

    这个插件目前也是支持webpack 4的。其实在 production 模式下,代码是默认会压缩的。当然,如果你有更细致的自定义需求,就可以用到这个插件。

RIP CommonsChunkPlugin

上面讲到的都是一些第三方的插件改动,而改动最大,影响也最大的就是webpack 4使用 optimization.splitChunks 替代了 CommonsChunkPlugin ,并且支持移除了 CommonsChunkPlugin ,所以这部分迁移起来比较麻烦。

对于各位配置工程师来说, CommonsChunkPlugin 应该是很熟悉了,我们主要用他来抽取代码中的共用部分, webpack runtime 之类的代码,结合 chunkhash ,实现最好的缓存策略。而这一部分,也是webpack支持的比较差的,这个几乎三岁的 issue ,至今还没有解决。对这个问题比较感兴趣的,可以拜读一下这篇 文章 。我这里就不展开了,直接贴一份 CommonsChunkPlugin 时代解决这个问题的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module.exports = {
...
plugins: [
...
new webpack.HashedModuleIdsPlugin(),

new webpack.NamedChunksPlugin(chunk => {
if (chunk.name) {
return chunk.name
} else {
return 'faceless-chunk' // a chunk has no name
}
}),

new webpack.optimize.CommonsChunkPlugin({






请到「今天看啥」查看全文