全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue2组件实现懒加载浅析

一、 什么是懒加载

懒加载也叫延迟加载,即在需要的时候进行加载,随用随载。

二、为什么需要懒加载

在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,延时过长,不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的分担首页所承担的加载压力,减少首页加载用时

三、如何与webpack配合实现组件懒加载

1、在webpack配置文件中的output路径配置chunkFilename属性

output: {

    path: resolve(__dirname, 'dist'),

    filename: options.dev ? '[name].js' : '[name].js?[chunkhash]',

    chunkFilename: 'chunk[id].js?[chunkhash]',

    publicPath: options.dev ? '/assets/' : publicPath

  }, 

chunkFilename路径将会作为组件懒加载的路径

2、配合webpack支持的异步加载方法

  • resolve => require([URL], resolve), 支持性好
  • () => system.import(URL) , webpack2官网上已经声明将逐渐废除, 不推荐使用
  • () => import(URL), webpack2官网推荐使用, 属于es7范畴, 需要配合babel的syntax-dynamic-import插件使用, 具体使用方法如下

复制代码 代码如下:
npm install --save-dev babel-core babel-loader babel-plugin-syntax-dynamic-import babel-preset-es2015

use: [{

    loader: 'babel-loader',

    options: {

     presets: [['es2015', {modules: false}]],

     plugins: ['syntax-dynamic-import']

    }

   }] 

四、具体实例中实现懒加载

1、路由中配置异步组件

export default new Router({

  routes: [

    {

      mode: 'history',

      path: '/my',

      name: 'my',

      component: resolve => require(['../page/my/my.vue'], resolve),//懒加载

    },

  ]

}) 

2、实例中配置异步组件

components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

    //historyTab: () => import('../../component/historyTab/historyTab.vue')

  }, 

3、全局注册异步组件

Vue.component('mideaHeader', () => {

  System.import('./component/header/header.vue')

}) 

五、配置异步组件实现懒加载的问题分析

1、多次进出同一个异步加载页面是否会造成多次加载组件?

答:否,首次需要用到组件时浏览器会发送请求加载组件,加载完将会缓存起来,以供之后再次用到该组件时调用

2、在多个地方使用同一个异步组件时是否造成多次加载组件?如:

//a页面

export default {

  components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

  },

}
//b页面

export default {

  components: {

    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载

  },

} 

答:否,理由同上

3、如果在两个异步加载的页面中分别同步与异步加载同一个组件时是否会造成资源重用? 如:

//a页面
import historyTab from '../../component/historyTab/historyTab.vue';
export default {
  components: {
    historyTab
  },
}

//b页面
export default {
  components: {
    historyTab: resolve => {require(['../../component/historyTab/historyTab.vue'], resolve)},//懒加载
  },
}

答: 会, 将会造成资源重用, 根据打包后输出的结果来看, a页面中会嵌入historyTab组件的代码, b页面中的historyTab组件还是采用异步加载的方式, 另外打包chunk;

解决方案: 组件开发时, 如果根页面没有导入组件的情况下,而是在其他异步加载页面中同时用到组件, 那么为实现资源的最大利用,在协同开发的时候全部人都使用异步加载组件

4、在异步加载页面中载嵌入异步加载的组件时对页面是否会有渲染延时影响?

答:会, 异步加载的组件将会比页面中其他元素滞后出现, 页面会有瞬间闪跳影响;

解决方案:因为在首次加载组件的时候会有加载时间, 出现页面滞后, 所以需要合理的进行页面结构设计, 避免首次出现跳闪现象;

六、懒加载的最终实现方案

1、路由页面以及路由页面中的组件全都使用懒加载

优点:(1)最大化的实现随用随载

   (2)团队开发不会因为沟通问题造成资源的重复浪费    

缺点:(1)当一个页面中嵌套多个组件时将发送多次的http请求,可能会造成网页显示过慢且渲染参差不齐的问题

2、路由页面使用懒加载, 而路由页面中的组件按需进行懒加载, 即如果组件不大且使用不太频繁, 直接在路由页面中导入组件, 如果组件使用较为频繁使用懒加载

优点:(1)能够减少页面中的http请求,页面显示效果好

缺点:(2)需要团队事先交流, 在框架中分别建立懒加载组件与非懒加载组件文件夹

3、路由页面使用懒加载,在不特别影响首页显示延迟的情况下,根页面合理导入复用组件,再结合方案2

优点:(1)合理解决首页延迟显示问题

        (2)能够最大化的减少http请求, 且做其他他路由界面的显示效果最佳

缺点:(1)还是需要团队交流,建立合理区分各种加载方式的组件文件夹

七、采用第三种方案进行目录结构设计

  

八、具体代码实现设计

1、路由设计:

import Router from 'vue-router';
import Vue from 'vue';
Vue.use(Router);

