
前端
文章平均质量分 93
学习笔记
法玛梅林
这个作者很懒,什么都没留下…
展开
-
前端文件上传功能实战——前端实现(下)
我们并不能设想在同一时间内用户只会上传一个文件,在同一时间时如果用户上传多个文件那么我们该怎么实现控制多个文件的上传顺序,启停单独的文件,使所有文件同时暂停开始的功能,我们通过构造BigFileList类来实现上述功能。一个BigFile通常会由当前文件对应的TaskQueue,由Chunk组成的数组,当前文件的hash以及对应事件的处理组成,BIgFile也是我们在整个流程唯二需要手动操作的类。webWorker中的代码。原创 2024-12-23 17:05:53 · 1028 阅读 · 0 评论 -
前端文件上传功能实战——前端实现(中)
文件hash是一个CPU密集型任务,所以只会在任务被启动时才进行计算,确保主线程不会被阻塞,,因为计算hash涉及了IO操作,所以是异步的,为了防止在读取文件的过程中又一次的对reader进行重新赋值,我们可以对reader进行一个缓存处理,如果后续还需要hash,则可以将之前已经计算好的hash直接返回,而不需要重新计算,具体实现如下。每一个分片都需要上传到服务器上,每一个上传都是一个任务——即Task类,我们通过Task实例来执行上传任务,包括当前分片上传进度的监控,取消当前分片的上传等功能。原创 2024-12-19 09:28:45 · 1064 阅读 · 0 评论 -
前端文件上传功能实战——前端实现(上)
无论是通过showOpenFilePicker还是通过showDirectoryPicker来获取文件,本质上获取的是文件的句柄对象,句柄对象无法直接使用,我们可以通过getFile方法来得到句柄对象对应的file对象。如果此时的句柄对象指向的是文件夹的话,我们就需要通过entries方法得到此文件的所有子文件,通过kind属性来判断此时的句柄对象是否指向文件。BigFileDOM类主要控制每个文件在页面的相关展示,功能绑定等。DOM类用于获取页面相关元素并提供对应的事件绑定。原创 2024-12-17 16:02:02 · 808 阅读 · 0 评论 -
前端文件上传功能实战——后端实现
事实上,在切片上传失败后我们需要将这个切片删除掉,以免用户下一次重新上传时误以为此切片已经上传完成,但可惜的是multer默认提供的两种存储引擎并未提供此功能,所以我们需要在原本的diskStorage的基础上进行添加和修改try {});});});});通过在_handleFile中监听当前请求是否取消来决定是否关闭当前文件的管道流,以避免直接调用unlink导致到文件无法删除问题。原创 2024-12-13 12:14:32 · 726 阅读 · 0 评论 -
前端文件上传功能实战——功能分析
文件上传功能是许多人都会用到的,以最基本的文件上传为例,我们可以在网页中添加一个input元素,并通过JavaScript监听该元素的change事件来获取文件。每个小文件都通过一个独立的请求上传,这样如果有文件上传失败,我们只需重新上传那个特定的文件,而无需重新上传整个大文件。实际上,不管用户上传的是文件片段还是完整文件,都存在后端已保存该文件的可能性。我们可以大胆做出假设,用户所选择的文件都是需要上传的新文件,所以我们可以跳过计算文件hash的步骤,直接上传切片和切片的hash,以提高效率。原创 2024-12-11 15:06:11 · 635 阅读 · 0 评论 -
网页中的滚动穿透
在开发中我们可以观察到这么一种现象,当用户在屏幕上某个可滚动区域滚动时,如果滚动到当前区域滚动边界时会带动其他区域进行滚动,直观表现是在进行博客评论时,滑动textarea会带动博客一起滑动,另一种是屏幕有一个浮窗,滑动浮窗会导致浮窗之下的元素进行滚动其中一种情况,为浮窗时第二种情况,滚动区域本身未脱离文档流。原创 2024-10-25 18:52:45 · 940 阅读 · 0 评论 -
websocket
socket,中文名称套接字,可以将其理解成一个抽象层,用于在网络上执行进程间的通信。它为应用程序提供了发送和接收数据的机制,通过ip和接口来标识网络中唯一的位置我们平时最常用的就是基于TCP的流套接字,websocket也是基于此socket最大的特点就是服务器和客户端可以任意进行通信,通信内容不限制于格式,也不限于发送和接收方,除非某一方主动断开,否则socket会一直保持连接状态。原创 2024-06-22 20:01:32 · 1255 阅读 · 0 评论 -
vue常见优化手段(下)
下篇主要内容为开发vue项目时的风格规范,良好的风格规范可以规避小纠结于反模式,同时提高项目的可读性和可维护性以及能带来良好的开发体验,上篇主要提及了vue项目的最佳实践,最佳实践可以帮助我们规避错误。原创 2024-06-21 09:39:12 · 626 阅读 · 0 评论 -
vue常见优化手段(上)
上篇主要提及开发vue.js项目中的最佳实践,最佳实践通常可以规避错误,同时大幅提高应用的性能,下篇主要提及了开发vue.js项目中的风格规范,良好的风格规范可以改善可读性和开发体验。原创 2024-06-21 09:38:48 · 795 阅读 · 0 评论 -
虚拟DOM的比较
将虚拟DOM渲染成DOM,这就是patch的作用在vue运行的时候会生成新旧两个虚拟DOM树,通过比较这两棵DOM树,我们就能针对性的修改真实DOM事实上,我们大可以在每次比较两棵DOM树的时候删除现有的DOM结构,然后根据新的虚拟DOM来渲染最新的DOM,但这样做的结果就是性能开销过大,所以vue并没有采取这种方式,vue会比对新旧两个vnode之间有哪些不同,然后根据对比结果找出需要更新的节点进行更新。原创 2024-06-20 09:03:03 · 1415 阅读 · 0 评论 -
虚拟DOM
理论上,用户的任何操作都有可能造成状态的改变,当状态改变时我们就需要重新渲染,直接操作DOM向来是简单且直接的,我们大可以将现有的DOM直接删除,然后重新根据现有状态来生成一个DOM,但是访问DOM是非常昂贵的。在Web开发的早期,因为网页的展现十分简陋,我们所维护的状态也十分的简单,我们大可以直接操作DOM来进行开发,然而随着时代的发展,我们所开发的web也变的十分复杂,维护的状态也十分的多,DOM操作也十分频繁。幸运的是,现代的主流框架,如vue,react,angular等都支持声明式操作DOM。原创 2024-06-20 09:02:14 · 713 阅读 · 0 评论 -
web标准与浏览器前缀
CSS1的规范发表于1996年,内容十分的少,用一个html就能完全表示,到了1998年,CSS2问世,它带来了更严谨的语法,更丰富的样式,此时的CSS已经十分复杂,靠人脑已无法完全记忆,人们意识到,此时的CSS已无法作为一个规范来发展,庞杂的内容导致人们难以修改和阅读,每个CSS属性都必须具备两个独立实现,但这几乎是不可能的。取而代之的是,这些实验性特性需要通过配置开关来启用,可以宣布的是,浏览器前缀已经彻底成为了一个失败的产物,不过我们还需要很长的时间,才能从浏览器前缀所引发的涟漪效应中解脱出来。原创 2024-06-19 09:35:02 · 1103 阅读 · 0 评论 -
HTML文档声明
GML是一个标记语言,通过特定的标识包裹数据,使得计算机能够识别和处理信息。在GML的基础上,SGML被开发出来,它是一种极为严格的文件描述语言SGML由语法定义、DTD以及文件实例这三个部分构成,由于SGML的规范非常严格,文档达到了500多页,因此它被认为难以学习、使用和实现,基于这些原因,人们在SGML的基础上发展出了其他更易用的标记语言。原创 2024-06-19 09:33:43 · 675 阅读 · 0 评论 -
针对indexedDB的简易封装
我们首先创建一个DBManager类,通过这个类new出来的对象管理一个数据库具体关于indexedDB的相关内容可以看我的这篇博客我们首先需要打开数据库,打开数据库需要数据库名和该数据库的版本在constructor中我们先初始化数据库相关信息,dbName为该对象管理的数据库的数据库名,version为该数据库的版本,db为该数据库的IDBDatabase对象现在我们开始实现openDB方法因为打开数据库涉及i/o操作,所以是异步的,所以我们需要返回一个Promise。原创 2024-06-18 08:26:10 · 1274 阅读 · 0 评论 -
indexedDB
indexedDB是一种现代浏览器持久化数据存储解决方案, 可以把它理解成用户浏览器端的数据库,它可以存储包括文件/二进制大型对象blobs等大量结构化数据,通过索引来实现对数据的高性能检索indexeddb内部的数据均是通过键值对的形式存储,所以不同于其他关系型数据库,不支持sql语句,indexeddb更类似于nosql数据库,通过提供的大量api来实现数据的增删改查需要注意的是,因为indexedDB中的很多api涉及i/o操作,所以是异步的。原创 2024-06-18 08:25:06 · 866 阅读 · 0 评论 -
HTML语义化
HTML语义化指的是在创建HTML页面时,使用合适的标签来准确描述内容的意义和结构在HTML页面的构建过程中,语义化扮演着至关重要的角色。它涉及到使用合适的HTML标签来准确地表达内容的意义和组织结构。这不仅仅是关于标签的选择,更是一种确保内容正确表达的实践。原创 2024-06-17 13:18:03 · 826 阅读 · 0 评论 -
HTML中的资源提示关键词
如果该script元素的src属性为空,则defer和async属性不生效如果该script元素的type属性为空或者为一个JavaScript MIME类型时,该script为普通脚本,普通脚本会受到defer和async的影响,但这些的前提为src属性不为空如果该script元素的type属性为module时,该script为JavaScript模块脚本,该类型脚本不受defer的影响,但会受到async的影响,与src属性无关。原创 2024-06-17 13:16:36 · 927 阅读 · 0 评论 -
super与this
我们可能会对一个问题感到好奇:为什么在派生类中,我们需要在调用之前调用。我们通常将其视为一种规范,却很少深入探究这个规范的真正意义。许多人认为不过是之前继承方式的语法糖。但实际上,这种看法是不准确的。要真正理解的必要性,我们必须探究中继承机制的内部工作原理。原创 2024-04-27 21:28:06 · 991 阅读 · 4 评论 -
JS手写set与map
但是Object.is有一个问题,在Object.is中+0和-0被认为是两个不同的东西,所以我们需要将Object.is再封装一层,这个封装可有可无,但set内部是针对Object.is封装了的。set是一个没有重复元素的集合,事实上我们无法完全的使用js来模拟出set的全部功能,因为浏览器原生的set底层是使用c++实现,能直接访问内存,所以我们只能实现set的一部分功能。在set中我们只需要针对constructor中传入的对象进行判断,而在map中我们需要针对对象中的各个元素进行判断是否可迭代。原创 2024-04-25 23:31:13 · 862 阅读 · 2 评论 -
js深浅拷贝
我们知道,像对象这种复杂数据类型,在定义它的时候我们所指定的变量只会存储这个对象的地址,我们通过这个地址来寻找对象并且操作它,而将这个变量赋值给其他变量时,复制的也仅仅只是地址,对象本身并没有被复制,当我们通过某一个变量去修改对象的成员时,另一个对它保持引用的变量也会同步的更新。我们定义一个deepClone函数,这个函数会传入一个值,我们并确定现在传入的是什么值,如果是一个基本类型的值我们需要直接将其返回,如果是一个复杂数据类型的值我们需要将其深度克隆之后返回一个新对象。原创 2024-04-25 23:29:47 · 1019 阅读 · 3 评论 -
JS包管理
包是一个或多个js的集合,一个工程可以是包,通俗的讲,我们在项目中所使用到的依赖就是包,依赖可以是一个完整的框架,如Vue或React,也可以是一个很小的工具库,如mockJS,jQuery,我们通常将这些由别人编写,我们使用的包叫做第三方库。显而易见的是,每个包可能都会或多或少的依赖其他第三方库,这些被依赖的第三方库可能本身也会依赖其他第三方库,如果去手动维护这些依赖关系是十分复杂的,而包管理器就能自动帮助我们维护这些依赖关系。都需要使用到的,在打包的时候都需要被囊括进去。中,包有两种安装方式,一种是。原创 2024-04-24 17:59:05 · 1069 阅读 · 2 评论 -
js手写call、bind、apply
手写call,apply,bind原创 2024-04-24 17:57:40 · 847 阅读 · 0 评论 -
JS模块化
在ES6之前实现模块化,CMJ,AMD,ESM,export,require,import,模块,模块化原创 2024-04-22 20:50:56 · 991 阅读 · 0 评论 -
js通过Object.defineProperty实现数据响应式
数据响应式,依赖收集,派发更新,属性描述符,get,set,Object.defineProperty原创 2024-04-08 00:36:44 · 800 阅读 · 4 评论 -
CSS样式计算
CSS样式计算,用户代理样式表,层叠冲突,CSS选择器权重,继承原创 2024-04-05 23:44:28 · 1016 阅读 · 2 评论 -
js中的事件循环
JS事件循环,浏览器进程模型,异步,消息队列原创 2024-04-03 14:46:09 · 1010 阅读 · 2 评论 -
js的Proxy和Reflect
js的Proxy和Reflect,对象的基本操作,ES6原创 2024-04-02 14:49:38 · 1168 阅读 · 2 评论 -
js手写Promise(下)
js手写Promise,resolve,reject,catch,all,race原创 2024-02-08 15:17:07 · 1078 阅读 · 1 评论 -
js手写Promise(上)
js手写Promise,构造器,then,onFulfilled,onRejected,resolve,reject原创 2024-02-08 15:14:59 · 1211 阅读 · 2 评论 -
js的属性描述符
js属性描述符,writable,enumerable,configurable,set,get原创 2024-02-05 19:51:19 · 1383 阅读 · 1 评论 -
js的防抖与节流
js防抖与节流,手写防抖与节流函数,防抖与节流函数的this与参数绑定、首部尾部执行控制、获取返回值。原创 2024-01-17 19:06:42 · 714 阅读 · 6 评论 -
js中的class类
ES6,class,extend,super,minix,js多态原创 2024-01-11 20:51:57 · 1574 阅读 · 7 评论 -
jsES6+新语法
jsES6新语法,Symbol,Set,Map原创 2024-01-07 01:59:52 · 1247 阅读 · 6 评论 -
js网络编程
js网络请求,Fetch,Axios,XHR,AJAX原创 2023-09-24 16:44:07 · 482 阅读 · 0 评论 -
js迭代器与生成器
迭代器,生成器,async和await,js异步的最终解决方案原创 2023-08-11 19:02:17 · 743 阅读 · 0 评论 -
js的Promise
回调地域,Promise,Promise的实例方法,类方法原创 2023-08-10 12:43:20 · 750 阅读 · 0 评论 -
js原型以及原型链
原型,原型链,继承,原型链继承,借用构造函数继承,原型式继承,寄生继承,组合继承,原型继承关系原创 2023-07-29 23:19:04 · 468 阅读 · 0 评论 -
js函数增强
js纯函数,柯里化函数,组合函数,函数属性,arguments,rest,with,eval,严格模式原创 2023-07-22 16:41:16 · 370 阅读 · 0 评论 -
js闭包以及垃圾回收机制
js闭包,内存泄漏,js垃圾回收机制,常见GC算法原创 2023-07-21 18:52:18 · 684 阅读 · 0 评论 -
js代码的执行原理
js代码执行原理,作用域以及作用域链原创 2023-07-18 22:30:10 · 297 阅读 · 2 评论