自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(168)
  • 资源 (5)
  • 收藏
  • 关注

原创 36 _ HTTPS:让数据传输更安全

好了,今天就介绍到这里,下面我来总结下本文的主要内容。由于HTTP的明文传输特性,在传输过程中的每一个环节,数据都有可能被窃取或者篡改,这倒逼着我们需要引入加密机制。于是我们在HTTP协议栈的TCP和HTTP层之间插入了一个安全层,负责数据的加密和解密操作。我们使用对称加密实现了安全层,但是由于对称加密的密钥需要明文传输,所以我们又将对称加密改造成了非对称加密。

2024-06-17 23:00:00 913

原创 35 _ 安全沙箱:页面和系统之间的隔离墙

好了,今天的内容就介绍到这里,下面我来总结下本文的主要内容。首先我们分析了单进程浏览器在系统安全方面的不足,如果浏览器存在漏洞,那么黑客就有机会通过页面对系统发起攻击。因此在设计现代浏览器的体系架构时,就考虑到这个问题了。于是,在多进程的基础之上引入了安全沙箱,有了安全沙箱,就可以将操作系统和渲染进程进行隔离,这样即便渲染进程由于漏洞被攻击,也不会影响到操作系统的。

2024-06-13 21:15:00 729

原创 34 _ CSRF攻击:陌生链接不要随便点

CSRF英文全称是Cross-site request forgery,所以又称为“跨站请求伪造”,是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事。通常当用户打开了黑客的页面后,黑客有三种方式去实施CSRF攻击。下面我们以极客时间官网为例子,来分析这三种攻击方式都是怎么实施的。#同时支持POST和Get#接口#参数##目标用户user##目标金额number。

2024-06-12 22:30:00 957

原创 33 _ 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

XSS全称是Cross Site Scripting,为了与“CSS”区分开来,故简称XSS,翻译过来就是“跨站脚本”。XSS攻击是指黑客往HTML文件中或者DOM中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段。最开始的时候,这种攻击是通过跨域来实现的,所以叫“跨域脚本”。但是发展到现在,往HTML文件中注入恶意代码的方式越来越多了,所以是否跨域注入脚本已经不是唯一的注入手段了,但是XSS这个名字却一直保留至今。

2024-06-11 19:45:00 933

原创 32 _ 同源策略:为什么XMLHttpRequest不能跨域请求资源?

要了解什么是同源策略,我们得先来看看什么是同源。如果两个URL的协议、域名和端口都相同,我们就称这两个URL同源。比如下面这两个URL,它们具有相同的协议HTTPS、相同的域名time.geekbang.org,以及相同的端口443,所以我们就说这两个URL是同源的。category=1category=0浏览器默认两个相同的源之间是可以相互访问资源和操作DOM的。两个不同的源之间若想要相互访问资源或者操作DOM,那么会有一套基础的安全策略的制约,我们把这称为同源策略。

2024-06-07 19:45:00 736

原创 31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络

好了,今天就介绍到这里,下面我来总结下本文的主要内容。我们首先分析了HTTP/2中所存在的一些问题,主要包括了TCP的队头阻塞、建立TCP连接的延时、TCP协议僵化等问题。这些问题都是TCP的内部问题,因此要解决这些问题就要优化TCP或者“另起炉灶”创造新的协议。由于优化TCP协议存在着诸多挑战,所以官方选择了创建新的QUIC协议。HTTP/3正是基于QUIC协议的,你可以把QUIC看成是集成了“TCP+HTTP/2的多路复用+TLS等功能”的一套协议。

2024-06-06 20:00:00 1207 1

原创 30|HTTP2:如何提升网络速度?

好了,今天就介绍这里,下面我来总结下本文的主要内容。我们首先分析了影响HTTP/1.1效率的三个主要因素:TCP的慢启动、多条TCP连接竞争带宽和队头阻塞。接下来我们分析了HTTP/2是如何采用多路复用机制来解决这些问题的。多路复用是通过在协议栈中添加二进制分帧层来实现的,有了二进制分帧层还能够实现请求的优先级、服务器推送、头部压缩等特性,从而大大提升了文件传输效率。HTTP/2协议规范于2015年5月正式发布,在那之后,该协议已在互联网和万维网上得到了广泛的实现和部署。

