浏览器缓存

14 篇文章 3 订阅
订阅专栏

前端缓存|后端缓存

  • 后端缓存主要集中于“处理”步骤,通过保留数据库连接,存储处理结果等方式缩短处理时间,尽快进入“响应”步骤。
  • 前端缓存则可以在两步:“请求”和“响应”中进行。在“请求”步骤中,浏览器也可以通过存储结果的方式直接使用资源,直接省去了发送请求;而“响应”步骤需要浏览器和服务器共同配合,通过减少响应内容来缩短传输时间。这些都会在下面进行讨论。

按缓存位置分类

它们的优先级是:(由上到下寻找,找到即返回;找不到则继续)

  • Service Worker
  • Memory Cache
  • Disk Cache
  • Push Cache
  • 网络请求获取资源

在这里插入图片描述

iframe 缓存

  • HTTP 强缓存(如使用 Cache-Control 和 Expires 头的缓存)是基于 URL 和域名来区分和隔离的,而不是基于标签页或 iframe 的上下文

缓存过程

  • 浏览器第一次发起HTTP请求, 在浏览器缓存中没有发现请求的缓存结果和缓存标识
  • 因此向服务器发起HTTP请求, 获得该请求的结果还有缓存规则(也就是Last-Modified 或者ETag)
  • 浏览器把响应内容存入Disk Cache, 把响应内容的引用存入Memory
  • Cache把响应内容存入 Service Worker 的 Cache Storage (如果 Service Worker 的脚本调用了 cache.put())

下一次请求相同资源的时候:

  • 调用Service Worker 的fetch事件响应
  • 查看memory Cache
  • 查看disk Cache.

memory cache

memory cache 是内存中的缓存,(与之相对 disk cache 就是硬盘上的缓存)。按照操作系统的常理:先读内存,再读硬盘。

  • 浏览器占用的内存不能无限扩大这样两个因素,memory cache 注定只能是个“短期存储”。常规情况下,浏览器的 TAB 关闭后该次浏览的 memory cache 便告失效 (为了给其他 TAB 腾出位置)。而如果极端情况下 (例如一个页面的缓存就占用了超级多的内存),那可能在 TAB 没关闭之前,排在前面的缓存就已经失效了。

    • 一旦关闭Tab标签页,内存中的缓存也就释放了,所以容量和存储时效上差些
    • 当渲染进程结束后,内存缓存也就不存在了。
  • 是浏览器为了加快读取缓存速度而进行的自身的优化行为,不受开发者控制,也不受 HTTP 协议头的约束,算是一个黑盒。

  • 几乎所有的请求资源都能进入memory Cache, 细分来说主要分为preloader和preload这两块.

    • preloader:作用主要是用于在浏览器打开一个网页的时候,能够一边解析执行js/css, 一边去请求下一个资源, 而这些被 preloader 请求来的资源就会被放入 memory Cache 中,供之后的解析执行操作使用
    • preload:能显式指定预加载的资源, 这些资源也会被放进memory Cache中, 例如
  • 在从memory Cache读取缓存时, 浏览器会忽视Cache-Control中的一些max-age、no-cache等头部配置, 除非设置了no-store这个头部配置.

disk cache

也叫 HTTP cache,顾名思义是存储在硬盘上的缓存,因此它是持久存储的,是实际存在于文件系统中的。而且它允许相同的资源在跨会话,甚至跨站点的情况下使用,例如两个站点都使用了同一张图片。

存储容量更大, 且存储时长更长.

  • disk cache 会严格根据 HTTP 头信息中的各类字段来判定哪些资源可以缓存,哪些资源不可以缓存;哪些资源是仍然可用的,哪些资源是过时需要重新请求的。当命中缓存之后,浏览器会从硬盘中读取资源,虽然比起从内存中读取慢了一些,但比起网络请求还是快了不少的。绝大部分的缓存都来自 disk cache。
  • 强制缓存,协商缓存都来自于此
  • 即使是跨域站点的情况下,相同地址的资源一旦被硬盘缓存下来,就不会再次请求。

Memory Cache与Disk Cache两者的对比:

  • 比较大的JS、CSS文件会被丢硬盘中存储, 反之则存储在内存中
  • 当前系统内存使用率比较高的时候,文件优先进入磁盘

Service Worker

