# utils **Repository Path**: huangxiaolun/utils ## Basic Information - **Project Name**: utils - **Description**: 工具 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-16 - **Last Updated**: 2021-04-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 图片懒加载及底层原理 ##### 瀑布流无规则排列: ![image-20210416133335790](readImg/image-20210416133335790.png) **思路:** 第一次依次放,下次最高的放到最低的那一列,下次最低的图片放在最高列,每次3个这样下来最终高度相差无几 瀑布流里面数据一般都会返回宽高 没有自己处理 `代码见lazyloading-->js-->indexA.js` ##### 图片延迟加载 为啥要做图片延迟加载: *浏览器渲染页面* *1.构建dom树-构建cssom树-生成render-tree--布局--分层--栅格化--绘制* *2.构建dom树中遇到img* *老版本:阻碍dom渲染* *新版本:不会阻碍 每一个图片都会占一个http,拿回资源后和render tree一起渲染* *刚开始加载图片,一定会让页面渲染图片速度变慢(导致白屏)* *图片延迟加载:第一次不请求也不渲染图片,等页面加载完,其它资源都渲染好了,再去请求加载图片* ![image-20210416141403150](readImg/image-20210416141403150.png) **思路:** ```css //核心css .card a { display: block; } .card a .lazyImageBox { /* height: xxx; 如果是需要进行图片延迟加载,在图片不显示的时候,我们要让盒子的高度等于图片的高度,这样才能把盒子撑开(服务器返回给我们的数据中,一定要包含图片的高度和宽度) */ background: url("../images/default.gif") no-repeat center center #F4F4F4; overflow: hidden; } .card a .lazyImageBox img { width: 100%; opacity: 0; transition: opacity .3s ease; } ``` 每个图片有一个盒子,找到盒子里面的图片,第一次我们不直接渲染真实图片地址,通过地址赋值给自定义属性图片地址,等数据加载完成之后,再把自定义属性地址改成真实图片地址 **上面一下全部都加载了,没有处理是否出现在页面中** **接下来:把出现在视口中的图片做延迟加载** ![image-20210416143740524](readImg/image-20210416143740524.png) 图片位置情况:盒子顶部距离body的偏移,盒子本身的高度 window.onscroll 触发 -- 1+2的值 <= 浏览器高度+滚动条卷去的高度 `图片完全出现在浏览器` 浏览器可见高度+滚动条卷去的高度 - 1(盒子到body高度) < 2 `图片出现在浏览器一部分`* **以上是通过盒子模型的属性实现的** **getBoundingClientRect 实现懒加载 --进阶** ![image-20210416150356622](readImg/image-20210416150356622.png) ```js // 方式一 // 加载条件:盒子底边距离body距离(盒子+body顶部距离) <= 浏览器底边距离body距离 ---完全出现在浏览器中 /* let B = imgBox.offsetHeight + utils.offset(imgBox).top , A = winH + document.documentElement.scrollTop ; if(B <= A) { lazyImg(imgBox) //加载图片的逻辑 } */ // 方式二 getBoundingClientRect 兼容ok实际项目代替上面 let { bottom } = imgBox.getBoundingClientRect(); if (bottom <= winH) { lazyImg(imgBox) } ``` ##### 防抖节流 onscroll触发的频率太高,滚动一下可能要触发很多次,导致很多没必要的计算和处理消耗性能,我们需要降低onscroll的时候触发频率(节流) --但是还是有消耗 ##### 终极方案:intersectionObserve 移动端常用,性能超好,也不用搞节流,也不用获取自身和浏览器高度 ---pc端注意兼容性,可能要结合上面判断能不能用,能就用不能就用上面那种 练习代码:`1.html` 懒加载核心代码: ```js //监听一个dom对象,当这个dom对象,出现和离开视口的时候触发回调函数 let observer = new IntersectionObserver(changes => { changes.forEach(item => { let { isIntersecting, target } = item if (isIntersecting) { lazyImg(target) observer.unobserve(target) } }) }); function lazyFnc() { !lazyImageBox ? lazyImageBox = Array.from(document.querySelectorAll('.lazyImageBox')) : null lazyImageBox.forEach(imgBox => { observer.observe(imgBox) }) } ``` **还能做 ----下拉加载更多** 原理: 后面加一个元素,监听它 明白上面就懂了 ![image-20210416153304756](readImg/image-20210416153304756.png) #### 未来方案 img.loading = lazy (正常渲染) 只兼容:chrome 76以上 原理: 浏览器自己做的 ,只需要加上loading='lazy'就行了 ![image-20210416153613258](readImg/image-20210416153613258.png) **想所有图片加上loading就可以用了怎么做** ``` if('loading' in (new Image)){ console.log('支持') } // 下一步要做的事情:我们自己在不兼容的情况下,写一个插件,兼容它(其实就是自己去实现一套方法) typeof IntersectionObserve==='undefined' //这种支不支持 不支持就用盒子模型那种来做 很像vue2.0里面的 v-lazy ``` ## 基于vue实现大文件上传和断点续传 **文件上传有两套方案:** 1. 基于文件流 form-data element-ui上传组件默认基于文件流 (action=‘文件上传的地址’) 默认上传: 格式: multipart/form-data ![image-20210416164042028](image-20210416164042028.png) 数据格式:form-data file:文件流信息 filename:原始文件名字 ![image-20210416164125180](image-20210416164125180.png) ![image-20210416164016225](image-20210416164016225.png) ​ 2.客户端需要把文件转化为base64 (文件编码) ​ 针对element-ui upload组件 ​ 基于base上传 action 不传参--不自动上传 --用onChange事件 ​ onChange里面参数--这个对象不是file文件对象 就是一个对象-面的raw才是file文件对象 **步骤:** 把上传的文件先进行解析(fileReader)-把其转换base64编码格式-自己基于axios把信息传递给服务器 ```js //处理的方法 export function fileParse(file, type = "base64") { // 处理成文件流 --还可以是其它的 比如二进制数据 return new Promise((resolve) => { let fileRead = new FileReader(); if (type === "base64") { fileRead.readAsDataURL(file); } else if (type === "buffer") { fileRead.readAsArrayBuffer(file); } fileRead.onload = (ev) => { resolve(ev.target.result); }; }); } ``` ![image-20210416170839794](image-20210416170839794.png) ```js let result = await axios.post( "/single2", qs.stringify({ chunk: encodeURIComponent(res), //防止传输base64过程乱码 --参数是后端规定的 filename: file.name, }), { headers: { "Content-Type": "application/x-www-form-urlencoded", }, } ); ``` > 对于大文件怎么做 步骤:1.解析成Buffer数据 ​ 2.把文件切片:把一个文件分割成好几个部分(固定数量-或-固定大小) 每一个切片有自己的部分数据和自己的名字 eg: HASH-1.mp4 , HASH-2.mp4 ## EXCEL 上传excel -- 通过element-ul-->上传文件---读取excel(按照二进制-本地解析数据用二进制)---上传一般分为一下全部上传或一个一个上传 ![image-20210419103104562](readImg/image-20210419103104562.png) 导出excel---就是用xlsx这个插件转换成对应的excel格式 ,然后用里面的一个导出文件的方法 ,导出 。 ## 数据结构 #### 1. 几种实用基础的数据结构详解 **学习重点:理解概念底层思路** **概念** (了解) > 数据结构(data structure [ˈstrʌktʃə(r)] )是计算机存储、组织数据的方式;算法(algorithm [ˈælɡərɪðəm] )是解决问题的方法/步骤和策略; > > - 有穷性(Finiteness):必须能在执行有限个步骤之后终止 > - 确切性(Definiteness):每一步有确切的定义 > - 输入项(Input):有0个或多个输入,以刻画运算对象的初始情况 > - 输出项(Output):有一个或多个输出,以反映对输入数据加工后的结果 > - 可行性(Effectiveness):每个计算步骤都可以在有限时间内完成 ![Alt text](data:image/png;base64,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) **数组结构 Array** > JS中的数组结构非常的简单(已经是浏览器帮助我们进行封装处理好的) > > - 可以存储不同的数据类型值 > - 数组容量伴随存储的内容自动缩放 > - Array.prototype上提供很多供数组操作的方法 `优势`:基于索引直接进行查找和获取,效率很高 `弊端`:进行中间插入和删除操作时,性能非常低(数组塌陷和删除中间项的优化) **栈结构 Stack** (闭包--进出栈) > - **后进先出** LIFO(last in first out) > > - 只能在一端操作(顶端 front):包括增加(进栈)和删除(出栈) > > 进栈内容不能放在中间,也不能把中间某个东西出栈 > > - 递归算法中的无限递归会出现栈溢出 ![image-20210419163147339](readImg/image-20210419163147339.png) **数组模拟栈** ```js class Stack { container =[] //es7写法===constructor里面 //Stactk.prototype enter(element){ //进栈--放到顶部 this.container.unshift(element) } leave(){ //出栈 return this.container.shift() } size(){ return this.container.length } value(){ return this.container } } let sk = new Stack() ``` 有六个元素,按照 6 5 4 3 2 1 的顺序进栈(中间可以随时出栈),问哪一个出栈不是合法的:**c ** 画图 A: 5 4 3 6 1 2 B: 4 5 3 2 1 6 C: 3 4 6 5 2 1 D: 2 3 4 1 5 6 面试题2:十进制转二进制 现成方法: num.toString(2) ``` /* * NumberObject.toString(radix) * * 思路:把十进制数字和2整除(因为二进制是满2进1) * + 获取其余数 N%2 * + 获取其商数 N/2 (整除后的结果) * 用上一次的商数继续除以二,一直到商数为0为止;把所有的余数从尾部到顶部依次链接即可; */ ``` ![image-20210419162505520](readImg/image-20210419162505520.png) **队列结构 Queue** ![image-20210419163221673](readImg/image-20210419163221673.png) > - 先进先出 FIFO (First In First Out) > - 允许在前端(front)删除,允许在后端(rear)插入 > - 特殊:优先级队列 --同步异步 自己封装一个队列结构 ``` class Queue { container = []; // 进入 enter(element) { this.container.push(element); } // 离开 leave() { return this.container.shift(); } // 队列的长度 size() { return this.container.length; } // 获取队列中的结果 value() { return this.container.slice(0); } } ``` 面试题:击鼓传花 N个人一起玩游戏,围成一圈,从1开始数数,数到M的人自动淘汰;最后剩下的人会取得胜利,问最后剩下的是原来的哪一位? **算法评估项** **大O标识法和时间复杂度** > 度量一个程序的执行时间通常有两种方法 > > - 事后统计的方法 > - 事前分析估算的方法 O > > Ο(1)<Ο(log2n)<Ο(n)<Ο(n^2)<Ο(n^3)<…<Ο(2n) **Ο(1)**:如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数 ``` let a=12; let b=13; let temp=a; a=b; b=temp; ``` **Ο(log2n)**:当数据增大 n 倍时,耗时增大 logn 倍(这里的 log 是以 2 为底的,比如,当数据增大 256 倍时,耗时只增大 8 倍) ```javascript let i=1; while(i<=n){ i*=2; } ``` **Ο(n)**:数据量的增大几倍,耗时也增大几倍 ```javascript for(i=1;i<=n;i++){ ... } ``` **Ο(n2)**:数据量增大 n 倍时,耗时增大 n 的平方倍 ```javascript /* * (N-1)+(N-2)+...+1 = N*(N-1)/2 等差 * => N^2/2 - N/2 * => N^2/2 只取最高阶 * => N^2 去除常量 * => O(n^2) */ for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ ... } } ```