[TOC]
懒加载
在开发中,经常会遇到这样的需求:比如在React,Vue中的路由加载组件,如果在首次加载的时候,就将一堆的组件全部加载,毫无疑问在打开首页的时候会非常的慢,影响用户体验。为了实现第一次快速的加载,优化用户体验,可以通过动态路由。就是第一次只会加载一些必须的组件,剩下的组件等到需要的时候再去加载。使用webpack提供的require.ensure()
可以轻松实现这一要求。
语法
require.ensure(dependencies: String[], callback: function(require), chunkName: String)
参数解释
- dependencies: 一个字符串数组,在callback中的代码执行之前需要加载的依赖模块
- callback: 当dependencies中的模块全部加载完毕之后,执行callback中的代码。callback中会传入一个require函数,我们可以在callback中使用这个require()函数引入其他的依赖模块
- chunkName(可选): 通过require.ensure()生成的模块的名称。在不同的require.ensure()中传入相同的chunkName,可以保证依赖模块按正确的顺序引入到require.ensure()生成的模块中
假如我们有如下的目录结构1
2
3
4
5
6
7
8
9file structure
|
js --|
| |-- entry.js
| |-- a.js
| |-- b.js
webpack.config.js
|
dist
1 | \\entry.js |
1 | \\webpack.config.js |
编译后,我们发现dist下有bundle.js和0.bundle.js。
entry.js 和 a.js被编译到bundle.js。
b.js被编译到0.bundle.js。
关于require.ensure()需要注意的点
- 空数组作为参数
1
2
3require.ensure([], function(require){
require('./a.js')
})
上面的代码,webpack会创建一个模块,并且a.js被分割到这个模块中
依赖作为参数
1
2
3require.ensure(['./a.js'], function(require){
require('./b.js')
})上面的代码,a.js,b.js会被编译到一个共同的模块中,并且从entry.js中分割出来。
但是只有b.js中的内容被执行,a.js中的内容并不会执行。如果需要执行a.js,那么我们必须通过像这样require('./a.js')
以同步的方式来引入a.js。