在webpack中使用Code Splitting--代码分割来实现vue中的懒加载

Vue应用程序愈来愈大,使用Webpack的代码分割懒加载组件,路由或者Vuex模块, 只有在须要时候才加载代码。html

咱们能够在Vue应用程序中在三个不一样层级应用懒加载和代码分割:vue

可是他们都有一些共同之处:自webpack2.0版本以后,他们都使用动态导入[译者注:也能够参考这个]。webpack

Vue组件中的懒加载

这在Egghead上的"使用Vue异步组件按需加载组件"视频中有很好的解释。
这就像在注册组件时使用import函数同样简单:git

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

并在本地注册使用:es6

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

经过包装import函数进入到箭头函数,Vue将会在它被请求的时候执行加载这个模块。github

若是组件导入使用命名导出[译者注:模块的导入导出,能够参考阮老师的文章],则能够在返回的Promise上使用对象解构。
例如,对于来自KeenUI的UiAlert组件:web

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

Vue路由中的懒加载

Vue路由器内置支持懒加载。这就像用import函数导入组件同样简单。看个例子,咱们想在 /login 路由中使用懒加载一个Login组件:vuex

// Instead of: import Login from './login'
// 替换: import Login from './login'
const Login = () => import('./login')

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

懒加载Vuex模块

Vuex有一种registerModule方法能够让咱们动态地建立Vuex模块。若是咱们考虑到该import功能将ES模块做为有效载荷返回promise[原文: If we take into account that import function returns a promise with the ES Module as the payload],咱们能够使用它来懒加载模块:promise

const store = new Vuex.Store()

...

// Assume there is a "login" module we wanna load
// 设想 咱们须要加载一个"login"模块
import('./store/login').then(loginModule => {
  store.registerModule('login', loginModule)
})

结论

Vue和Webpack使用懒加载很是简单。使用您刚刚阅读的内容,您能够从不一样方面开始分割应用程序,并在须要时加载应用程序,从而减轻应用程序的初始加载。less

ps: 这篇文章,基本上是翻译过来的。感谢做者Alex Jover
原文连接:
Lazy Loading in Vue using Webpack's Code Splitting

其余文章:
weiqinl
简书

相关文章
相关标签/搜索