2024-06-05 21:15:00 895

原创 29 _ HTTP1:HTTP性能优化

好了,今天就介绍到这里,下面我来总结下本文的主要内容。本文我们重点强调了HTTP是浏览器和服务器的通信语言,然后我们从需求演变的角度追溯了HTTP的发展史,在诞生之初的HTTP/0.9因为需求简单,所以和服务器之间的通信过程也相对简单。由于万维网的快速崛起,带来了大量新的需求,其中最核心的一个就是需要支持多种类型的文件下载, 为此HTTP/1.0中引入了请求头和响应头。在支持多种类型文件下载的基础之上,HTTP/1.0还提供了Cache机制、用户代理、状态码等一些基础信息。

2024-06-04 20:30:00 1673

原创 28 _ WebComponent:像搭积木一样构建Web应用

好了,今天就讲到这里,下面我来总结下本文的主要内容。首先,我们介绍了组件化开发是程序员的刚需,所谓组件化就是功能模块要实现高内聚、低耦合的特性。不过由于DOM和CSSOM都是全局的,所以它们是影响了前端组件化的主要元素。基于这个原因,就出现WebComponent,它包含自定义元素、影子DOM和HTML模板三种技术,使得开发者可以隔离CSS和DOM。在此基础上,我们还重点介绍了影子DOM到底是怎么实现的。

2024-06-03 19:45:00 1025

原创 27 _ 渐进式网页应用(PWA):它究竟解决了Web应用的哪些问题?

我们先来看看 Service Worker是怎么解决离线存储和消息推送的问题。其实在Service Worker之前,WHATWG小组就推出过用App Cache标准来缓存页面,不过在使用过程中App Cache所暴露的问题比较多,遭到多方吐槽,所以这个标准最终也只能被废弃了,可见一个成功的标准是需要经历实践考量的。所以在2014年的时候,标准委员会就提出了Service Worker的概念,它的主要思想是在页面和网络之间增加一个拦截器,用来缓存和拦截请求。

2024-06-02 18:30:00 853

原创 26 _ 虚拟DOM:虚拟DOM和实际的DOM有何不同?

在谈论什么是虚拟DOM之前,我们先来看看虚拟DOM到底要解决哪些事情。将页面改变的内容应用到虚拟DOM上,而不是直接应用到DOM上。变化被应用到虚拟DOM上时,虚拟DOM并不急着去渲染页面,而仅仅是调整虚拟DOM的内部状态,这样操作虚拟DOM的代价就变得非常轻了。在虚拟DOM收集到足够的改变时,再把这些变化一次性应用到真实的DOM上。基于以上三点,我们再来看看什么是虚拟DOM。为了直观理解,你可以参考下图:虚拟DOM执行流程。

2024-06-02 11:15:00 1247

原创 25 _ 页面性能:如何系统地优化页面?

好了,今天就介绍到这里,下面我来总结下本文的主要内容。我们主要讲解了如何系统优化加载阶段和交互阶段的页面。在加载阶段,核心的优化原则是:优化关键资源的加载速度,减少关键资源的个数,降低关键资源的RTT次数。在交互阶段,核心的优化原则是:尽量减少一帧的生成时间。可以通过减少单次JavaScript的执行时间、避免强制同步布局、避免布局抖动、尽量采用CSS的合成动画、避免频繁的垃圾回收等方式来减少一帧生成的时长。

2024-06-01 09:15:00 728

原创 24 _ 分层和合成机制:为什么CSS动画比JavaScript高效?

好了,今天就介绍到这里,下面我来总结下今天的内容。首先我们介绍了显示器显示图像的原理,以及帧和帧率的概念,然后基于帧和帧率我们又介绍渲染引擎是如何实现一帧图像的。通常渲染引擎生成一帧图像有三种方式:重排、重绘和合成。其中重排和重绘操作都是在渲染进程的主线程上执行的,比较耗时;而合成操作是在渲染进程的合成线程上执行的,执行速度快,且不占用主线程。然后我们重点介绍了浏览器是怎么实现合成的,其技术细节主要可以使用三个词来概括:分层、分块和合成。

2024-05-31 21:30:00 880