是运行在浏览器背后的独立线程, 也就是说它脱离了浏览器的窗体, 无法直接访问DOM.功能上主要是能实现: 离线缓存、消息推送、网络代理等.比如离线缓存就是Service Worker Cache.

但 Service Worker 的出现,给予了我们另外一种更加灵活,更加直接的操作方式。我们现在可以绕开银行职员,自己把钱放进去或者取出来。因此我们可以选择放哪些钱(缓存哪些文件),什么情况把钱取出来(路由匹配规则),取哪些钱出来(缓存匹配并返回)。当然现实中银行没有给我们开放这样的服务。

  • 使用Service Worker会涉及到请求拦截, 所以需要用HTTPS协议来保证安全, 传输协议必须是HTTPS
  • Service Worker同时也是PWA的重要实现机制
  • Service Worker 是由开发者编写的额外的脚本,与浏览器其它内建的缓存机制不同, 它可以让我们自由的控制缓存哪些文件、如何匹配读取缓存, 且缓存是持续性的
  • 我们可以从 Chrome 的 F12 中,Application -> Cache Storage 找到这个单独的“小金库”。
  • 这个缓存是永久性的,即关闭 TAB 或者浏览器,下次打开依然还在(而 memory cache 不是)。有两种情况会导致这个缓存中的资源被清除:手动调用 API cache.delete(resource) 或者容量超过限制,被浏览器全部清空。
  • 如果 Service Worker 没能命中缓存,一般情况会使用 fetch() 方法继续获取资源。这时候,浏览器就去 memory cache 或者 disk cache 进行下一次找缓存的工作了。注意:经过 Service Worker 的 fetch() 方法获取的资源,即便它并没有命中 Service Worker 缓存,命中其他缓存甚至实际走了网络请求,也会标注为 from ServiceWorker

Push Cache

推送缓存, 它是浏览器缓存的最后一段防线, 当以上三种缓存都没有命中的时候, 它才会被使用,是HTTP/2中的内容。它只会在会话(Session)中存在, 一旦会话结束它就会被释放, 并且缓存时间也很短暂, 在Chrome浏览器中只有5分钟.

另外由于它是 HTTP/2 中的内容, 因此在国内不是很普及

  • 所有的资源都能被推送,并且能够被缓存,但是 Edge 和 Safari 浏览器支持相对比较差
  • 可以推送 no-cache 和 no-store 的资源
  • 一旦连接被关闭,Push Cache 就被释放
  • 多个页面可以使用同一个HTTP/2的连接,也就可以使用同一个Push Cache。这主要还是依赖浏览器的实现而定,出于对性能的考虑,有的浏览器会对相同域名但不同的tab标签使用同一个HTTP连接。
  • Push Cache 中的缓存只能被使用一次
  • 浏览器可以拒绝接受已经存在的资源推送
  • 可以给其他域名推送资源

强制缓存

可以造成强制缓存的字段是 Cache-control(http1.1) 和 Expires(http1.0)强缓存是不需要发送HTTP请求的,返回的状态码都是200, 而协商缓存需要

两者同时存在, Cache-control的优先级更高;

适用场景

对于不常变化的资源使用

  • 静态资源:
    • 图片(.jpg, .png, .svg等)
    • 视频(.mp4, .avi等)
    • 字体文件(.ttf, .woff等)
  • 样式文件(.css)和脚本文件(.js):
    • 背景JS和样式表文件,这些文件很少变化,适合使用长强缓存来减少加载时间
  • 模板文件(.html):
    • 网站或应用的一些模板文件,例如网站首页、关于我们页面等。
  • 小部件或图标文件:
    • 社交分享按钮、网站导航栏图标等

Expires

  • 这是 HTTP 1.0 的字段,表示缓存到期时间,是一个绝对的时间 (当前时间+缓存时间),如Expires: Thu, 10 Nov 2017 08:45:11 GMT
  • 在响应消息头中,设置这个字段之后,就可以告诉浏览器,在未过期之前不需要再次请求
  • 缺点:
    • 由于是绝对时间,用户可能会将客户端本地的时间进行修改,而导致浏览器判断缓存失效,重新请求该资源。此外,即使不考虑客户端修改,时差或者误差等因素也可能造成客户端与服务端的时间不一致,致使缓存失效
    • 使用了 Expires 头的资源会被缓存下来,但是如果是跨域的情况,HTTP头部缓存可能不会工作,因为这需要服务器特定的 CORS(跨源资源共享)配置来允许共享缓存

