2
2
3
3
当打包构建应用时,Javascript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
4
4
5
- 结合 Vue 的 [ 异步组件] ( http://vuejs.org/guide/components.html#Async-Components ) 和 Webpack 的 [ code splitting feature] ( https://doc.webpack-china.org// guides/code-splitting-async/#require-ensure-/ ) , 轻松实现路由组件的懒加载。
5
+ 结合 Vue 的 [ 异步组件] ( http://vuejs.org/guide/components.html#Async-Components ) 和 Webpack 的 [ code splitting feature] ( https://doc.webpack-china.org/guides/code-splitting-async/#require-ensure-/ ) , 轻松实现路由组件的懒加载。
6
6
7
- 我们要做的就是把路由对应的组件定义成异步组件:
7
+ 首先,可以将异步组件定义为返回一个 Promise 的工厂函数(该函数返回的Promise应该 resolve 组件本身):
8
+
9
+
10
+ ``` js
11
+ const Foo = () => Promise .resolve ({ /* 组件定义对象 */ })
12
+ ```
13
+
14
+ 第二,在 webpack 2中,我们可以使用[ 动态 import] ( https://github.com/tc39/proposal-dynamic-import ) 语法来定义代码分块点(split point):
8
15
9
16
``` js
10
- const Foo = resolve => {
11
- // require.ensure 是 Webpack 的特殊语法,用来设置 code-split point
12
- // (代码分块)
13
- require .ensure ([' ./Foo.vue' ], () => {
14
- resolve (require (' ./Foo.vue' ))
15
- })
16
- }
17
+ import (' ./Foo.vue' ) // returns a Promise
17
18
```
18
19
19
- 这里还有另一种代码分块的语法,使用 AMD 风格的 require,于是就更简单了:
20
+ > 注意:如果您使用的是 babel,你将需要添加[ syntax-dynamic-import] ( http://babeljs.io/docs/plugins/syntax-dynamic-import/ ) 插件,才能使 babel 可以正确地解析语法
21
+
22
+ 结合这两者,这就是如何定义一个能够被 webpack自动代码分割的异步组件
20
23
21
24
``` js
22
- const Foo = resolve => require ([ ' ./Foo.vue' ], resolve )
25
+ const Foo = () => import ( ' ./Foo.vue' )
23
26
```
24
27
25
- 不需要改变任何路由配置,跟之前一样使用 ` Foo ` :
28
+ 在路由配置中什么都不需要改变,只需要像往常一样使用 ` Foo ` :
26
29
27
30
``` js
28
31
const router = new VueRouter ({
@@ -32,14 +35,16 @@ const router = new VueRouter({
32
35
})
33
36
```
34
37
38
+
35
39
### 把组件按组分块
36
40
37
- 有时候我们想把某个路由下的所有组件都打包在同个异步 chunk 中。只需要 [ 给 chunk 命名] ( https://webpack.js.org/guides/code-splitting-require/#chunkname ) ,提供 ` require.ensure ` 第三个参数作为 chunk 的名称:
41
+ 有时候我们想把某个路由下的所有组件都打包在同个异步块(chunk)中。只需要使用 [ 命名 chunk] ( https://webpack.js.org/guides/code-splitting-require/#chunkname ) ,一个特殊的注释语法来提供chunk name(需要webpack > 2.4)
42
+
38
43
39
44
``` js
40
- const Foo = r => require . ensure ([], () => r ( require ( ' ./Foo.vue' )), ' group-foo ' )
41
- const Bar = r => require . ensure ([], () => r ( require ( ' ./Bar.vue' )), ' group-foo ' )
42
- const Baz = r => require . ensure ([], () => r ( require ( ' ./Baz.vue' )), ' group-foo ' )
45
+ const Foo = () => import ( /* webpackChunkName: "group-foo" */ ' ./Foo.vue' )
46
+ const Bar = () => import ( /* webpackChunkName: "group-foo" */ ' ./Bar.vue' )
47
+ const Baz = () => import ( /* webpackChunkName: "group-foo" */ ' ./Baz.vue' )
43
48
```
44
49
45
- Webpack 将相同 chunk 下的所有异步模块打包到一个异步块里面 —— 这也意味着我们无须明确列出 ` require.ensure ` 的依赖(传空数组就行) 。
50
+ webpack 会将任何一个异步模块与相同的块名称组合到相同的异步块中 。
0 commit comments