原创 23 _ 渲染流水线:CSS如何影响首次加载时的白屏时间?

好了,今天就介绍到这里,下面我来总结下今天的内容。我们首先介绍了CSS在渲染流水线中的位置,以及CSS是如何影响到渲染流程的;接下来我们通过渲染流水线分析了从发出请求到页面首次绘制的三个阶段;最后重点介绍了第二个白屏阶段以及优化该阶段的一些策略。通过今天的内容我们可以知道虽然JavaScript和CSS给我们带来了极大的便利,不过也对页面的渲染带来了很多的限制,所以我们要关注资源加载速度,需要小心翼翼地处理各种资源之间的关联关系。

2024-05-31 08:15:00 547

原创 22 _ DOM树:JavaScript是如何影响DOM树构建的?

从网络传给渲染引擎的HTML文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是DOM。DOM提供了对HTML文档结构化的表述。在渲染引擎中,DOM有三个层面的作用。从页面的视角来看,DOM是生成页面的基础数据结构。从JavaScript脚本视角来看,DOM提供给JavaScript脚本操作的接口,通过这套接口,JavaScript可以对DOM结构进行访问,从而改变文档的结构、样式和内容。

2024-05-30 20:00:00 682

原创 21 _ Chrome开发者工具:利用网络面板做性能分析

好了,今天就介绍到这里了,下面我来总结下今天的内容。首先我们简单介绍了Chrome开发者工具10个基础的面板信息;然后重点剖析了网络面板,再结合之前介绍的网络请求流程来重点分析了网络面板中时间线的各个指标的含义;最后我们还简要分析了时间线中各项指标出现异常的可能原因,并给出了一些优化方案。其实通过今天的分析,我们可以得出这样一个结论:如果你要去做一些实践性的项目优化,理解其背后的理论至关重要。因为理论就是一条“线”,它会把各种实践的内容“串”在一起,然后你可以围绕着这条“线”来排查问题。

2024-05-28 22:45:00 631

原创 20 _ async await:使用同步的方式去写异步代码

好了,今天就介绍到这里,下面我来总结下今天的主要内容。Promise的编程模型依然充斥着大量的then方法,虽然解决了回调地狱的问题,但是在语义方面依然存在缺陷,代码中充斥着大量的then函数,这就是async/await出现的原因。使用async/await可以实现用同步代码的风格来编写异步代码,这是因为async/await的基础技术使用了生成器和Promise,生成器是协程的实现,利用生成器能实现生成器函数的暂停和恢复。

2024-05-28 19:00:00 1294

原创 19 _ Promise:使用Promise,告别回调函数

好了,今天我们就聊到这里,下面我来总结下今天所讲的内容。首先,我们回顾了 Web 页面是单线程架构模型,这种模型决定了我们编写代码的形式——异步编程。基于异步编程模型写出来的代码会把一些关键的逻辑点打乱,所以这种风格的代码不符合人的线性思维方式。接下来我们试着把一些不必要的回调接口封装起来,简单封装取得了一定的效果,不过,在稍微复制点的场景下依然存在着回调地狱的问题。多层嵌套的问题;每种任务的处理结果存在两种可能性(成功或失败),那么需要在每种任务执行结束后分别处理这两种可能性。

2024-05-27 20:45:00 535

原创 18 _ 宏任务和微任务:不是所有任务都是一个待遇

好了,今天就介绍到这里,下面我来总结下今天的内容。首先我们回顾了宏任务,然后在宏任务的基础之上,我们分析了异步回调函数的两种形式,其中最后一种回调的方式就是通过微任务来实现的。接下来我们详细分析了浏览器是如何实现微任务的,包括微任务队列、检查点等概念。最后我们介绍了监听DOM变化技术方案的演化史,从轮询到Mutation Event再到最新使用的MutationObserver。MutationObserver方案的核心就是采用了微任务机制,有效地权衡了实时性和执行效率的问题。

2024-05-26 11:15:00 811

原创 17 _ WebAPI:XMLHttpRequest是怎么实现的?

