vue2+vue-router3.x路由懒加载review

56 阅读3分钟

背景:

本人最近在做公司一个移动端的项目,设备系统是比较老的andorid7.1,所以性能就一般;既然设备性能不咋地,那就更需要在性能上优化,使用公司的脚手架本来以为路由是默认懒加载的,进去咋一看,好家伙原来是非懒加载模式.....那就自己搞下咯~

先来看下官网是怎么说的:

image.png

概况一下就是:如果你的项目太大,到时候打出的app.js包会无比的大,加载时间会很长,导致你写的项目在启动时首页白屏时间很长(特别是网络环境不好以及老设备上,你会深有体会),用户体验极其不好!

非懒加载会在工程打包时全部打入一个js文件中,在页面初始化时进行全部加载

看下非懒加载写法:

import Bar from './views/Bar.vue

routes = [
  {
    name: 'bar',
    path: '/bar',
    component: Bar
  }
]

非懒加载打包文件全部在一个app.js文件中

image.png

路由懒加载:

1、ES6的import()方法(官网推荐): 使用import可进行组件按需加载,并可指定webpackChunkName进行打包代码按组分块

没有指定webpackChunkName,每个组件打包成一个js文件。
const Foo = () => import('../components/Foo')
const Aoo = () => import('../components/Aoo')
指定了相同的webpackChunkName,会合并打包成一个js文件。
const Foo = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '../components/Foo')
const Aoo = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '../components/Aoo')

2、vue异步组件resolve: 主要使用了resolve的异步机制,用require代替了import,实现按需加载:

const 组件名 = resolve = require(['组件路径'], resolve)
const home = resolve => require(['../view/home'],resolve)

3、webpack提供的require.ensure()实现懒加载

说明:

1、多个路由时可指定相同的chunkName合并打包成一个js文件

2、第一个参数是数组,表明第二个参数里需要依赖的模块,这些会提前加载。

3、第二个是回调函数,在这个回调函数里面require的文件会被单独打包成一个chunk,不会和主文件打包在一 起,这样就生成了两个chunk,第一次加载时只加载主文件。

4、第三个参数是错误回调。(可选)

5、第四个参数是单独打包的chunk的文件名(可选,不传时打包命名采用哈希)

// 使用require.ensure()引入模块实现懒加载
const Hello = resolve => require.ensure([], () => resolve(require('@/components/HelloWorld.vue')), 'hello')
// 指定相同的chunkName名可打包成一个文件
const Bar = resolve => require.ensure([], () => resolve(require('@/components/MyBar.vue'), 'test'), 'bar')
const Foo = resolve => require.ensure([], () => resolve(require('@/components/MyFoo.vue'), 'test'), 'foo')

export default new Router({
  routes: [
    {
      path: '/',
      redirect: '/hello'
    },
    {
      path: '/hello',
      name: 'HelloWorld',
      component: Hello
    },
    {
      path: '/bar',
      name: 'MyBar',
      component: Bar
    },
    {
      path: '/foo',
      name: 'Foo',
      component: Foo
    },
  ]
})

下面以ensure为例子看下实际效果:

看打包过后的文件,相对非懒加载多出了动态引入的文件,同一chunkName则合并成同一个js文件;

image.png

在进入页面时,重定向到hello页面,此时foo与bar合并的test.js文件是还没有加载的:

image.png 在点击切换到foo或者bar时,才请求加载test.js:

image.png