Cache-Control

  • cache-control 优先级高于 Expires
  • 已知 Expires 的缺点之后,在HTTP/1.1中,增加了一个字段Cache-control,该字段表示资源缓存的最大有效时间,在该时间内,客户端不需要向服务器发送请求
  • 相比 Expires 优化:
    • max-age 相比 Expires 指定的绝对时间变成了相对时间,客户端通过比较系统当前时间与资源副本被缓存时的时间,计算是否已超过 max-age 指定的时间,避免了时区差异和客户端时钟不准确的问题

Cache-Control请求头常见属性
在这里插入图片描述
Cache-Control响应头常见属性
在这里插入图片描述

  • 其中no-cache:表示下次请求不要直接使用缓存而需要比对,并不对本次请求进行限制,不进行强缓存验证, 而是用协商缓存来验证,使得浏览器每次都请求服务器, 然后配合ETag或者Last-Modified来验证资源是否有效.
  • public: 客户端和代理服务器都可以缓存. 响应可以被中间任何的一个节点缓存, 比如一个请求要经历 Browser -> proxy1 -> proxy2 -> Server, 中间的代理(proxy)可以缓存资源. 下次再请求同一资源的时候, 浏览器就会直接到proxy1中拿缓存的东西而不必向proxy2拿.

在这里插入图片描述

协商缓存(也叫对比缓存)

当强制缓存失效(超过规定时间)时,就需要使用对比缓存,由服务器决定缓存内容是否失效

  • 对比缓存在请求数上和没有缓存是一致的,但如果是 304 的话,返回的仅仅是一个状态码而已,并没有实际的文件内容,因此 在响应体体积上的节省是它的优化点。
  • 返回304和Not Modified(空的响应体)

适用场景

对于常变化的资源使用,设置Cache-Control: no-cache

  • API响应:
    • 从后端获取的数据通常包括用户信息、文章内容等。这些数据可能会随着用户状态或内容更新而变化,因此适合使用协商缓存
  • 动态内容生成的资源:
    • 根据用户活动实时生成的资源,如用户生成的内容(UGC)、实时更新的信息流等
  • 用户数据文件:
    • 用户设置、用户个性化资源、头像等,虽然用户可能不经常更改这些资源,但出于安全考虑,最好使用协商缓存

对比缓存是可以和强制缓存一起使用的,作为在强制缓存失效后的一种后备方案。当强缓存失效后采用协商缓存来判断是否使用缓存
在这里插入图片描述

对比缓存有 2 组字段:

Last-Modified & If-Modified-Since

  • 浏览器第一次向服务器请求这个资源
  • 服务器在返回这个资源的时候, 在 response header 中添加 Last-Modified 告知客户端,资源最后一次被修改的时间,例如 Last-Modified: Mon, 10 Nov 2018 09:10:11 GMT
  • 浏览器将这个值和内容一起记录在缓存数据库中。
  • 下一次请求相同资源时时,浏览器从自己的缓存中找出“不确定是否过期的”缓存。因此在请求头中将上次的 Last-Modified 的值写入到请求头的 If-Modified-Since 字段
  • 服务器会将 If-Modified-Since 的值与 Last-Modified 字段进行对比。如果相等,则表示未修改,响应 304和一个空的响应体, 告诉浏览器从自己(浏览器)的缓存中拿;反之,则表示修改了,响应 200 状态码,并返回数据
    在这里插入图片描述

缺点:

  • 如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒。
  • 如果文件是通过服务器动态生成的,那么该方法的更新时间永远是生成的时间,尽管文件可能没有变化,所以起不到缓存的作用。
  • 如果本地打开了缓存文件,即使没有对文件进行修改,但还是会造成 Last-Modified 被修改,服务器端不能命中缓存导致发送相同资源