好了,今天我们就讲到这里,下面我来总结下今天的内容。首先我们介绍了回调函数和系统调用栈;接下来我们站在循环系统的视角,分析了XMLHttpRequest是怎么工作的;最后又说明了由于一些安全因素的限制,在使用XMLHttpRequest的过程中会遇到跨域问题和混合内容的问题。本篇文章跨度比较大,不是单纯地讲一个问题,而是将回调类型、循环系统、网络请求和安全问题“串联”起来了。对比上一篇文章。

2024-05-25 15:15:00 547

原创 16 _ WebAPI:setTimeout是如何实现的?

好了,今天我们就介绍到这里,下面我来总结下今天的内容。首先,为了支持定时器的实现,浏览器增加了延时队列。其次,由于消息队列排队和一些系统级别的限制,通过setTimeout设置的回调任务并非总是可以实时地被执行,这样就不能满足一些实时性要求较高的需求了。最后,在定时器中使用过程中,还存在一些陷阱,需要你多加注意。通过分析和讲解,你会发现函数setTimeout在时效性上面有很多先天的不足,所以对于一些时间精度要求比较高的需求,应该有针对性地采取一些其他的方案。

2024-05-24 15:42:35 927

原创 15 _ 消息队列和事件循环:页面是怎么“活”起来的?

好了,今天就讲到这里,下面我来总结下今天所讲的内容。如果有一些确定好的任务,可以使用一个单线程来按照顺序处理这些任务,这是第一版线程模型。要在线程执行过程中接收并处理新的任务,就需要引入循环语句和事件系统,这是第二版线程模型。如果要接收其他线程发送过来的任务,就需要引入消息队列,这是第三版线程模型。如果其他进程想要发送任务给页面主线程,那么先通过IPC把任务发送给渲染进程的IO线程,IO线程再把任务发送给页面主线程。消息队列机制并不是太灵活,为了适应效率和实时性,引入了微任务。

2024-05-23 19:45:00 756

原创 14 _ 编译器和解释器:V8是如何执行一段JavaScript代码的?

好了,今天就讲到这里,下面我来总结下今天的内容。首先我们介绍了编译器和解释器的区别。紧接着又详细分析了V8是如何执行一段JavaScript代码的:V8依据JavaScript代码生成AST和执行上下文,再基于AST生成字节码,然后通过解释器执行字节码,通过编译器来优化编译字节码。基于字节码和编译器,我们又介绍了JIT技术。最后我们延伸说明了下优化JavaScript性能的一些策略。

2024-05-22 19:30:00 749

原创 13 _ 垃圾回收:垃圾数据是如何自动回收的?

好了,今天就讲到这里,下面我们就来总结下今天的主要内容。首先我们介绍了不同语言的垃圾回收策略,然后又说明了栈中的数据是如何回收的,最后重点讲解了JavaScript中的垃圾回收器是如何工作的。从上面的分析你也能看出来,无论是垃圾回收的策略,还是处理全停顿的策略,往往都没有一个完美的解决方案,你需要花一些时间来做权衡,而这需要牺牲当前某几方面的指标来换取其他几个指标的提升。其实站在工程师的视角,我们经常需要在满足需求的前提下,权衡各个指标的得失,把系统设计得尽可能适应最核心的需求。

2024-05-21 20:15:00 579

原创 12 _ 栈空间和堆空间:数据是如何存储的?

好了,今天就讲到这里,下面我来简单总结下今天的要点。我们介绍了JavaScript中的8种数据类型,它们可以分为两大类——原始类型和引用类型。其中,原始类型的数据是存放在栈中,引用类型的数据是存放在堆中的。堆中的数据是通过引用和变量关联起来的。也就是说,JavaScript的变量是没有数据类型的,值才有数据类型,变量可以随时持有任何类型的数据。然后我们分析了,在JavaScript中将一个原始类型的变量a赋值给b,那么a和b会相互独立、互不影响;

2024-05-21 08:15:00 916

原创 11 _ this:从JavaScript执行上下文的视角讲清楚this

好了,今天就到这里,下面我们来回顾下今天的内容。当函数作为对象的方法调用时,函数中的this就是该对象;当函数被正常调用时,在严格模式下,this值是undefined,非严格模式下this指向的是全局对象window;嵌套函数中的this不会继承外层函数的this值。最后,我们还提了一下箭头函数,因为箭头函数没有自己的执行上下文,所以箭头函数的this就是它外层函数的this。

2024-05-20 19:45:00 893

