webpack - code splitting

Posted 快饿死的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack - code splitting相关的知识,希望对你有一定的参考价值。

Code splitting is one of the most compelling features of webpack. This feature allows you to split your code into various bundles which can then be loaded on demand or in parallel. It can be used to achieve smaller bundles and control resource load prioritization which, if used correctly, can have a major impact on load time.

通俗来说就是把代码分成很多很多块(chunk)。

那为什么要分块呢?

之前,为了减少http请求,我们就把所有代码打包成一个单独的JS文件。但是如果JS文件过大的话,下载速度就很慢,得不偿失。

因此webapck实现了把代码分块,需要某块代码的时候再去加载。

Code Splitting主要有三种方法:

1.  Entry Points : Manually split code using entry configuration(通过增加入口文件)

2. Prevent Duplication : Use SplitChunksPlugin to dedupe and split chunks

3.Dynamic Import: Split code via inline function calls within modules

方法一就是增加入口文件

Project

index.js

 

print.js

 

webpack.common.js

 

运行结果:

 

 

这种方法最简单,但是有很多缺陷,看着很难受

1. index.js和print.js文件都引入了lodash,重复的lodash module会被加载两次

2.它很不灵活,不能动态的分隔业务和核心应用

此刻我们需要把公共的lodash module提取出来。那我们就可以使用SplitChunksPlugin这个插件了

2. 防止重复,提取公共依赖
webpack.config.js

webpack4已经弃用CommonChunkPlugin了,使用SplitChunkPlugin就可以了

 运行结果:

 

 

 相比上一次。运行时间少了100多ms, app.bundle.js和print.bundle.js的size都小了很多,lodash已经从这两个文件中移除了。

但是这种方法还不能做到按需加载

 

3. Dynamic Imports 动态导入

使用import(),在webpack中的import()是个分离点——split-point,用来把被请求的模块独立成一个单独的模块。

import()把模块的名字作为一个参数,并且返回一个Promise: import(name)->Promise.

run : npm run server

显然看到lodash没有打包在app.bundle.js文件里面。

 

以上是关于webpack - code splitting的主要内容,如果未能解决你的问题,请参考以下文章

[Webpack 2] Maintain sane file sizes with webpack code splitting

利用Webpack插件进行前端code-splitting

[转] react-router4 + webpack Code Splitting

在Webpack中使用Code Splitting实现按需加载

webpack优化之code splitting

vuejs code splitting with webpack 3种模式