Etag & If-None-Match
服务器会根据当前文件的内容, 给文件生成一个唯一的标识, 若是文件发生了改变, 则这个标识就会改变.

  • 对于 Etag 分为强 ETag和弱 Etag
    • 强 ETag:强 ETag 表示资源的字节级别的完全相等。当两个资源的强 ETag 值相同时,意味着这两个资源在内容和属性(如最后修改时间)上完全相同。强 ETag 值直接使用双引号括起来的字符串(如 “12345”)
    • 弱 ETag:弱 ETag 表示资源在语义上是相等的,但在字节级别上可能存在差异。当两个资源的弱 ETag 值相同时,意味着这两个资源在功能和表现上是相同的,但在内容和属性(如最后修改时间)上可能有细微差别。弱 ETag 值以 W/ 开头,后面跟一个双引号括起来的字符串(如 W/“12345”)
      • 弱 ETag 通常用于动态生成的资源(如 HTML 页面)的缓存控制,以提高性能,同时允许一定程度的差异
etag: W/"132489-1627839023000"
if-none-match: W/"132489-1627839023000"
  • Etag 存储的是文件的特殊标识(一般都是 hash 生成的),服务器存储着文件的 Etag 字段。之后的流程和 Last-Modified 一致,只是 Last-Modified 字段和它所表示的更新时间改变成了 Etag 字段和它所表示的文件 hash,把 If-Modified-Since 变成了 If-None-Match。服务器同样进行比较,命中返回 304, 不命中返回新资源和 200。
  • 服务器会将这个标识 ETag 放到响应体的 header 中与请求的资源一起返回给浏览器, 而浏览器同样也会缓存文件与这个 header
  • 在下一次再次加载该资源时, 浏览器会将刚刚缓存的 ETag 放到请求体头部( request header)的 If-None-Match 里发送给服务器.
  • Etag 的优先级高于 Last-Modified
    在这里插入图片描述

作用场景

  • 协商缓存一般存储:HTML

ETag 和 Last-Modified 区别

  • 若是本地打开了缓存文件, 并没有进行修改, 也还是会改变最后修改时间, 导致缓存失败;
  • 由于 Last-Modified 是以秒来计时的, 若是某个文件在一秒内被修改了很多次, 那么这时候的 Last-Modified 并没有体现出修改了
  • 准确度上 ETag 更强;
  • 性能上 Last-Modified 更好;
  • ETag 优先级更高

浏览器的行为

  • 打开网页,地址栏输入地址: 查找 disk cache 中是否有匹配。如有则使用;如没有则发送网络请求。
  • 普通刷新 (F5):因为 TAB 并没有关闭,因此 memory cache 是可用的,会被优先使用(如果匹配的话)。其次才是 disk cache。
  • 强制刷新 (Ctrl + F5):浏览器不使用缓存,因此发送的请求头部均带有 Cache-control: no-cache(为了兼容,还带了 Pragma: no-cache)。服务器直接返回 200 和最新内容。

实际页面效果

  • 首次请求.js、.css 和 .jpg
    在这里插入图片描述

  • 再次请求 (F5)
    在这里插入图片描述

  • 关闭tab后打开
    在这里插入图片描述

缓存相关问题

缓存穿透

  • 缓存穿透是指查询一个不存在的数据(既不在缓存中,也不在数据库中),由于缓存中没有该数据,导致请求穿透到数据库,从而对数据库造成压力
    • 布隆过滤器:对于可能访问的数据,可以将它们的 key 存储在布隆过滤器中。当用户请求数据时,首先检查请求的 key 是否在布隆过滤器中。如果不在,说明数据肯定不存在,可以直接返回错误信息。如果在,再继续访问缓存层和数据库。
    • 缓存空对象:在缓存中设置一个空值,并设置一个较短的过期时间,下次请求时直接从缓存中返回空数据,避免请求穿透到数据库。

缓存击穿

  • 缓存击穿是指一个热点数据在缓存中过期或者被清除,导致大量请求同时访问数据库,从而对数据库造成压力。
    • 热点数据永不过期:将热点数据设置为永久不过期,避免缓存失效导致请求穿透到数据库。
    • 加锁:在缓存失效的时候,使用分布式锁或者互斥锁,避免大量请求同时访问数据库。
    • 限流:使用限流算法对请求进行限制,避免大量请求同时访问数据库。

缓存雪崩

  • 缓存雪崩是指缓存中大量的数据在同一时间失效,导致大量请求同时访问数据库,从而对数据库造成压力。
    • 数据过期时间随机:将缓存数据的过期时间设置为随机时间,避免大量缓存同时失效。
    • 数据预热:在系统启动时,将热点数据加载到缓存中,避免缓存失效时大量请求访问数据库。
    • 分布式部署:将缓存部署在多个节点上,避免某个节点失效导致缓存雪崩。