原创 10 _ 作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?

首先,介绍了什么是作用域链,我们把通过作用域查找变量的链条称为作用域链;作用域链是通过词法作用域来确定的,而词法作用域反映了代码的结构。其次,介绍了在块级作用域中是如何通过作用域链来查找变量的。最后,又基于作用域链和词法环境介绍了到底什么是闭包。通过展开词法作用域,我们介绍了JavaScript中的作用域链和闭包;通过词法作用域,我们分析了在JavaScript的执行过程中,作用域链是已经注定好了,比如即使在foo函数中调用了bar函数,你也无法在bar函数中直接使用foo函数中的变量信息。

2024-05-17 08:00:00 961

原创 09 _ 块级作用域:var缺陷以及为什么要引入let和const?

好了,今天的内容就讲到这里,下面我来简单总结下今天的内容。由于JavaScript的变量提升存在着变量覆盖、变量污染等设计缺陷,所以ES6引入了块级作用域关键字来解决这些问题。之后我们还通过对变量环境和词法环境的介绍,分析了JavaScript引擎是如何同时支持变量提升和块级作用域的。既然聊到了作用域,那最后我们再简单聊下编程语言吧。

2024-05-16 19:30:00 896

原创 08 _ 调用栈:为什么JavaScript代码会出现栈溢出?

函数调用就是运行一个函数,具体使用方式是使用函数名称跟着一对小括号。var a = 2var b = 10return a+badd()这段代码很简单,先是创建了一个add函数,接着在代码的最下面又调用了该函数。那么下面我们就利用这段简单的代码来解释下函数调用的过程。在执行到函数add()之前,JavaScript引擎会为上面这段代码创建全局执行上下文,包含了声明的函数和变量,你可以参考下图:全局执行上下文从图中可以看出,代码中全局变量和函数都保存在全局上下文的变量环境中。首先,从。

2024-05-15 19:15:00 798

原创 07 _ 变量提升:JavaScript代码是按顺序执行的吗?

JavaScript代码执行过程中,需要先做变量提升,而之所以需要实现变量提升,是因为JavaScript代码在执行之前需要先编译。在编译阶段,变量和函数会被存放到变量环境中,变量的默认值会被设置为undefined;在代码执行阶段,JavaScript引擎会从变量环境中去查找自定义的变量和函数。如果在编译阶段,存在两个相同的函数,那么最终存放在变量环境中的是最后定义的那个,这是因为后定义的会覆盖掉之前定义的。先编译,再执行。

2024-05-14 19:30:00 1644

原创 06 _ 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?

好了,我们现在已经分析完了整个渲染流程,从HTML到DOM、样式计算、布局、图层、绘制、光栅化、合成和显示。下面我用一张图来总结下这整个渲染流程:完整的渲染流水线示意图渲染进程将HTML内容转换为能够读懂的DOM树结构。渲染引擎将CSS样式表转化为浏览器可以理解的,计算出DOM节点的样式。创建布局树,并计算元素的布局信息。对布局树进行分层,并生成分层树。为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。

2024-05-13 21:45:00 1939

原创 05 _ 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

好了,今天正文就到这里,我画了下面这张比较完整的渲染流水线,你可以结合这张图来回顾下今天的内容。渲染流水线图从图中可以看出,本节内容我们介绍了渲染流程的前三个阶段:DOM生成、样式计算和布局。浏览器不能直接理解HTML数据,所以第一步需要将其转换为浏览器能够理解的DOM树结构;生成DOM树后,还需要根据CSS样式表,来计算出DOM树所有节点的样式;最后计算DOM元素的布局信息,使其都保存在布局树中。

2024-05-12 13:30:00 815

原创 04 _ 导航流程:从输入URL到页面展示,这中间发生了什么?

服务器可以根据响应头来控制浏览器的行为,如跳转、网络数据类型判断。Chrome默认采用每个标签对应一个渲染进程,但是如果两个页面属于同一站点,那这两个标签会使用同一个渲染进程。浏览器的导航过程涵盖了从用户发起请求到提交文档给渲染进程的中间所有阶段。导航流程很重要,它是网络加载流程和渲染流程之间的一座桥梁,如果你理解了导航流程,那么你就能完整串起来整个页面显示流程,这对于你理解浏览器的工作原理起到了点睛的作用。

