当前位置: 首页 > news >正文

今天面试被问到的问题

一.vue项目实现路由按需加载(路由懒加载)的3种方式

  • vue异步组件
  • es提案的import()
  • webpack的require,ensure()

1.vue异步组件技术 ==== 异步加载
vue-router配置路由 , 使用vue的异步组件技术 , 可以实现按需加载 .
但是,这种情况下一个组件生成一个js文件

/* vue异步组件技术 */
{
  path: '/home',
  name: 'home',
  component: resolve => require(['@/components/home'],resolve)
},{
  path: '/index',
  name: 'Index',
  component: resolve => require(['@/components/index'],resolve)
},{
  path: '/about',
  name: 'about',
  component: resolve => require(['@/components/about'],resolve)
} 

2.组件懒加载方案二 路由懒加载(使用import)

// 下面2行代码,没有指定webpackChunkName,每个组件打包成一个js文件。
/* const Home = () => import('@/components/home')
const Index = () => import('@/components/index')
const About = () => import('@/components/about') */
// 下面2行代码,指定了相同的webpackChunkName,会合并打包成一个js文件。 把组件按组分块
const Home =  () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/home')
const Index = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/index')
const About = () => import(/* webpackChunkName: 'ImportFuncDemo' */ '@/components/about')

{
  path: '/about',
  component: About
}, {
  path: '/index',
  component: Index
}, {
  path: '/home',
  component: Home
}

3.webpack提供的require.ensure()
vue-router配置路由,使用webpack的require.ensure技术,也可以实现按需加载。
这种情况下,多个路由指定相同的chunkName,会合并打包成一个js文件。

/* 组件懒加载方案三: webpack提供的require.ensure() */
{
  path: '/home',
  name: 'home',
  component: r => require.ensure([], () => r(require('@/components/home')), 'demo')
}, {
  path: '/index',
  name: 'Index',
  component: r => require.ensure([], () => r(require('@/components/index')), 'demo')
}, {
  path: '/about',
  name: 'about',
  component: r => require.ensure([], () => r(require('@/components/about')), 'demo-01')
}

路由懒加载原理:

路由懒加载的主要原理就是原本的Vue模块是全部导入在一起的打包文件,运行后用户查看相关模块显示的内容时会将整个打包的文件引入而后在其中查找对应的模块然后才将其呈现给用户。这样会使得在打包文件中查找对应模块时在浏览器中可能会出现短暂的空白页,从而降低用户体验。而路由懒加载是将各个模块分开打包,在用户查看下相关模块内容时就直接引入相关模块的打包文件然后进行显示,从而有效的解决了浏览器可能出现短暂时间空白页的情况。
 

二.图片懒加载的原理

图片懒加载
先将 img 标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再 img 标签的自定义属性中(比如data-src)。当js监听到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中,达到懒加载的效果。
实现图片懒加载有四个步骤,如下:
1.加载loading图片
2.判断哪些图片要加载【重点】
3.隐形加载图片
4.替换真图片
图片懒加载的原理:
一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的src属性,所以实现懒加载的关键就是,在图片没有进入可视区域时,先不给<img>的src赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给src赋值。
图片懒加载的原理就是我们先设置图片的 data-src 属性(当然也可以是其他任意的,只要不会发送 http 请求就行了,作用就是为了存取值)值为其图片路径,由于不是 src,所以不会发送 http 请求。 然后我们计算出页面 scrollTop 的高度和浏览器的高度之和, 如果图片举例页面顶端的坐标 Y(相对于整个页面,而不是浏览器窗口)小于前两者之和,就说明图片就要显示出来了(合适的时机,当然也可以是 其他情况),这时候我们再将data-src属性替换为 src 属性即可

js代码如下:


// onload是等所有的资源文件加载完毕以后再绑定事件
window.onload = function(){
    // 获取图片列表,即img标签列表
    var imgs = document.querySelectorAll('img');

    // 获取到浏览器顶部的距离
    function getTop(e){
        return e.offsetTop;
    }

    // 懒加载实现
    function lazyload(imgs){
        // 可视区域高度
        var h = window.innerHeight;
        //滚动区域高度
        var s = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i=0;i<imgs.length;i++){
            //图片距离顶部的距离大于可视区域和滚动区域之和时懒加载
            if ((h+s)>getTop(imgs[i])) {
                // 真实情况是页面开始有2秒空白,所以使用setTimeout定时2s
                (function(i){
                    setTimeout(function(){
                        // 不加立即执行函数i会等于9
                        // 隐形加载图片或其他资源,
                        //创建一个临时图片,这个图片在内存中不会到页面上去。实现隐形加载
                        var temp = new Image();
                        temp.src = imgs[i].getAttribute('data-src');//只会请求一次
                        // onload判断图片加载完毕,真是图片加载完毕,再赋值给dom节点
                        temp.onload = function(){
                            // 获取自定义属性data-src,用真图片替换假图片
                            imgs[i].src = imgs[i].getAttribute('data-src')
                        }
                    },2000)
                })(i)
            }
        }
    }
    lazyload(imgs);

    // 滚屏函数
    window.onscroll =function(){
        lazyload(imgs);
    }
}

相关文章:

  • 【JAVAEE框架】SpringMVC 项目起步讲解
  • 【牛客-算法】NC57 反转数字
  • 福昕电子签章服务正式上线:文档签,击穿第三方信息屏障
  • 智能座舱指数首发!入榜「TOP10自主品牌OEM」都有谁
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)
  • poi数据获取、学校poi分布、医院poi分布、公园分布、地铁分布、道路网
  • 【微服务】一篇文章带你打开微服务大门
  • 今年快30岁的我,还是选择了裸辞···
  • 数据导入与预处理-第6章-01数据清理
  • Nginx配置之https
  • 使用J-link OB工具需要注意的问题
  • Qt5开发从入门到精通——第十篇四节(Qt5 网络与通信—— 网页浏览器与文件下载)
  • Kubernetes 原理剖析与实战08 配置管理:Kubernete 管理业务配置方式有哪些?
  • 调用百度云语音转文本
  • 微信版大语言模型来了:跨时空对话李白、教你高情商说话,API在线试玩全都有...
  • 网络传输文件的问题
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Docker 笔记(2):Dockerfile
  • ES6--对象的扩展
  • Golang-长连接-状态推送
  • If…else
  • Java 内存分配及垃圾回收机制初探
  • Java教程_软件开发基础
  • Kibana配置logstash,报表一体化
  • laravel 用artisan创建自己的模板
  • Mybatis初体验
  • mysql 数据库四种事务隔离级别
  • MySQL用户中的%到底包不包括localhost?
  • python_bomb----数据类型总结
  • Python学习笔记 字符串拼接
  • TCP拥塞控制
  • yii2权限控制rbac之rule详细讲解
  • 模型微调
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 硬币翻转问题,区间操作
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​io --- 处理流的核心工具​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (02)Hive SQL编译成MapReduce任务的过程
  • (09)Hive——CTE 公共表达式
  • (1)(1.9) MSP (version 4.2)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四) Graphivz 颜色选择
  • (五)关系数据库标准语言SQL
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (译) 函数式 JS #1:简介
  • (原創) 物件導向與老子思想 (OO)
  • 、写入Shellcode到注册表上线
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core中Emit的使用
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接