export default new Router({
  routes: [
    {
      mode: 'history',
      path: '/home',
      name: 'home',
      component: resolve => require([URL], resolve),//懒加载
      children: [
        {
          mode: 'history',
          path: '/home/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
    {
      mode: 'history',
      path: '/store',
      name: 'store',
      component: resolve => require(['../page/store/store.vue'], resolve),//懒加载,
      children: [
        {
          mode: 'history',
          path: '/store/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
    {
      mode: 'history',
      path: '/my',
      name: 'my',
      component: resolve => require(['../page/my/my.vue'], resolve),//懒加载,
      children: [
        {
          mode: 'history',
          path: '/my/:name',
          name: 'any',
          component: resolve => require(['../page/any/any.vue'], resolve),//懒加载
        },
      ]
    },
  ]
})

(1)首层的路由根组件分别对应的tab页面

(2)根目录后跟着各个子路由页面,子路由采用动态路由配合路由的编程式导航再加上vuex,最优化提高开发效率

直接贴上代码:

/**

 * Created by ZHANZF on 2017-3-20.

 */

//vuex配置

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({

  state: {

    //路由组件存储器

    routers: {}

  },

  getters: {

    routers: state => {

      return state.data;

    }

  },

  mutations: {

    //动态增加路由

    addRouter: (state, data) => {

      state.routers = Object.assign({}, state.routers, {

        [data.name]: data.component

      });

    }

  },

  actions: {

    acMethods({commit}) {

 

    }

  },

})

 

//根目录中注册路由组件

window.midea = {

  registerRouter(name, component) {

    Store.commit('addRouter', {

      name: name,

      component: component

    })

  }

};//页面使用路由导航 

openAnyPage() {
  midea.registerRouter('module', resolve => {require(['../module/module.vue'], resolve)});//懒加载
  this.$router.push({path: '/home/module', query: {title: this.title}});
}

//页面中使用动态组件 

<template>  

 <component :is="currentRouter" :moduleName="title">

</component> 

</template>

<script src="./any.js">

export default {

  data () {

    return {

      routeName: '',

      currentRouter: '',

      title: '',

    }

  },

  created() {

    this.routeName = this.$route.params.name;

    this.title = this.$route.query.title;

    this.currentRouter = this.$store.state.routers[this.routeName];

  },

  methods: { 

  }

}

</script> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue2  # 组件懒加载  # 懒加载  # vue  # vue3 vite异步组件及路由懒加载实战示例  # Vue自定义图片懒加载指令v-lazyload详解  # 详解vue2路由vue-router配置(懒加载)  # vue2笔记 — vue-router路由懒加载的实现  # vue实现一个懒加载的树状表格实例  # Vue2 中自定义图片懒加载指令 v-lazy实例详解  # 加载  # 将会  # 首页  # 会有  # 首次  # 多个  # 推荐使用  # 是否会  # 官网  # 情况下  # 是在  # 不太  # 再加上  # 参差不齐  # 如果没有  # 会比  # 则可  # 贴上  # 也叫  # 即在 


相关文章: 建站之星客服服务时间及联系方式如何?  公司网站设计制作厂家,怎么创建自己的一个网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  javascript中的try catch异常捕获机制用法分析  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  网站制作公司排行榜,抖音怎样做个人官方网站  如何制作算命网站,怎么注册算命网站?  网站制作员失业,怎样查看自己网站的注册者?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  高防服务器如何保障网站安全无虞?  高端建站如何打造兼具美学与转化的品牌官网?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在建站主机中优化服务器配置?  建站之星3.0如何解决常见操作问题?  大连网站设计制作招聘信息,大连投诉网站有哪些?  jQuery 常见小例汇总  网页设计与网站制作内容,怎样注册网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星2.7模板快速切换与批量管理功能操作指南  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何用PHP工具快速搭建高效网站?  免费视频制作网站,更新又快又好的免费电影网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何设置并定期更换建站之星安全管理员密码?  家具网站制作软件,家具厂怎么跑业务?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站主机是否等同于虚拟主机?  深圳网站制作培训,深圳哪些招聘网站比较好?  开心动漫网站制作软件下载,十分开心动画为何停播?  如何通过IIS搭建网站并配置访问权限?  常州企业建站如何选择最佳模板?  孙琪峥织梦建站教程如何优化数据库安全?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  已有域名和空间,如何快速搭建网站?  C#怎么使用委托和事件 C# delegate与event编程方法  北京企业网站设计制作公司,北京铁路集团官方网站?  如何使用Golang table-driven基准测试_多组数据测量函数效率  学校为何禁止电信移动建设网站?  建站之家VIP精选网站模板与SEO优化教程整合指南  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  建站之星伪静态规则如何设置?  重庆网站制作公司哪家好,重庆中考招生办官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。