计算机网络学习之HTTP缓存总结
newxc
05-10 262
😎 对浏览器缓存机制的理解 浏览器缓存的全过程: 浏览器第一次加载资源,服务器返回200,浏览器从服务器下载资源文件,并缓存资源文件与response header ,以供下次加载的时候对比使用 下一次加载的时候,由于强制缓存优先级比较高,先比较当前时间与上一次返回200时的时间差,如果没有cache-control设置的max-age,则没有过期,命中强缓存,直接从本地读取资源。如果浏览器不支持HTPP1.1,则使用expires头判断是否过期 如果资源已过期,则表明强制缓存没有命中,则开始协商缓存,向
一文带你搞定浏览器缓存机制,强缓存、协商缓存
热门推荐
liangzhenmeng的博客
07-24 2万+
缓存策略和协商缓存策略在缓存命中时都会直接使用本地的缓存副本,区别只在于协商缓存会向服务器发送一次请求。它们缓存不命中时,都会向服务器发送请求来获取资源。在实际的缓存机制中,强缓存策略和协商缓存策略是一起合作使用的。浏览器首先会根据请求的信息判断,强缓存是否命中,如果命中则直接使用资源。如果不命中则根据头信息向服务器发起请求,使用协商缓存,如果协商缓存命中的话,则服务器不返回资源,浏览器直接使用本地资源的副本,如果协商缓存不命中,则浏览器返回最新的资源给浏览器。
js清除浏览器缓存的几种方法
weixin_34202952的博客
12-02 1745
  2014年9月24日 4692次浏览 关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能。但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数据。像股票类网站实时更新等,这样的网站是不要缓存的,像有的网站很少更新,有缓存还是比较好的。今天主要介绍清除缓存的几种方法。 清理网站缓存的几种方法 meta方法 //不缓存 &...
