- 博客(91)
- 收藏
- 关注
原创 Tailwind CSS v4.0 发布
Holy shit it's actually done !1 月 22 日,Tailwind CSS 正式发布了 4.0 版本,针对性能和灵活性进行了优化,重新构想了配置和定制体验,并充分利用了 Web 平台提供的最新进展。
2025-01-23 11:12:11
2013
转载 react19新特性12.5更新
React 团队于 2024 年 12 月 5 日正式发布了 React v19 稳定版,并在 npm 上可用。此次更新带来了许多令人期待的新特性和改进,开发者们可以通过 React 19 升级指南获取详细的升级步骤和注意事项。让我们看看在新的 19 版本中都带来了哪些变化呢?
2024-12-07 20:15:25
259
原创 算法题纪录(2)
我们可以用代码来模拟小明的赌钱策略,并计算最终是赚还是亏。关键点是赢的情况下钱加倍,输的情况下减半。在 2𝑛场中,赢了 𝑛 场,输了 𝑛 场,最终的结果只与赢输的顺序无关。小明最终不赚也不亏,因为每次押一半的策略使得资金在赢输数量相同的情况下保持恒定。无论赢输顺序如何,小明最终资金与初始资金相同,结果为持平。类似斐波那契数列,可以用双指针移动来解题。输出:小明刚开始有 46 块零花钱。
2024-11-22 10:29:58
321
原创 本地图片预览的方式
得到本地内存容器的URL地址,同步使用,比较方便快捷,多次使用需要注意手动释放内存的问题,性能优秀。胜在直接转为base64格式,可以直接用于业务,无需二次转换格式。
2024-08-17 14:29:59
335
原创 为什么推荐使用ref而不是reactive
reactive在使用过程中存在一些局限性,如果不额外注意这些问题,可能会给开发带来一些不便。与此不同,ref更像是Vue2时代的option API中的data的替代品,可以存放任何数据类型,而reactive声明的数据类型则仅限于对象。总体来说,非必要的情况下最好避免使用reactive。官方文档也强烈推荐使用ref()作为声明响应式状态的主要API。局限性问题: reactive本身存在一些局限性,可能会在开发过程中引发一些问题。这需要额外的注意力和处理,否则可能对开发造成麻烦。数据类型限制。
2024-07-09 21:32:57
1054
原创 跨域发送OPTIONS请求的条件
OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起OPTIONS请求,即CORS预检请求,服务器若接受该跨域请求,浏览器才继续发起正式请求。
2024-07-03 23:42:25
1161
原创 TypeScript 中的 any 类型,unknown 类型,never 类型
为了解决any类型“污染”其他变量的问题,TypeScript 3.0 引入了unknown类型。它与any含义相同,表示类型不确定,可能是任意类型,但是它的使用有一些限制,不像any那样自由,可以视为严格版的any。unknown跟any的相似之处,在于所有类型的值都可以分配给unknown类型。x = true;// 正确x = 42;// 正确// 正确上面示例中,变量x的类型是unknown,可以赋值为各种类型的值。这与any的行为一致。unknown类型跟any类型的。
2024-07-02 23:16:03
1598
原创 闭包的不同形式
*闭包(closure)**是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。无论通过何种形式,只要将内部函数传递到所在的词法作用域以外,它都会持有对原始作用域的引用,无论在何处执行这个函数都会使用闭包。
2024-07-02 22:57:24
313
原创 javascript 常见设计模式
在软件开发中,设计模式是解决特定问题的经验总结和可复用的解决方案。设计模式可以提高代码的复用性、可维护性和可读性,是提高开发效率的重要手段。
2024-07-01 21:49:01
1086
原创 前端路由三种模式: Hash 模式、 History 模式、 Memory模式
一般路由实现主要有history和hash两种方式hash的实现全部在前端,不需要后端服务器配合,兼容性好,主要是通过监听hashchange事件,处理前端业务逻辑history的实现,需要服务器做以下简单的配置,通过监听pushState及replaceState事件,处理前端业务逻辑。
2024-05-28 23:52:28
1719
转载 控制并发请求
Promise.all() 最简单的控制并发,但是请求出错会导致该组无返回值Promise.allSettled() 解决了Promise.all()的问题,但是却存在慢接口阻塞后续请求,且浪费其余并发位置的问题通过维护一个运行池,当运行池中有请求完成时便从等待队列中取一个心情求入池执行,直到所有的请求都入池介绍了社区的 p-limit库的使用方法和实现原理。
2024-04-28 20:35:35
164
原创 JS 可迭代对象 ( 使 var [a, b] = {a: 1, b: 2} 解构赋值 )
ES6中引入了迭代器与可迭代对象的概念,并且提供了对可迭代对象的相关支持,如for…of循环,Map(iterable)构造器,展开语法…等。让我们对数组外的数据集合的遍历操作也得到极大简化所谓可迭代对象,就是比普通对象多了一个名为Symbol.iterator方法的普通对象,这个方法返回一个迭代器。或者,一个具备Symbol.iterator同时具备next方法的对象也是一个可迭代的对象。。
2024-04-23 12:43:40
660
转载 HTTP 缓存
HTTP 的缓存机制,可以说这是前端工程师需要掌握的重要知识点之一。本文将针对 HTTP 缓存整体的流程做一个详细的讲解,争取做到大家读完整篇文章后,对缓存有一个整体的了解。HTTP 缓存分为 2 种,一种是强缓存,另一种是协商缓存。主要作用是可以加快资源获取速度,提升用户体验,减少网络传输,缓解服务端的压力。在实际使用场景中,图片、不常变化的 JS 等静态资源都会使用缓存来提高页面的加载速度。。
2024-04-14 22:43:00
89
转载 WebSocket 教程
随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高,在 WebSocket 出现之前,大多数情况下是通过客户端发起轮询来拿到服务端实时更新的数据,因为HTTP1.x 协议有一个缺陷就是通信只能由客户端发起,服务端没法主动给客户端推送。这种方式在对实时性要求比较高的场景下,比如即时通讯、即时报价等,显然会十分低效,体验也不好。为了解决这个问题,便出现了WebSocket 协议,实现了客户端和服务端双向通信的能力。介绍WebSocket之前,还是让我们先了解下轮询实现推送的方式。
2024-04-14 21:59:40
107
转载 Cookie 和 Token 的区别
通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡成功)用户名密码登录邮箱发送登录链接手机号接收验证码只要你能收到邮箱/验证码,就默认你是账号的主人用户授予第三方应用访问该用户某些资源的权限你在安装手机应用的时候,APP 会询问是否允许授予权限(访问相册、地理位置等权限)你在访问微信小程序时,当登录时,小程序会询问是否允许授予权限(获取昵称、头像、地区、性别等个人信息)cookie。
2024-04-14 15:52:08
366
转载 HTTPS 加密原理
HTTPS(SSL/TLS)的加密机制虽然是大家都应了解的基本知识,但网上很多相关文章总会忽略一些内容,没有阐明完整的逻辑脉络,我学习它的时候也曾废了些功夫。对称与非对称加密、数字签名、数字证书等,在学习过程中,除了了解“它是什么”,你是否有想过“为什么是它”?我认为有必要搞清楚后者,否则你可能只是单纯地记住了被灌输的知识,而未真正理解它。本文以问题的形式逐步展开,一步步解开HTTPS的面纱,希望能帮助你彻底搞懂HTTPS!
2024-04-13 23:24:00
162
转载 使用 Web Worker 导出 Excel
在项目开发过程中,导出 Excel 文件是很常见的功能。根据生成 Excel 文件的方式,通常分为后端生成和前端生成。前端实现下载后端生成的 Excel 通常有两种方式,①是后端返回 Excel 文件的临时下载地址前端直接下载,②是后端返回 ArrayBuffer 二进制数据,前端处理后下载。而前端生成 Excel 就简单的多了,后端仅需返回指定格式的 JSON 数据就可以了,生成 Excel 这一步由前端浏览器完成,这样就可以大大减轻服务器压力,节约服务器资源。但是。
2024-04-13 23:19:02
306
转载 Web Worker API
众所周知,js最初设计是运行在浏览器中的,为了防止多个线程同时操作DOM,带来渲染冲突问题,所以js执行器被设计成单线程。但随着前端技术的发展,js能力远不止如此,当我们遇到需要大量计算的场景时(比如图像处理、视频解码等),js线程往往会被长时间阻塞,甚至造成页面卡顿,影响用户体验。为了解决单线程带来的这一弊端,Web Worker 应运而生。
2024-04-10 21:49:04
206
转载 Window:requestAnimationFrame() 方法
在 Web 应用中,实现动画效果的方法比较多,JavaScript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和animation 来实现,html5 中的 canvas 也可以实现。除此之外,html5 还提供一个专门用于请求动画的 API,即HTML5 新增加的 API,类似于 setTimeout 定时器。
2024-04-08 23:46:21
1276
转载 定时器 setTimeout 不能准时执行?
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。浏览器通过维护一个延迟队列来实现 setTimeout,有一个 ProcessDelayTask 函数来检查到期的任务然后依次执行。导致定时器 setTimeout 不准时的原因有四个1.JS 是单线程执行任务,如果当前任务执行时间过久会导致定时器设置的任务被延迟执行。2.如果 setTimeout 存在嵌套调用且超过 5 次,那么系统会设置最短时间间隔为 4ms。
2024-04-07 22:33:38
227
转载 JS系列(十一) - 手写Promise
Promise是JavaScript中非常重要的一个概念,它是一种用于处理异步操作的编程模型。Promise提供了一种优雅的方式来处理异步操作的成功或失败,以及它们之间的依赖关系。这使得我们可以避免回调地狱(Callback Hell)的问题,编写更清晰、更易于理解的代码。是一个对Promise行为的开放规范,它规定了Promise应该如何表现和实现。遵循这个规范的Promise实现可以确保它们之间的互操作性,使得我们可以在不同的库和框架中轻松地使用它们。
2024-01-30 21:19:48
90
转载 JS系列 (十) - Promise用法的详细解析
第一,我们需要自己来设计回调函数、回调函数的名称、回调函数的使用等;第二,对于不同的人、不同的框架设计出来的方案是不同的,那么我们必须耐心去看别人的源码或者文档,以便可以理解它这个函数到底怎么用;我们来看一下Promise的API是怎么样的:Promise是一个类,可以翻译成承诺、许诺 、期约;当我们需要给予调用者一个承诺:待会儿我会给你回调数据时,就可以创建一个Promise的对象;在通过new创建Promise对象时,我们需要传入一个回调函数,我们称之为executor。
2024-01-29 21:07:32
745
转载 JS系列(十) - Proxy-Reflect和响应式原理
我们先来看一下响应式意味着什么?我们来看一段代码:m有一个初始化的值,有一段代码使用了这个值;那么在m有一个新的值时,这段代码可以自动重新执行;let m = 20m = 40上面的这样一种可以自动响应数据变量的代码机制,我们就称之为是响应式的。age: 18。
2024-01-28 18:59:44
146
转载 JS系列(九) - ES6~ES13-Symbol、Set、Map
前面我们讲Symbol的目的是为了创建一个独一无二的值,那么如果我们现在就是想创建相同的Symbol应该怎么来做呢?Set是一个新增的数据结构,可以用来保存数据,类似于数组,但是和数组的区别是元素不能重复。我们可以发现Set中存放的元素是不会重复的,那么Set有一个非常常用的功能就是给数组去重。和Set类似的另外一个数据结构称之为WeakSet,也是内部元素不能重复的数据结构。Symbol是什么呢?和Map类型的另外一个数据结构称之为WeakMap,也是以键值对的形式存在的。
2024-01-28 17:27:00
163
转载 JS系列(八) - 类的继承和实现方案
你需要先明确一点: 当我们在子类型的构造函数中调用父类型.call(this, 参数)这个函数的时候, 就会将父类型中的属性和方法复制一份到了子类型中. 所以父类型本身里面的内容, 我们不再需要.不要这么做, 因为这么做意味着以后修改了子类型原型对象的某个引用类型的时候, 父类型原生对象的引用类型也会被修改.另外,如果你仔细按照我的流程走了上面的每一个步骤,你会发现:所有的子类实例事实上会拥有两份父类的属性。目前stu的原型是p对象,而p对象的原型是Person默认的原型,里面包含running等函数;
2024-01-28 16:59:34
137
转载 前端项目规范配置(husky、eslint、stylelint、lint-staged、commitlint)
按照本文的步骤,你可以在你的现有项目中快速地加入 husky、eslint、stylelint、lint-staged、commitlint一系列代码校验工具,保证代码风格一致性,为编写高质量代码打下坚实的基础。除了使用一些现成的npm包外,我们也可以自己写一些规则, husky 提供了钩子,我们在钩子里添加要执行的逻辑即可。在校验代码格式之前,我们还想先看一下分支名是否符合要求,而不是让大家可以随心所欲,团队合作的项目尤其推荐哦。假设我们要求的分支名格式为 feat_name_summary。
2023-12-24 16:51:12
1617
原创 SwitchHosts - 管理、切换多个 hosts 方案的工具
当计算机需要访问某个域名时,它首先会查询本地的hosts文件,看是否有该域名对应的IP地址。如果有,计算机会直接使用hosts文件中所指定的IP地址进行连接,而不会再去DNS服务器上查询IP地址,从而提高了访问速度。
2023-12-17 17:07:40
18908
转载 JS系列(七) - 对象原型、原型链
前面我们说过, 每创建一个函数, 就会同时创建它的prototype对象, 这个对象也会自动获取constructor属性;JavaScript当中每个对象都有一个特殊的内置属性 [[prototype]],这个特殊的对象可以指向另外一个对象。2.这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;如果对象中没有改属性,那么会访问对象[[prototype]]内置属性指向的对象上的属性;将对象的[[prototype]]属性赋值为该构造函数的prototype属性;
2023-12-13 13:00:28
148
转载 JS系列(六) - 创建对象
对象是JavaScript中一个非常重要的概念,这是因为对象可以将多个相关联的数据封装到一起,更好的描述一个事物:比如我们可以描述一辆车:Car,具有颜色(color)、速度(speed)、品牌(brand)、价格(price),行驶(travel)等等;比如我们可以描述一个人:Person,具有姓名(name)、年龄(age)、身高(height),吃东西(eat)、跑步(run)等等;
2023-11-22 12:59:28
104
原创 Install Nginx in Linux
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
2023-11-11 22:40:02
392
原创 Install Docker in Linux
Docker官网链接: https://docs.docker.com/新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS,安装最新版的docker需要centOS 7以上的系统。在Docker安装帮助页面查看支持的系统版本。Docker帮助页面:https://docs.docker.com/engine/install/centos/打开terminal,输入查看系统信息。确保自己的系统满足安装要求。2.安装Docker官网提供的软件源速度比较
2023-11-11 20:03:23
653
2
转载 JS系列(五) - 函数式编程增强
在程序设计中,若一个函数符合一下条件,那么这个函数被称为纯函数:此函数在相同的输入值时,需产生相同的输出。函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。当然上面的定义会过于的晦涩,所以我简单总结一下:确定的输入,一定会产生确定的输出;函数在执行过程中,不能产生副作用;那么这里又有一个概念,叫做副作用,什么又是副作用呢?
2023-11-01 21:54:46
77
转载 JS系列(四) - this指向相关
是JavaScript中的一个关键字,但是又一个相对比较特别的关键字,不像function、var、for、if这些关键字一样,可以很清楚的搞清楚它到底是如何使用的。this会在执行上下文中绑定一个对象,但是是根据什么条件绑定的呢?在不同的执行条件下会绑定不同的对象,这也是让人捉摸不定的地方。这一次,我们一起来彻底搞定this到底是如何绑定的吧!
2023-11-01 21:47:29
123
转载 JS系列(三) - JavaScript的运行过程
这里先来看一下闭包的定义,分成两个:在计算机科学中和在JavaScript中。在计算机科学中对闭包的定义(维基百科):闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures);是在支持 头等函数 的编程语言中,实现词法绑定的一种技术;闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境(相当于一个符号查找表);
2023-10-22 17:34:51
302
转载 JS系列(二) - V8引擎的运行原理
当我们编写JavaScript代码时,它实际上是一种高级语言,这种语言并不是机器语言。高级语言是设计给开发人员使用的,它包括了更多的抽象和可读性。但是,计算机的CPU只能理解特定的机器语言,它不理解JavaScript语言。这意味着,在计算机上执行JavaScript代码之前,必须将其转换为机器语言。这就是JavaScript引擎的作用:事实上我们编写的JavaScript无论你交给浏览器或者Node执行,最后都是需要被CPU执行的;
2023-10-21 17:03:49
1279
转载 JS系列(一) - 深入浏览器的渲染原理
在构建 DOM 树的过程中,浏览器会按照 HTML 文档的层次结构,将文档分成一个个的块(block),如文本块、段落块、表格块等等。我们经常说的浏览器内核指的是浏览器的排版引擎:排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎。在下载完成后,浏览器内核会开始解析 HTML 文件,构建 DOM 树,根据 DOM 树和 CSS 样式表构建渲染树,最终将页面呈现给用户。
2023-10-08 09:10:48
323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人