前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue路由懒加载

Vue路由懒加载

原创
作者头像
WindRunnerMax
修改2020-10-27 10:27:32
1.4K0
修改2020-10-27 10:27:32
举报
文章被收录于专栏:Czy‘s Blog

Vue路由懒加载

对于SPA单页应用,当打包构建时,JavaScript包会变得非常大,影响页面加载速度,将不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这就是路由的懒加载。

实现方式

Vue异步组件

Vue允许以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。

代码语言:txt
复制
Vue.component("async-example", function (resolve, reject) {

  setTimeout(function() {

    // 向 `resolve` 回调传递组件定义

    resolve({

      template: "<div>I am async!</div>"

    })

  }, 1000)

})

这个工厂函数会收到一个resolve回调,这个回调函数会在你从服务器得到组件定义的时候被调用,当然也可以调用reject(reason)来表示加载失败,此处的setTimeout仅是用来演示异步传递组件定义用。将异步组件和webpackcode-splitting功能一起配合使用可以达到懒加载组件的效果。

代码语言:txt
复制
Vue.component("async-webpack-example", function (resolve) {

  // 这个特殊的 `require` 语法将会告诉 webpack

  // 自动将你的构建代码切割成多个包,这些包

  // 会通过 Ajax 请求加载

  require(["./my-async-component"], resolve)

})

也可以在工厂函数中返回一个Promise,把webpack 2ES2015语法加在一起。

代码语言:txt
复制
Vue.component(

  "async-webpack-example",

  // 这个动态导入会返回一个 `Promise` 对象。

  () => import("./my-async-component")

)

事实上我们在Vue-Router的配置上可以直接结合Vue的异步组件和Webpack的代码分割功能可以实现路由组件的懒加载,打包后每一个组件生成一个js文件。

代码语言:txt
复制
{

  path: "/example",

  name: "example",

  //打包后,每个组件单独生成一个chunk文件

  component: reslove => require(["@/views/example.vue"], resolve)

}

动态import

Webpack2中,可以使用动态import语法来定义代码分块点split point,官方也是推荐使用这种方法,如果使用的是Bable,需要添加syntax-dynamic-import插件, 才能使Babel可以正确的解析语法。

代码语言:txt
复制
//默认将每个组件,单独打包成一个js文件

const example = () => import("@/views/example.vue")

有时我们想把某个路由下的所有组件都打包在同一个异步块chunk中,需要使用命名chunk一个特殊的注释语法来提供chunk name,需要webpack > 2.4

代码语言:txt
复制
const example1 = () => import(/\* webpackChunkName: "Example" \*/ "@/views/example1.vue");

const example2 = () => import(/\* webpackChunkName: "Example" \*/ "@/views/example2.vue");

事实上我们在Vue-Router的配置上可以直接定义懒加载。

代码语言:txt
复制
{

  path: "/example",

  name: "example",

  //打包后,每个组件单独生成一个chunk文件

  component: () => import("@/views/example.vue")

}

webpack提供的require.ensure

使用webpackrequire.ensure,也可以实现按需加载,同样多个路由指定相同的chunkName也会合并打包成一个js文件。

代码语言:txt
复制
// require.ensure(dependencies: String[], callback: function(require), chunkName: String)

{

    path: "/example1",

    name: "example1",

    component: resolve => require.ensure([], () => resolve(require("@/views/example1.vue")), "Example")

},

{

    path: "/example2",

    name: "example2",

    component: resolve => require.ensure([], () => resolve(require("@/views/example2.vue")), "Example")

}

每日一题

代码语言:txt
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:txt
复制
https://zhuanlan.zhihu.com/p/46843949

https://www.jianshu.com/p/c27b1640a01b

https://juejin.im/post/6844904025746309127

https://juejin.im/post/6844904013842874376

https://segmentfault.com/a/1190000011519350

https://cn.vuejs.org/v2/guide/components-dynamic-async.html

https://router.vuejs.org/zh/guide/advanced/lazy-loading.htm

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vue路由懒加载
    • 实现方式
      • Vue异步组件
      • 动态import
      • webpack提供的require.ensure
    • 每日一题
      • 参考
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档