2024-05-11 20:00:00 1006

原创 03 _ HTTP请求流程:为什么很多站点第二次打开速度会很快?

本篇文章的内容比较多、比较碎,但是非常重要,所以我先来总结下今天的主要内容。为了便于你理解,我画了下面这张详细的“HTTP请求示意图”,用来展现浏览器中的HTTP请求所经历的各个阶段。HTTP请求流程示意图从图中可以看到,浏览器中的HTTP请求从发起到结束一共经历了如下八个阶段:构建请求、查找缓存、准备IP和端口、等待TCP队列、建立TCP连接、发起HTTP请求、服务器处理请求、服务器返回请求和断开连接。

2024-05-09 19:45:00 918

原创 02 _ TCP协议:如何保证页面文件能被完整送达浏览器?

好了,这一节就到这里,下面我来做一个简单的总结。互联网中的数据是通过数据包来传输的,数据包在传输过程中容易丢失或出错。IP负责把数据包送达目的主机。UDP负责把数据包送达具体应用。而TCP保证了数据完整地传输,它的连接可分为三个阶段:建立连接、传输数据和断开连接。其实了解TCP协议,是为了全方位了解HTTP,包括其实际功能和局限性,之后才会更加深刻地理解为什么要推出HTTP/2,以及为什么要推出QUIC协议,也就是未来的HTTP/3。

2024-05-08 19:15:00 957

原创 01 _ Chrome架构:仅仅打开了1个页面,为什么有4个进程?

无论你是想要设计高性能Web应用,还是要优化现有的Web应用,你都需要了解浏览器中的网络流程、页面渲染过程,JavaScript执行流程,以及Web安全理论,而这些功能是分散在浏览器的各个功能组件中的,比较多、比较散,要怎样学习才能掌握呢?通过浏览器的多进程架构的学习,你就可以把这些分散的知识点串起来,组成一张网,从而让自己能站在更高的维度去理解Web应用。因此,学习浏览器的多进程架构是很有必要的。需要说明的是,在本专栏中,所有的分析都是基于Chrome浏览器的。

2024-05-07 09:08:21 597

原创 vue开发常用css,js 篇2(持续更新)

vue开发常用css,js 篇1已完结了

2024-03-26 15:10:04 336

原创 一些常用的正则(持续更新)

【代码】前端开发中一些常用的正则表达式(持续更新)

2024-03-26 14:29:33 239

原创 前端开发(一些常用的插件使用和网站)

目前编辑器包含了语法高亮,如果需要添加目录索引,可以监听文档编辑的change事件,获取markdown文档内容,通过正则表达式解析即可。近似 vue 和 react。

2023-11-14 11:20:45 161

原创 响应式布局

早在2010年,设计人员和开发人员就开始实践“响应网页设计”(RWD):随着网络设备尺寸千变万化,为了达到相同的体验,通常的做法是剪切不相关的设计。实际上,我们可以让我们的设计更好的适应渲染屏幕。响应式网页设计就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本。打个比方来说:现在社会有很多响应产品,例如折叠沙发,折叠床等等,在项目中你会遇到不同的终端,由于终端分辨率不同,所以你要想让用户体验更好,就必要让你的页面能够兼容多个终端。

2023-07-25 17:30:35 197

echarts 实现以中国为中心的世界地图

vue+echarts 实现以中国为中心的世界地图

2023-05-04

常用 echarts 的配置

常用 echarts 的配置

2022-05-26

flutter 中 grpc 的使用

flutter 中使用 grpc ,发请求

2021-09-16

国际电话区码数据.txt

电话需要选择区码的看过来,这一份很适合你,没有国家国旗哈,可以自己实现选择列表哟,你缺的只是这份数据。

2021-05-08

flutter使用webrtc技术实现共享桌面,视频

本文件可以直接下载在android studio上面运行,flutter的sdk请使用flutter_windows_1.24.0-10.2.pre-dev这个版本。

2021-02-22

flutter_practies.zip

包括简单的页面搭建模板,路由跳转,包含无感验证、阴影效果,弹出框,底部弹出层等模板。下载后可以直接使用android studio运行哦

2021-01-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除