浏览器缓存机制介绍与缓存策略剖析.pptx
05-27
浏览器缓存机制介绍与缓存策略剖析 浏览器缓存机制是指浏览器在请求资源时,对已经请求过的资源进行缓存,以便下次请求时可以直接从缓存中获取,从而提高页面加载速度和减少服务器的压力。本文将详细介绍浏览器缓存...
JavaWeb如何实现禁用浏览器缓存
08-25
在JavaWeb开发中,有时我们需要确保用户每次访问页面时都能获取到最新的内容,而不是从浏览器缓存中读取旧的数据。这是因为浏览器缓存虽然能够提高网页加载速度,但可能会导致用户看到过时的信息,特别是在进行迭代...
浏览器缓存问题处理
01-08
浏览器缓存是Web开发中一个重要的概念,它能够提高网页加载速度,减少网络带宽消耗,但同时也可能导致用户无法获取到最新的更新,特别是在项目发布时。本文将详细讲解浏览器缓存的工作原理,以及如何处理浏览器缓存...
关于浏览器缓存的小知识
a909197213的博客
03-08 645
/* 摘自:微信公众号-前端早读课*/ 前言 缓存这个词应该经常听到或偶尔也了解到。那它到底是个什么东西呢?涉及比较多,需耐心看看~ 正文从这开始~ 浏览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利器,也是无数web开发人员在工作过程不可避免的一大问题,所以在产品开发的时候我们总是想办法避免缓存产生,而在产品发布
浏览器缓存 四种缓存分类 两种缓存类型
fyw1789的博客
03-11 1554
在正式开始讲解浏览器缓存之前,我们先来回顾一下整个Web应用的流程。上图展示了一个Web应用最最简单的结构。客户端向服务器端发送HTTP请求,服务器端从数据库获取数据,然后进行计算处理,之后向客户端返回HTTP响应。那么上面整个流程中,哪些地方比较耗费时间呢?总结起来有如下两个方面:发送请求的时候涉及到大量计算的时候一般来讲,上面两个阶段比较耗费时间。首先是发送请求的时候。这里所说的请求,不仅仅是HTTP请求,也包括服务器向数据库发起查询数据的请求。其次是大量计算的时候。
浏览器缓存
DJames23的博客
06-19 376
转载关于浏览器缓存的相关博客: 彻底理解浏览器的缓存机制(http缓存机制) 1.需求: Threejs在前端加载并显示模型后,需要使用meshlab编辑obj模型然后重新加载该文件,该文件是放在服务器某个固定的位置,文件名也是固定的,编辑完该模型后使用原来的名字覆盖,问题来了,这时再加载一次会显示编辑前的模型状态,原因是浏览器缓存,相信大家在做项目时也遇到过修改js,html或者css后效果不能及时生效的问题。于是博主花了一天的时间仔细研究了下浏览器缓存的问题,上面转载的这篇博客解释的相当详细,可以结合起
浏览器的缓存
subsistent的博客
02-16 195
当我们访问同一个页面时,请求资源、数据都是需要一定的耗时,如果可以将一些资源缓存下来,那么从第二次访问开始,就可以减少加载时间,提高用户体验,也能减轻服务器的压力。浏览器缓存分为强缓存和协商缓存,当存在缓存时,客户端第一次向服务器请求数据时,客户端会缓存到内存或者硬盘当中,当第二次获取相同的资源,强缓存和协商缓存的应对方式有所不同。强缓存:当客户端第二次向服务器请求相同的资源时,不会向服务器发送请求,而是直接从内存/硬盘中间读取。
HTTP浏览器缓存
赵玉玲的博客
12-15 343
缓存(本地缓存) 浏览器在第一次请求资源后,再次请求该资源时,会先获取该资源缓存的header信息,如果命中强缓存,则不继续请求服务端数据,直接使用本地缓存数据,不会与服务器通信、 相关字段 http1.0中使用expirse,用于指定有效期截止时间,如果发送请求的时间在expirse之前就会使用本地缓存 http1.1中使用Cache-Control:max-age=num,num是一个相对值...
爬取的网页数据被保存到哪里
最新发布
10-10
爬取的网页数据可以根据你的需求和偏好存储在多种地方,以下是常见的几种选项: 1. **文本文件**: 可以直接将数据写入CSV、JSON或纯文本文件,便于后续读取和编辑。 ```shell with open('data.csv', 'w', encoding='utf-8') as f: json.dump(data, f) ``` 2. **数据库**: 如果数据量大或者需要复杂查询,可以选择关系型数据库(如MySQL, PostgreSQL)或NoSQL数据库(如MongoDB, Redis)。 ```python import pymysql conn = pymysql.connect(host='localhost', user='your_user', password='your_password') cursor = conn.cursor() for item in data: cursor.execute("INSERT INTO your_table VALUES (%s, %s)", (item['field1'], item['field2'])) conn.commit() ``` 3. **Excel文件**: 使用pandas的`to_excel()`函数可以方便地导出到`.xlsx`或`.xls`格式。 4. **分布式文件系统**: 如Hadoop的HDFS或Amazon S3等云存储服务,适合大规模数据存储和备份。 5. **内存中的数据结构**: 对于临时处理,可以在程序运行过程中使用列表、字典等数据结构,直到需要持久化时再写入。 ```python from collections import defaultdict # ... 爬虫处理过程 ... local_storage = defaultdict(list) for entry in data: local_storage[entry['key']].append(entry) # 将数据写入数据库或文件 ```
写文章

热门文章

  • vite 基础配置 21141
  • vue3.0 nextTick 20703
  • react 数据监听 18357
  • echarts 关系图graph 17687
  • git vscode使用Gitlens 16352

