在Vue中使用Webpack的Code Splitting进行懒加载(译)

563 阅读2分钟

当一个Vue应用越来越大,通过使用Webpack的代码分离来懒加载组件、路由、Vuex等模块会加快加载所需代码块的速度。

我们可以通过三个不同的层级在Vue应用中应用懒加载和代码分离:

在这三个层级使用懒加载和代码分离有一个共同点就是:都需要使用动态加载

在组件运用懒加载

“Load components when needed with Vue async components”

注册组件的时候用import函数导入组件:

Vue.component('AsyncCmp', () => import('./AsyncCmp'))

使用局部注册:

new Vue({
    // ...
    components: {
        'AsyncCmp': () => import('./AsyncCmp')
    }
})

在箭头函数中返回import函数,然后Vue会在运用到该组件的时候执行import

如果组件加载时用到了命名导出,可以对返回的Promise对象使用解构赋值,举个例子,从KeenUI中导入UiAlert组件:

...
components: {
    UiAlert: () => import('keen-ui').then(({ UiAlert }) => UiAlert)
}
...

在路由运用懒加载

Vue-router已经内置支持了懒加载,跟组件懒加载一样用import函数就可以了,假设我们想要在/login路由中懒加载Login组件:

// 取代:import Login from './login'
const Login = () => import('./login')

new VueRouter({
    routes: [
        { path: '/login', component: Login }
    ]
})

懒加载Vuex模块

Vuex有一个registerModule方法可以动态创建一个Vuex模块。因为import函数会返回一个带有ES Module作为载荷的promise对象,我们可以使用它来懒加载模块:

const store = new Vuex.Store()

...

// 假设我们想要加载一个login模块
import('./store/login').then(loginModule => {
    store.registerModule('login', loginModule)
})

总结

在Vue和Webpack下使用懒加载非常简单,运用刚才学的东西你可以分割你的代码成代码块然后按需加载,从而减轻应用的首次加载。

原文:Lazy Loading in Vue using Webpack's Code Splitting