分类专栏

  • 浏览器 17篇
  • 通用功能 45篇
  • 移动端与REM 16篇
  • 微前端
  • 网络 14篇
  • vue3.0 26篇
  • React源码 24篇
  • 组件库 1篇
  • Vue源码 39篇
  • 设计模式&代码优化 14篇
  • vue服务器渲染 7篇
  • React Hook 24篇
  • web安全 2篇
  • 代码trick&优雅 8篇
  • node.js 27篇
  • git 18篇
  • redux 13篇
  • 功能库 10篇
  • webapck 63篇
  • 前端优化 2篇
  • React进阶 19篇
  • vite&webpack源码解析 15篇
  • cli 工程化原理 7篇
  • es5、es6、es7 13篇
  • 前端算法 34篇
  • 踏遍青山人未老
  • 笔记
  • 前端工程化 3篇
  • 网页布置技巧 6篇
  • 功能库源码 7篇
  • 组件优化相关 3篇
  • CI/CD
  • leecode算法 13篇
  • 企业级工具函数 5篇
  • Babel 4篇
  • vueuse 1篇
  • vue生态源码 4篇
  • vuex 10篇
  • vue进阶 6篇
  • 微信小程序 62篇
  • Vue 42篇
  • 我有神奇组件模板 17篇
  • mpvue 4篇
  • vue企业级开发规范 5篇
  • uniapp 4篇
  • electron桌面应用 27篇
  • react native 33篇
  • node进阶 11篇
  • 服务器 2篇
  • node爬虫 7篇
  • React 44篇
  • 模块化RequireJS、CommonJS等
  • zepto.js 7篇
  • 手写重构UI框架 24篇
  • vite 7篇
  • 跨平台底层 2篇
  • typescript 29篇
  • mobx 2篇
  • 我有多变请求库 4篇
  • Taro 27篇
  • 我有奇妙动画 43篇
  • 我有疑难BUG仓库 4篇
  • 小程序优化 6篇
  • React企业级开发规范 1篇
  • css动画进阶 13篇
  • 前端破局 1篇
  • flutter 76篇
  • 小程序底层或源码 3篇
  • 我有高级封装 6篇
  • ECharts 39篇
  • svg 10篇
  • UI框架使用 2篇
  • React_typescript 3篇
  • Vue_typescript 2篇
  • 代码规范 1篇
  • node框架-koa 11篇
  • 设计模式 1篇
  • umi.js 8篇
  • dva.js 6篇
  • mongodb数据库 10篇
  • Angular.js 32篇
  • gulp 5篇
  • HTML5 新特性 14篇
  • cookie 5篇
  • 网页制作案例 41篇
  • javaScript 127篇
  • css 64篇
  • jQuery 34篇
  • html 32篇
  • php 23篇
  • Ajax 13篇
  • mysql 8篇
  • linux 29篇
  • java 10篇

最新评论

  • taro 视频播放组件Video

    前端一只咩: showRateBtn这个我看taro文档上有,但是用起来不生效,博主知道为啥吗?

  • 动态规划思想

    romanYSX: for (int j = 0; j < i; j++)这个循环没必要吧,每次记录一下nums[i-1]的最长子串最大值,然后和nums[i]比较,如果nums[i]大,那么dp[i]=dp[i-1]+1,最长子串最大值变为nums[i],否则dp[i]=dp[i-1],最长子串最大值不变

  • 移动端事件顺序、解决300毫秒点击延迟

    CSDN-Ada助手: 移动端开发技术有哪些?

  • h5 新增本地存储localStorage、sessionStorage

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)增加除了各种控件外,文章正文的字数。

  • ReactHook useMemo

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)增加除了各种控件外,文章正文的字数;(3)使用更多的站内链接。

最新文章

  • JSON 中序列化和反序列化 Function
  • 组件库 组件工程化管理探索
  • vue Ref 和 Reactive 原理解析
2024年23篇
2023年85篇
2022年168篇
2021年331篇
2020年681篇
2019年231篇

目录

目录

分类专栏

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢雕塑行业施工标准商场屋顶美陈石家庄景观玻璃钢雕塑定制中山玻璃钢雕塑厂四川玻璃钢酒店人物雕塑泡沫玻璃钢雕塑厂家哪家好酒泉玻璃钢人物雕塑山西玻璃钢室外雕塑浮雕玻璃钢雕塑制作玻璃钢火烈鸟雕塑批发邳州商场大型美陈山东商场美陈供应商吴川玻璃钢游乐场门头雕塑上海走廊商场美陈费用江苏城市玻璃钢雕塑服务介绍浙江室内商场美陈批发湖南玻璃钢花盆造型安阳景观园林玻璃钢仿铜雕塑公园玻璃钢雕塑价位海北玻璃钢雕塑湖艺玻璃钢雕塑制品江苏开业商场美陈采购许昌玻璃钢景观雕塑制造福建玻璃钢花盆工厂合肥大型玻璃钢雕塑设计陕西玻璃钢孔子雕塑商场美陈生产制作项目经验福州模压法玻璃钢雕塑公司龙岩玻璃钢仿铜雕塑重庆水果玻璃钢雕塑批发香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化