关于浏览器:如何在浏览器中调试你的代码

前言在没接触worktile我的项目的时候,个别都是用console.log打断点,当初再做worktile我的项目的时候,我的项目真的很大很大,加载一次要个5分钟左右,就不能用console.log打断点了,就要在浏览器中打断点进行debug了。 Sources面板右击->查看->找到Sources。也能够应用快捷键(F12)大抵可分为三个区域,右边是文件导航,两头是文件的具体内容,左边能够统称为调试面板,次要介绍的是最左边那局部,调试面板。 先介绍几个性能按钮: 复原/暂停脚本执行 步过函数,理论体现是不遇到函数时,执行下一步。遇到函数时,不进入函数间接执行下一步。即把函数当做一条语句执行不向内开展 步入函数,体现是不遇到函数时,执行下一步。遇到到函数时,进入函数执行上下文。 当中断停留在函数外部时,点击这个按钮则会跳出函数外部,停留在函数调用的下一个语句 执行下一步 在不勾销断点标记的状况下,使得所有断点生效 监督工具 1.Watch:跟踪监督变量,点击加号,输出变量名称就能够进行监督了 2.Breakpoints:显示了所有打上的断点 3.Scope:查看以后函数作用域、全局作用域等,以及它们蕴含的变量。 4.Call Stack:记录函数调用的栈构造 5.XHR/Fetch Breakpoints:容许你在网络申请中设置断点,无论是应用 XMLHttpRequest(XHR)还是 Fetch API 进行的。当申请被发送、接管或实现时,这些断点会触发,使你可能检查和调试网络申请的细节。 6.DOM Breakpoints:容许你在DOM树产生更改时暂停代码执行。例如,你能够设置断点以在节点属性更改、子节点更改或节点删除时暂停执行,从而帮忙你追踪和调试DOM操作 7.Global Listeners:全局监听器面板容许你查看整个页面上的事件监听器 8.Event Listener Breakpoints:容许你在特定类型的事件被触发时暂停执行。你能够设置断点以在鼠标事件、键盘事件、窗口调整大小等事件产生时进行调试。 9.CSP Violation:Breakpoints内容安全策略(CSP)违规断点容许你在页面上的CSP违规产生时暂停代码执行 参考资料https://zhuanlan.zhihu.com/p/24770877

February 25, 2024 · 1 min · jiezi

关于浏览器:关于浏览器的那些事儿

对于浏览器的那些事儿七拼八凑了一些浏览器内容(^-^) 支流浏览器比照与倒退举荐一个短视频介绍浏览器/参数厂商内核JS引擎其余ChromeGoogleChromium、<br/>BlinkV8-webkit-SafariAppleWebkitJScore、<br/>SquirrelFish(Nitro)(4.0+)-webkit-FireFoxMozillaGeckoSpiderMonkey(1.0-3.0)、<br/>TraceMonkey(3.5-3.6)、<br/>JaegerMonkey(4.0+)-moz-OperaOperaSoftwarePresto、<br/>Webkit、<br/>BlinkLinear A(4.0-6.1)、<br/>Linear B(7.0-9.2)、<br/>Futhark(9.5-10.2)、<br/>Carakan(10.5-)-o-IEMicrosoftTridentJScript(IE9-)、<br/>Chakra(IE9+)-ms-EdgeMicrosoftEdgeHTMLChakra-ms-新EdgeMicrosoftChromiumV8-webkit-UC阿里巴巴U3U3集成?同红芯浏览器一样换汤不换药360/QQ/搜狗/猎豹、<br/>百度/2345/傲游/世界之窗见下文Trident(兼容模式)+Webkit(高速模式)双内核/能用就行Chrome 以前是 Chromium 内核(Chrome 内核),在 Webkit 根底上批改,但代码可读性更高,比 Webkit 更好用。目前是应用从新升级换代后的 Blink 内核。谷歌还开发了本人的 JS 引擎 V8,使 JS 运行速度极大地提高,Node.js 也是以 V8 为底层架构封装。另外咱们能够通过在地址栏输出 chrome://version/ 来查看浏览器相干信息,通过 chrome://dino 玩小游戏。Safari 的 Webkit 源自 KHTML,苹果在比拟了 Gecko 和 KHTML 后,抉择了后者来做引擎开发,是因为 KHTML 领有清晰的源码构造和极快的渲染速度。苹果与谷歌抵触又研发应用 Webkit2 内核,谷歌则研发了 Chromium 内核,Webkit 也算是苹果为业界做出的最大奉献。FireFox 的 Gecko 内核俗称 Firefox 内核,代码齐全公开,可开发水平高,全世界的程序员都可为其编写代码,减少其性能。还有一个 JS 引擎 Rhino,也是由Mozilla基金会治理,尽管最终被废除,但其凋谢源代码,齐全以Java编写。Opera 最早本人研发 Presto,前面用 Webkit,最初与谷歌一起公布应用 Blink,而后因用户体验降落逐步衰败。IE 是微软和 Spyglass 合作开发,随 Windows 绑定抢占市场,并且只能在 Windows 应用也不开源。Edge 原名叫斯巴达,后改名 Edge,2015 年 3 月公布第一个预览版。微软打算在 Windows 中齐全淘汰 Internet Explorer 后,为 Edge 增加 “IE 模式”,该模式容许用户在 Edge 内应用 IE 内核从新加载网页。新 Edge 是微软斗争下的产物,2018 年 12 月发表新 Edge 将基于 Chromium 内核开发,正式版于 2020 年 1 月公布。能够通过 edge://version/ 来查看浏览器版本信息,通过 edge://surf/ 能够玩离线小游戏。UC 浏览器的 U3 内核实质是基于开源内核 Webkit 开发,也有说是基于 Gecko 内核与 Trident 内核开发的。泛滥国产浏览器的厂商别离为360平安、Tencent、搜狗信息、豹好玩科技、Baidu、二三四五、网际傲游、凤凰工作室。这些浏览器适宜须要常常拜访那种古老零碎的用户(兼容模式) ...

September 28, 2023 · 3 min · jiezi

关于浏览器:Chrome-历史版本下载

因为测试时候会须要用到历史版本,但发现不是很好找,于是记录一下。 window/MAC/Linux:http://chromedriver.storage.googleapis.com/index.html Window:https://lanzoui.com/b138066 MAC:https://google-chrome.cn.uptodown.com/mac firefox的历史版本:http://ftp.mozilla.org/pub/firefox/releases/

March 20, 2023 · 1 min · jiezi

关于浏览器:浏览器工作原理

浏览器(也称为网络浏览器或互联网浏览器)是装置在咱们设施上的软件应用程序,使咱们可能拜访万维网。在浏览这篇文字时,你实际上正在应用一个浏览器。有许多浏览器正在被应用,截至2022年,应用最多的是:谷歌浏览器、苹果的Safari、微软的Edge和火狐。 然而,它们实际上是如何工作的,从咱们在地址栏中键入网络地址开始,到咱们试图拜访的页面显示在屏幕上,会产生什么? 对于这个问题的答案,一个极其简化的版本是: 当咱们从一个特定的网站申请一个网页时,浏览器从网络服务器检索必要的内容,而后在咱们的设施上显示该网页。很间接,对吗?是的,但在这个看似超级简略的过程中还波及更多的内容。在这个系列中,咱们将探讨导航、获取数据、解析和渲染等步骤,并心愿能使你对这些概念更清晰。 1.导航导航是加载网页的第一步。它指的是当用户通过点击一个链接、在浏览器地址栏中写下一个网址、提交一个表格等形式申请一个网页时产生的过程。 DNS 查问(解决网址问题)导航到一个网页的第一步是找到该网页的动态资源地位(HTML、CSS、Javascript和其余类型的文件)。如果咱们导航到 [](https://www.notion.so/842e8b3...)https://example.com ,HTML 页面位于 IP 地址为 93.184.216.34 的服务器上(对咱们来说,网站是域名,但对计算机来说,它们是 IP 地址)。如果咱们以前从未拜访过这个网站,就必须进行域名零碎(DNS)查问。 DNS 服务器是蕴含公共 IP 地址及其相干主机名数据库的计算机服务器(这通常被比作电话簿,因为人们的名字与一个特定的电话号码相关联)。在大多数状况下,这些服务器依照要求将这些名字解析或翻译成 IP 地址(当初有 600 多个不同的 DNS 根服务器散布在世界各地)。 因而,当咱们申请进行 DNS 查问时,咱们理论做的是与这些服务器中的一个进行对话,要求找出与https://example.com 名称绝对应的IP地址。如果找到了一个对应的 IP,就会返回。如果产生了一些状况,查找不胜利,咱们会在浏览器中看到一些错误信息。 在这个最后的查问之后,IP 地址可能会被缓存一段时间,所以下次访问同一个网站会更快,因为不须要进行 DNS 查问(记住,DNS 查问只产生在咱们第一次拜访一个网站时)。 TCP (Transmission Control Protocol) 握手一旦浏览器晓得了网站的 IP 地址,它将尝试通过 TCP 三次握手(也称为 SYN-SYN-ACK,或者更精确的说是 SYN、SYN-ACK、ACK,因为 TCP 有三个音讯传输,用于协商和启动两台计算机之间的TCP 会话),与持有资源的服务器建设连贯。 TCP 是传输控制协议的缩写,是一种通信规范,使应用程序和计算设施可能在网络上替换信息。它被设计用来在互联网上发送数据包,并确保数据和信息在网络上胜利传递。TCP 握手是一种机制,旨在让两个想要互相传递信息的实体(在咱们的例子中是浏览器和服务器)在传输数据之前协商好连贯的参数。 因而,如果浏览器和服务器是两个人,他们之间的对话会是这样的: 浏览器向服务器发送一个 SYNC 音讯,要求进行同步(同步意味着连贯) 而后,服务器将回复一个 SYNC-ACK 音讯( SYNChronization 和 ACKnowledgement) 在最初一步,浏览器将回复一个 ACK 信息 ...

February 27, 2023 · 5 min · jiezi

关于浏览器:图解-Google-V8事件循环和垃圾回收学习笔记三

这是《图解 Google V8》第三篇/共三篇:事件循环和垃圾回收 这里次要讲了 2 点: 事件循环:宏工作和微工作 什么是微工作微工作的执行机会垃圾回收 垃圾回收运行过程垃圾回收算法通过这个专栏的学习,V8 不在是个生疏的黑盒了,变成了一个相熟的黑盒,因为这个专栏让你理解了 V8 的大抵原理,面试时吹吹牛皮还是能够的,不过也就仅此而已,细节方面还须要本人去深刻 17 | 音讯队列:V8 是怎么实现回调函数的?同步回调函数是在执行函数外部被执行的异步回调函数是在执行函数内部被执行的UI 线程是运行窗口的线程,也叫主线程 当鼠标点击了页面,零碎会将该事件交给 UI 线程来解决,然而 UI 线程不能立刻响应来解决 针对这种状况,浏览器为 UI 线程提供了音讯队列,而后 UI 线程会一直的从音讯队列中取出事件和执行事件,如果以后没有任何音讯期待被解决,那么这个循环就会被挂起 setTimeout在执行 setTimeout,浏览器会将回调函数封装成一个事件,增加到音讯队列中,而后 UI 线程会不间断的从音讯队列中取出工作,执行工作,在适合的机会取出 setTimeout 的回调函数 XMLHttpRequest在 UI 线程执行 XMLHttpRequest,会阻塞 UI 线程,所以 UI 线程会将它调配给网络线程(是网络过程中的一个线程): UI 线程从音讯队列中取出工作,剖析发现是一个下载工作,就会交给网络线程去执行网络线程接到下载申请后,会和服务器建立联系,收回下载申请网络线程一直从服务器接收数据网络申请在收到数据后,会将返回的数据和回调函数封装成一个事件,放在音讯队列中UI 线程循环读取音讯队列,如果是下载状态的事件,UI 线程就会执行回调函数直到下载事件完结,页面显示下载实现18 | 异步编程(一):V8 是如何实现微工作的?宏工作是音讯队列中期待被主线程执行的事件,每个宏工作在执行的时候都会创立栈,宏工作完结,栈也会被清空 微工作是一个须要异步执行的函数,执行机会是在主函数执行完结之后,以后宏工作完结之前 微工作执行的机会: 如果当前任务中产生了一个微工作,不会再以后的函数中被执行,所以执行微工作时,不会导致栈的有限扩张微工作会在当前任务执行完结之前被执行微工作完结执行之前,不会执行其余的工作参考资料 V8 Promise 源码全面解读JavaScript Event Loop vs Node JS Event Loop19 |异步编程(二):V8 是如何实现 async/await 的?生成器 Generator带星号的函数配合 yield 能够实现函数的暂停和复原,这个叫生成器 function* getResult() { console.log("getUserID before"); yield "getUserID"; console.log("getUserName before"); yield "getUserName"; console.log("name before"); return "name";}let result = getResult();console.log(result.next().value);console.log(result.next().value);console.log(result.next().value);在生成器外部,如果遇到 yield 关键词,那么 V8 将 yield 前面的内容返回给内部,并暂停函数的执行 ...

February 10, 2023 · 2 min · jiezi

关于浏览器:深入了解现代网络浏览器第-1-部分

CPU、GPU、内存和多过程架构在这个由 4 局部组成的博客系列中,咱们将深刻理解 Chrome 浏览器,从高级架构到渲染管道的细节。如果您想晓得浏览器如何将您的代码变成功能性网站,或者您不确定为什么倡议应用特定技术来进步性能,那么本系列适宜您。 作为本系列的第 1 局部,咱们将理解外围计算术语和 Chrome 的多过程架构。 计算机的外围是 CPU 和 GPUCPU首先是中央处理器(CPU),CPU能够被视为计算机的大脑。一个 CPU 内核,在计算机硬件方面指处理器的外部外围,包装在一个元件中的独立处理单元,在这里被描绘成一个办公室工作人员,能够一个接一个地解决许多不同的工作,它能够解决从数学到艺术的所有工作,同时晓得如何回复客户电话。在过来,大多数CPU都是单芯片,但在古代硬件中,为了给您的手机和笔记本电脑提供更多的计算能力,通常会取得多个内核。如何了解处理器、CPU、多处理器、内核、多核? 图 1:4 个 CPU 内核作为办公室工作人员坐在每张办公桌前解决进来的工作 GPU图形处理器(GPU)是计算机的另一部分,与CPU不同,GPU善于矩阵计算,像素解决,它最后是为解决图形而开发的。这就是为什么在图形环境中应用GPU与疾速渲染和平滑交互无关。近年来,随着GPU减速计算,越来越多的计算在GPU上成为可能。 图 2:许多带有扳手的 GPU 内核表明它们只能解决无限的工作 当您在计算机或手机上启动应用程序时,CPU和GPU为应用程序提供能源。通常,应用程序应用操作系统提供的机制在CPU和GPU上运行。 图 3:三层计算机架构。机器硬件在底部,操作系统在两头,应用程序在顶部。 过程和线程在深入研究浏览器架构之前,须要把握的另一个概念,过程和线程。过程能够被形容为应用程序的执行程序,线程是位于过程外部并执行其过程程序的任何局部的线程。 图 4:过程作为边界框,线程作为形象的鱼在过程内游动 启动应用程序时,将创立一个过程,程序可能会创立线程来帮忙它工作,但这是可选的。操作系统为过程提供了一块“平板”内存,所有应用程序状态都保留在该公有内存空间中。敞开应用程序时,过程也会隐没,操作系统会开释内存。 图 5:应用内存空间和存储应用程序数据的过程图 一个过程能够要求操作系统启动另一个过程来运行不同的工作。产生这种状况时,会为新过程调配不同的内存局部。如果两个过程须要对话,它们能够应用过程间通信(IPC)进行对话。许多应用程序都是这样设计的,因而,如果工作过程没有响应,则能够重新启动,而不影响其余应用程序过程运行。 图 6:通过 IPC 进行通信的独立过程示意图 浏览器架构那么如何应用过程和线程构建 Web 浏览器呢?它可能是一个具备许多不同线程的单过程架构,也可能有许多不同过程的多过程架构,其中有几个线程通过 IPC 进行通信。 图 7:过程/线程图中的不同浏览器架构 这儿须要留神这些不同架构的实现细节,并没有对于如何构建 Web 浏览器的标准规范,一种浏览器的架构设计可能与另一种齐全不同。 为了这个博客系列,咱们将应用下图中形容的 Chrome 最新架构。 顶部是浏览器过程与解决应用程序不同局部的其余过程协调。对于渲染器过程,每创立一个选项卡都会一个渲染器过程。当初,Chrome 在为每个选项卡提供了一个渲染器过程的同时,也尝试为每个选项卡内嵌套的站点(iframe)提供本人的过程(请参阅站点隔离)。 图 8:Chrome 的多过程架构图。渲染器过程下显示了多个层,以示意 Chrome 为每个选项卡运行多个渲染器过程。 各类过程的职责下表形容了每个 Chrome 过程及其管制的内容: Browser Process 负责整个浏览器内行为协调,调用各个过程模块Renderer Process 负责网站选项卡内的内容显示。Plugin Process 负责解决各类浏览器插件GPU Process 负责绘图图 9:指向浏览器 UI 不同局部的不同过程 ...

September 11, 2022 · 1 min · jiezi

关于浏览器:一字一图领略浏览器方向的优化

一、写在后面再过半个月,Internet Explorer 就正式服役了,已经的浏览器霸主,退役超过25年的浏览器闭幕。它的闭幕可能有多方面因素综合的后果,但浏览器性能和用户体验不符预期,必然是它被市场和用户所“摈弃”的重要起因。市面上的浏览器很多,据统计超过 8 0种,很多你可能都没听过,例如 greenbrowser,chromeplus(枫树),Lunascape,糖果浏览器,彗星浏览器,Gomodo Dragon,蜜蜂浏览器,Slim Browser等。不论啥浏览器,也不过有多少种浏览器,浏览器性能永远是避不开的话题,也经常是各大浏览器发布会上“卖点”。至此,浏览器性能重要性显而易见了。那么接下来,就看看对于浏览器方向的优化,以及咱们具体上能做些什么。 tips:分明本文是对于介绍浏览器方向的优化,对于读懂本文并有所播种很重要。 二、高谈阔论:“一字一图”一字指的是“预”字,一图指的是上面这张概括浏览器方向优化的脑图。 痴呆的你,置信看出了一些货色。咱们晓得,不同的浏览器,它们的内核,它们的外部运行机制,可能是有所不同,这意味着在具体的优化技术上,可能要“就地取材”,能力更好的见效,是浏览器性能和用户体验失去晋升。尽管如此,从外围优化策略的角度看,也能够大抵的将针对浏览器方向的优化分为两类: 一是,文档类优化 二是,揣测类优化 也就是说,对于浏览器方向的优化,在外围优化策略上,能够分为两个方向,一是文档优化方向,二是浏览器揣测性优化方向。而在具体的技术手段上,次要分为上面这四种技术: ①页面预渲染 页面预渲染,是通过猜想你可能要拜访的指标,从而在暗藏的标签页中事后渲染整个页面。当然,如果你是首次拜访某个指标,这可能不现实。留神,这是通过咱们的一些示意,例如输出局部关键字,此时咱们还没确定拜访,也还没正式拜访,但浏览器通过一些线索,揣测咱们可能要拜访的指标,事后渲染了这些页面。当用户真正拜访浏览器猜中并提前渲染的指标页面时,置信会有一种这个浏览器或这个站点响应速度真快的“错觉”。咱们无可否认,这是一种令大多数用户称心的体现,所以,页面预渲染很棒。 ②DNS 预解析 DNS 预解析,有点页面预渲染的滋味,当然,这一步通常产生在页面预渲染的后面。它是一种通过揣测用户可能要拜访的域名,提前对这些域名进行解析,从而缩短用户感知到的消耗工夫,晋升体验的伎俩。既然是揣测提前解析,那么揣测的根据是啥呢?这可能和浏览器的标签页,鼠标悬浮指向,导航历史等无关。咱们晓得,http 申请是存在DNS提早的,而如果浏览器的揣测正确,提前进行了 DNS 解析,这种提早问题能够失去很好的解决。 ③TCP 预连贯 浏览器揣测性的提前开始 TCP 连贯,就是所说的 TCP 预连贯,它产生在 DNS 解析之后。TCP 预连贯能带来的益处是,如果浏览器的揣测正确,那么能够省下一次残缺的 TCP 握手实际。不要小瞧这一次握手的工夫,这对机器而言,能够产生很多事,尤其是在“领先占位”这种方向上。 ④资源预取 和页面相干的解析器,例如文档解析器、款式解析器、脚本解析器等,能够和网络协议层沟通,申明预加载某些资源。某些资源,当然是指那些初始化渲染必要的资源,必要而又会阻塞持续渲染的资源。 tips1:综上图文信息,一字是四种技术手段的“预”,一图是概括浏览器方向优化的脑图。 tips2:下面提到的策略和伎俩,其实浏览器自身曾经做了,或者说浏览器厂商曾经做了。所以说这有点“高谈阔论”的意思,而咱们须要分明这些机制和特点,从而做一些更具体的,一般开发人员能做的事件,从而晋升经咱们手上开发的利用的性能。 具体落地:一个 link 标签对于预加载预解析方面的技术 http 方向有,html 的 link 标签也通过 ref=“prefetch”,ref=“prerender”,ref=“dns-prefetch” 来反对。通过 link 标签 ref 提醒一些关键字,通知浏览器为咱们采纳对应的优化机制。举例 link 标签在这方面的利用:<!-- 预解析特定的域名 --><link rel="dns-prefetch" href="//example.com"><!-- 预获取某些页面要用到的要害资源 --><link rel="subresource" href="//example.com/app.js"><!-- 预获取某些未来要用的资源,例如浏览器标签上小 logo 图标等 --><link rel="prerender" href="//example.com/logo.png"><!-- 预渲染某些指定页面 --><link rel="prefetch" href="//example.com/index.html">复制代码 tips:link,HTML 内部资源链接元素,规定了以后文档与内部资源的关系。 tips:留神到了吗?这些具体落地的,应用在咱们开发的应用程序上的技术上,是不是和前述的高谈阔论“一字一图”非亲非故。

May 28, 2022 · 1 min · jiezi

关于浏览器:浏览器缓存的简单介绍和实践

前言绝对于以前的 html 开发阶段,当初的前端我的项目个别都会通过打包,而后再部署到服务器上,最初用户再拜访。打包部署过程可玩性有很大进步,引入了前端工程治理的很多内容,比方多环境反对、动静配置、打包速度、拜访减速等等。 明天这里只探讨资源文件的拜访减速,C 端大概率是要用到 CDN 减速,B 端个别将资源放在服务器上即可,这两者都会波及到浏览器缓存。 那如何利用浏览器缓存机制来实现咱们的减速呢?就须要对浏览器缓存有肯定了解。 浏览器缓存浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近申请过的文档进行存储,当访问者再次拜访同一页面时,浏览器就能够间接从本地磁盘加载文档。 一是能缩小服务器压力和数据传输,节俭网站压力和带宽。二是能放慢客户端的应用速度,晋升零碎应用体验。 浏览器缓存次要有两类:缓存协商和彻底缓存,也有称之为「协商缓存」和「强缓存」。 浏览器在第一次申请产生后,再次申请时: 浏览器会先获取该资源缓存的 header 信息,依据其中的 Expires 和 Cache-control 判断是否命中强缓存,若命中则间接从缓存中获取资源,包含缓存的 header 信息, 本次申请不会与服务器进行通信;如果没有命中强缓存,浏览器会发送申请到服务器,该申请会携带第一次申请返回的无关缓存的 header 字段信息(Last-Modified/IF-Modified-Since、Etag/IF-None-Match),由服务器依据申请中的相干 header 信息来比照后果是否命中协商缓存,若命中,则服务器返回新的响应 header 信息更新缓存中的对应 header 信息,然而并不返回资源内容,它会告知浏览器能够间接从缓存获取;否则返回最新的资源内容。是不是能够了解强缓存就是指从本地拿缓存,如果失败就去协商缓存?强缓存与强缓存相干的 Header 字段是Cache-Control与Expires,这里重点介绍Cache-Control,它是 http1.1 呈现的 header 信息。 它的值有以下几个: max-age:重要!是一个绝对工夫,例如Cache-Control:max-age=3600,代表着资源的有效期是 3600 秒。no-cache:不应用本地缓存。须要应用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在 ETag,那么申请的时候会与服务端验证,如果资源未被更改,则能够防止从新下载。no-store:间接禁止游览器缓存数据,每次用户申请该资源,都会向服务器发送一个申请,每次都会下载残缺的资源。public:能够被所有的用户缓存,包含终端用户和 CDN 等两头代理服务器。private:只能被终端用户的浏览器缓存,不容许 CDN 等中继缓存服务器对其缓存。这下晓得 no-cache 和 no-store 的区别了吧,面试时不要答错了。Cache-Control 与 Expires可在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高,倡议应用 Cache-Control 。 对于这两个 header,能够这么了解: Expires 是 http1.0 标准的内容,Cache-Control 是 http1.1 标准的内容Expires 的过期工夫点是一个本地工夫,在多时区中不靠谱,所以改为工夫长度。相似倒计时在前后端中的设计,是 unix 工夫戳+绝对工夫长度协商缓存协商缓存能够了解为通过协商机制来实现缓存同步,这个机制的外围就是成双成对的响应头和申请头。协商步骤是:第一次申请资源时,浏览器会返回响应头和其值;再次申请资源时,浏览器会增加相应的申请头和上一次响应头中的值,服务依据这个值来判断是否命中缓存和后续不同的操作,被浏览器缓存的文件会有不同的缓存存储。所以别离用不同的字段来协商,它们关系如下: 响应头(Last-Modify)/申请头(If-Modify-Since):缓存到内存中(from memory cache),其值是一个工夫如 Thu,31 Dec 2037 23:59:59 GMT。响应头(ETag)/申请头(If-None-Match):缓存到硬盘(from disk cache),其值是一个校验码。上面说说二者的具体细节和差异。 ...

May 15, 2022 · 2 min · jiezi

关于浏览器:JavaScript重写LocalStorage方法实现浏览器本地存储设置时间问题

最近遇到了用户登录信息本地存储的问题,所以须要对浏览器的localStorage的存储工夫进行设置,因而重写localStorage办法并在此记录。 浏览器几个存储总结:localStorage保留的数据(大小5M左右),以“键值对”的模式长期存在。也就是说,每一项数据都有一个键名和对应的值,所有的数据都是以文本格式保留。保留的数据没有过期工夫,直到手动去除。sessionStorage保留的数据(大小5M左右)用于浏览器的一次会话,当会话完结(通常是敞开窗口或标签页),数据被清空。sessionStorage与localStrage和Cookie不同的一点在于,即使是雷同域名下的两个页面,只有它们不在同一个浏览器窗口中关上,那么它们的sessionStorage内容便无奈共享;cookie以“键值对”的模式存在,是一些数据,存储于你电脑上的文本文件中。总结cookie、localStorage、sessionStorage异同点比照相同点:都是保留在浏览器端,且都是字符串类型的键值对。都遵循同源策略:当一个浏览器的两个tab页中别离关上来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会查看这个脚本是属于哪个页面的,即查看是否同源,只有和百度同源的脚本才会被执行。不同点:传递形式不同cookie数据始终在同源的http申请中携带(即便不须要),即cookie在浏览器和服务器间来回传递。sessionStorage和loaclStorage不会主动把数据发给服务器,仅在本地保留。数据大小不同cookie数据还有门路(path)的概念,能够限度cookie只属于某个门路下。存储大小限度也不同,cookie数据不能超过4KB,同时因为每次http申请都会携带cookie,所以cookie只适宜保留很小的数据,如会话标识。sessionStorage和localStorage尽管也有存储大小的限度,但比cookie大得多,能够达到5M或者更大。数据有效期不同cookie:只在设置cookie过期工夫之前始终无效,即便窗口或浏览器敞开;localStorage:始终无效,窗口或浏览器敞开也始终保留,除非手动删除,因而用作持久数据;sessionStorage:仅在以后浏览器窗口敞开前无效,天然也就不可能长久放弃。作用域不同cookie:在所有同源窗口中都是共享的;localStorage:在所有同源窗口中也都是共享的;sessionStorage:不在不同的浏览器窗口中共享,即便是同一个页面。因为cookie在http申请中每次都会被携带,生命周期只继续到浏览器敞开,而咱们须要让用户信息存储24小时,因而抉择手动封装LocalStorage办法。 setItem()实现思路及代码首先,changeHourToMs()办法:用于判断调用setItem办法时如果传入了小时,将其转化为毫秒,因为获取以后工夫时是毫秒级工夫。同时对于为传入expires或传入expires非法状况进行拦挡。而后,调用Object.assign()办法:将初始化的数据与传入的数组合并,更新传入的数据。其次,判断options.expires办法是确定options.expires属性存在时,须要将整个对象的数据进行格局转换存入。否则,如果options.expires属性不存在,则意味着没有工夫限度,只需存储其name和Value,而不关注存储的工夫和时常,存入即可。 setItem(params) { const changeToMs = 60 * 60 * 1000; function changeHourToMs(params) { if (!Object.prototype.hasOwnProperty.call(params, "expires")) { return; } if (!isNumber(params.expires)) { console.log("expires属性输出有误,应输出数字!") return; } params.expires = parseFloat(params.expires) * changeToMs; } const obj = { name: '', value: '', expires: 24 * 60 * 60 * 1000, startTime: new Date().getTime()// 存入缓存的工夫 } const options = {}; changeHourToMs(params); // 将obj和传进来的params合并(首先与Obj合并指定必要变量,而后与输出的params合并,如果key存在则增加value,否则增加key和value) Object.assign(options, obj, params); if (options.expires) {// 如果options.expires设置了的话,以options.name为key,options为值放进去 localStorage.setItem(options.name, JSON.stringify(options)); } else { // 如果options.expires没有设置,就判断一下value的类型 const type = Object.prototype.toString.call(options.value); // 如果value是对象或者数组对象的类型,就先用JSON.stringify转一下,再存进去 if (type === '[object Object]') { options.value = JSON.stringify(options.value);// 转换为JSON字符串 } if (type === '[object Array]') { options.value = JSON.stringify(options.value); } localStorage.setItem(options.name, options.value); } }getItem()实现思路及代码首先通过name取到数据,并将数据尝试进行Json格局的转换。而后确保数据非null,判断是否传入了options.expires属性,如有进行下一步操作,否则将值返回。下一步操作:获取以后工夫做差,判断若超时间接清空缓存,并采纳阻塞提醒,用户信息生效,请从新登录,点击确定后跳转到登陆页面。附:残缺代码如下;import {isNumber} from "lodash";import router from "umi/router";import {Modal} from 'antd';export default class Storage { constructor(name) { this.name = 'storage'; }// 应用阐明:该类应用须要先初始化一个对象。// setItem必须传入的值为:name,vlaue.// expires为限度工夫默认为一天,如有须要可传入存储的工夫(以小时为单位)// startTime默认获取以后工夫,无需传入 setItem(params) { const changeToMs = 60 * 60 * 1000; function changeHourToMs(params) { if (!Object.prototype.hasOwnProperty.call(params, "expires")) { return; } if (!isNumber(params.expires)) { console.log("expires属性输出有误,应输出数字!") return; } params.expires = parseFloat(params.expires) * changeToMs; } const obj = { name: '', value: '', expires: 24 * 60 * 60 * 1000, startTime: new Date().getTime()// 存入缓存的工夫 } const options = {}; changeHourToMs(params); // 将obj和传进来的params合并(首先与Obj合并指定必要变量,而后与输出的params合并,如果key存在则增加value,否则增加key和value) Object.assign(options, obj, params); if (options.expires) {// 如果options.expires设置了的话,以options.name为key,options为值放进去 localStorage.setItem(options.name, JSON.stringify(options)); } else { // 如果options.expires没有设置,就判断一下value的类型 const type = Object.prototype.toString.call(options.value); // 如果value是对象或者数组对象的类型,就先用JSON.stringify转一下,再存进去 if (type === '[object Object]') { options.value = JSON.stringify(options.value);// 转换为JSON字符串 } if (type === '[object Array]') { options.value = JSON.stringify(options.value); } localStorage.setItem(options.name, options.value); } } // 拿到缓存 getItem(name) { let item = localStorage.getItem(name); try { // 先将拿到的试着进行json转为对象的模式,不能够的话间接返回字符串 item = JSON.parse(item); } catch (error) { console.log(error); item = item; } if (item !== null) { if (item.startTime) { // 如果有startTime的值,阐明设置了生效工夫 const date = new Date().getTime(); if (date - item.startTime > item.expires) {// 判断是否超时 localStorage.removeItem(name);// 革除超时缓存 Modal.warning({ content: '用户受权已生效,请从新登录!', onOk() { router.push("/user/login"); }, }); return null; } return item.value; // 缓存未过期,返回值 } } return item; // 如果没有设置生效工夫,间接返回值 } removeItem(name) { localStorage.removeItem(name); } clear() { localStorage.clear(); }} ...

April 14, 2022 · 2 min · jiezi

关于浏览器:onbeforeunload事件之关闭浏览器之前的提示弹框

问题形容对于表单填写信息的页面,有时候会呈现用户填写了一部分不小心“来到”了这个页面,那么这个时候,产品说,须要再做一个用户提醒,问问用户是不是真的要来到这个页面。针对于这个需要,咱们把具体“来到”的形式分为两种状况 状况一 来到以后路由页面去到别的路由页面这种状况比拟好解决,就是直接判断表单填写的信息是否变动了,如果变动了,做个弹框询问一下,没变动间接放行。或者应用beforeRouteLeave钩子做管制。比方我之前的文章:https://segmentfault.com/a/11... 状况二 间接敞开浏览器tab标签页或敞开浏览器对于这种状况下(比方是误操作),那么咱们能够应用浏览器自带的onbeforeunload事件去做管制 onbeforeunload事件onbeforeunload还有两个兄弟,这里一块介绍下 onload、和onbeforeunload、和onunload介绍咱们先看一下浏览器自带的三个比拟常见的事件 onload(网页加载结束后立即执行的操作,很像vue的mounted钩子)onbeforeunload(网页卸载之前的操作,很像vue的beforeDestroy钩子)onunload(网页卸载了的操作,很像vue的destroyed钩子,与destroyed不同的是,onunload如果是刷新页面的话,onunload执行完当前,又会从新加载页面即:DOM树+CSSOM=>render tree...这样的操作)onload、onbeforeunload、onunload执行程序留神一下它们三个的执行程序 当咱们关上页面看到网页内容的时候,其实onload曾经执行结束了当咱们敞开页面的时候,会先触发onbeforeunload事件的执行当咱们刷新页面的时候,会: onbeforeunload --> onunload --> onloadvue中的onbeforeunload写法<template> <div class="wrap123"> <h2>我是表单填写页面</h2> </div></template><script>export default { mounted() { // 存一份this let _this = this; window.onbeforeunload = function(e) { // 那个路由页面须要,就把path的名字批改成那个,比方我以后页面的path是/vue if (_this.$route.path == "/vue") { // 兼容IE8和Firefox 4之前的事件对象写法(不加也行,当初少有我的项目兼容老版本浏览器了) e = e || window.event; if (e) { e.returnValue = "returnValue属性值的文字不能自定义,写不写都行的"; } // Chrome反对, Safari反对, Firefox 4版本当前反对, Opera 12版本当前反对 , IE 9版本当前反对 return "returnValue属性值的文字不能自定义,写不写都行的"; } }; }, beforeDestroy() { // 来到页面时候再革除 window.onbeforeunload = () => {}; }};</script><style lang="less" scoped>.wrap123 { width: 600px; height: 400px;}</style>浏览器效果图当咱们刷新或者敞开浏览器的时候,就会呈现下图这样的成果 ...

March 7, 2022 · 1 min · jiezi

关于浏览器:动手打造一款-canvas-排版引擎

图片起源:https://unsplash.com 本文作者:飞腾 背景在线示例 Demo 作为前端开发尤其是偏 c 端的前端开发者(如微信小程序),置信大家都碰到过分享流动图片、分享海报图相似的性能 个别这种需要的解决方案大体上能够分为以下几种: 依赖服务端,比方写一个 node 服务,用 puppeteer 拜访提前写好的网页来截图。间接应用 CanvasRenderingContext2D 的 api 或者应用辅助绘图的工具如 react-canvas 等来绘制。应用前端页面截图框架,比方 html2canvas、dom2image,用 html 将页面构造写好,再在须要的时候调用框架 api 截图计划剖析: 依赖服务端这种计划会耗费肯定的服务端资源,尤其截图这种服务,对 cpu 以及带宽的耗费都是很大的,因而在一些可能高并发或者图片比拟大的场景用这种计划体验会比拟差,等待时间很长,这种计划的长处是还原度十分高,因为服务端无头浏览器版本是确定的,所以能够确保所见即所得,并且从开发上来说,无其余学习老本,如果业务还不是很大访问量不高用这种计划是最牢靠的。这种计划比拟硬核,比拟费时费力,大量的代码来计算布局的地位,文字是否换行等等,并且当开发实现后,如果 ui 后续有一些调整,又要在茫茫代码中寻找你要批改的那个它。 这个计划的长处是细节很可控,实践上各种性能都能够实现,如果头发够用的话。这应该也是目前 web 端应用最广的一种计划了,截止目前 html2canvas star 数量曾经 25k。html2canvas 的原理简略来说就是遍历 dom 构造中的属性而后转化到 canvas 上来渲染进去,所以它必然是依赖宿主环境的,那么在一些老旧的浏览器上可能会遇到兼容性问题,当然如果是开发中就遇到了还好,毕竟咱们是万能的前端开发(狗头),能够通过一些 hack 伎俩来躲避,然而 c 端产品会运行在各种各样的设施上,很难防止公布后在其余用户设施上兼容问题,并且出了问题除非用户上报,个别难以监控到,并且在国内小程序用户量基数很大,这个计划也不能在小程序中应用。所以这个计划看似一片祥和,然而会有一些兼容的问题。在这几年不同的工作中,根本都遇到了须要分享图片的需要,尽管需要个别都不大频次不高,然而印象中每次做都不是很顺畅,下面几种计划也都试过了,多多少少都有一些问题。 萌发想法: 在一次需要评审中理解到在后续迭代有 ui 对立调整的布局,并且会波及到几个分享图片的性能,过后的业务是波及到小程序以及 h5 的。会后关上代码,看到了像山一样的分享图片代码,并且穿插着各种兼容胶水代码,如此宏大的代码只是为了生成一个小卡片的布局,如果是 html 布局,应该 100 行就能写完,过后就想着怎么来进行重构。 鉴于开发工夫还很富余,我在想有没有其余更便捷、牢靠、通用一点的解决方案,并且本人对这块也始终很感兴趣,秉持着学习的态度,于是萌发了本人写一个库的想法,通过思考后我抉择了 react-canvas 的实现思路,然而react-canvas依赖于React框架,为了放弃通用性,咱们本次开发的引擎不依赖特定web框架、不依赖 dom 的 api,能依据相似 css 的样式表来生成布局渲染,并且反对进阶性能能够进行交互。 在梳理了要做的性能后,一个繁难的 canvas 排版引擎浮现脑海。 什么是排版引擎 排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎,它是一种软件组件,负责获取标记式内容(如 HTML、XML 及图像文件等等)、整顿信息(如 CSS 及 XSL 等),并将排版后的内容输入至显示器或打印机。所有网页浏览器、电子邮件客户端、电子阅读器以及其它须要依据示意性的标记语言(Presentational markup)来显示内容的应用程序都须要排版引擎。摘自 Wikipedia 对浏览器排版引擎的形容,对于前端同学来说这些概念应该是比拟相熟的,常见的排版引擎比方 webkit、Gecko 等。 ...

February 8, 2022 · 4 min · jiezi

关于浏览器:V8引擎的JavaScript内存机制

对于前端攻城师来说,JS的内存机制不容忽视。如果想成为行业专家,或者打造高性能前端利用,那就必须要弄清楚JavaScript的内存机制了 先看栗子 function foo (){ let a = 1 let b = a a = 2 console.log(a) // 2 console.log(b) // 1 let c = { name: '掘金' } let d = c c.name = '沐华' console.log(c) // { name: '沐华' } console.log(d) // { name: '沐华' } } foo()能够看出在咱们批改不同数据类型的值后,后果有点不一样。 这是因为不同数据类型在内存中存储的地位不一样,在JS执行过程中,次要有三种内存空间:代码空间、栈、堆 代码空间次要就是存储可执行代码,对于这个内容有点多,能够看我另一篇文章有具体介绍 咱们先看一下栈和堆 栈和堆在JS中,每一个数据都须要一个内存空间。而不同的内存空间有什么区别特点呢?,如图 调用栈也叫执行栈,它的执行准则是先进后出,后执行的会先出栈,如图 栈: 存储根底类型:Number, String, Boolean, null, undefined, Symbol, BigInt存储和应用形式后进先出(就像一个瓶子,后放进去的货色先拿进去)主动分配内存空间,主动开释,占固定大小的空间存储援用类型的变量,但实际上保留的不是变量自身,而是指向该对象的指针(在堆内存中寄存的地址)所有办法中定义的变量存在栈中,办法执行完结,这个办法的内存栈也主动销毁能够递归调用办法,这样随着栈深度减少,JVW维持一条长长的办法调用轨迹,内存不够调配,会产生栈溢出堆: 存储援用类型:Object(Function/Array/Date/RegExp)动态分配内存空间,大小不定也不会主动开释堆内存中的对象不会因为办法执行完结就销毁,因为有可能被另一个变量援用(参数传递等)为什么会有栈和堆之分通常与垃圾回收机制无关。每一个办法执行时都会建设本人的内存栈,而后将办法里的变量一一放入这个内存栈中,随着办法执行完结,这个办法的内存栈也会主动销毁 为了使程序运行时占用的内存最小,栈空间都不会设置太大,而堆空间则很大 每创立一个对象时,这个对象会被保留到堆中,以便重复复用,即便办法执行完结,也不会销毁这个对象,因为有可能被另一个变量(参数传递等)援用,直到对象没有任何援用时才会被零碎的垃圾回收机制销毁 而且JS引擎须要用栈来维护程序执行期间上下文的状态,如果所有的数据都在栈里在,栈空间大了的话,会影响到上下文切换的效率,进而影响整个程序的执行效率 ...

October 4, 2021 · 1 min · jiezi

关于浏览器:深入理解浏览器中的进程与线程

过程和线程的分割和区别当咱们启动某个程序时,操作系统会给该程序创立一块内存(当程序敞开时,该内存空间就会被回收),用来寄存代码、运行中的数据和一个执行工作的主线程,这样的一个运行环境就叫过程 而线程是依附于过程的,在过程中应用多线程并行处理能晋升运算效率,过程将工作分成很多细小的工作,再创立多个线程,在外面并行别离执行 过程和线程的关系特点是这样的: 过程与过程之间齐全隔离,互不烦扰,一个过程解体不会影响其余过程,防止一个过程出错影响整个程序过程与过程之间须要传递某些数据的话,就须要通过过程通信管道IPC来传递一个过程中能够并发多个线程,每个线程并行执行不同的工作一个过程中的任意一个线程执行出错,会导致这个过程解体同一过程下的线程之间能够间接通信和共享数据当一个过程敞开之后,操作系统会回收该过程的内存空间晚期浏览器 2007年以前浏览器并不是多过程的构造,而是单过程的构造,一个过程中蕴含了网络、JS运行环境、渲染引擎、页面、插件等,这也导致单过程的构造引发了很多问题 一是不稳固,其中一个线程卡死,可能会导致整个程序出问题,比方关上多个标签页,其中一个标签页卡死可能会导致整个浏览器无奈失常运行二是不平安,浏览器一个过程里是能够共享数据的,那JS线程岂不是能够随便拜访浏览器过程内的所有数据,这显然不合理三是不晦涩,一个过程须要负责太多事件,会导致运行效率问题所以为了解决这些问题,才倒退出了多过程构造 咱们来看一下目前最新的Chrom有过程架构 Chrome 关上一个页面有多少过程?别离是哪些浏览器从敞开到启动,而后新开一个页面至多须要:1个浏览器过程,1个GPU过程,1个网络过程,和1个渲染过程,一共4个过程; 后续如果再关上新的标签页:浏览器过程,GPU过程,网络过程是共享的,不会重新启动,而后默认状况下会为每一个标签页配置一个渲染过程,然而也有例外,比方从A页面外面关上一个新的页面B页面,而A页面和B页面又属于同一站点的话,A和B就共用一个渲染过程,其余状况就为B创立一个新的渲染过程 所以,最新的Chrome浏览器包含:1个浏览器主过程,1个GPU过程,1个网络过程,多个渲染过程,和多个插件过程 浏览器过程: 负责管制浏览器除标签页外的界面,包含地址栏、书签、后退后退按钮等,以及负责与其余过程的协调工作,同时提供存储性能GPU过程:负责整个浏览器界面的渲染。Chrome刚开始公布的时候是没有GPU过程的,而应用GPU的初衷是为了实现3D CSS成果,只是前面网页、Chrome的UI界面都用GPU来绘制,这使GPU成为浏览器广泛的需要,最初Chrome在多过程架构上也引入了GPU过程网络过程:负责发动和承受网络申请,以前是作为模块运行在浏览器过程一时在面的,前面才独立进去,成为一个独自的过程插件过程:次要是负责插件的运行,因为插件可能解体,所以须要通过插件过程来隔离,以保障插件解体也不会对浏览器和页面造成影响渲染过程:负责管制显示tab标签页内的所有内容,外围工作是将HTML、CSS、JS转为用户能够与之交互的网页,排版引擎Blink和JS引擎V8都是运行在该过程中,默认状况下Chrome会为每个Tab标签页创立一个渲染过程咱们平时看到的浏览器呈现出页面过程中,大部分工作都是在渲染过程中实现,所以咱们来看一下渲染过程中的线程 渲染过程中的线程GUI渲染线程:负责渲染页面,解析html和CSS、构建DOM树、CSSOM树、渲染树、和绘制页面,重绘重排也是在该线程执行JS引擎线程:一个tab页中只有一个JS引擎线程(单线程),负责解析和执行JS。它GUI渲染过程不能同时执行,只能一个一个来,如果JS执行过长就会导致阻塞掉帧计时器线程:指setInterval和setTimeout,因为JS引擎是单线程的,所以如果处于阻塞状态,那么计时器就会不准了,所以须要独自的线程来负责计时器工作异步http申请线程: XMLHttpRequest连贯后浏览器开的一个线程,比方申请有回调函数,异步线程就会将回调函数退出事件队列,期待JS引擎闲暇执行事件触发线程:次要用来管制事件循环,比方JS执行遇到计时器,AJAX异步申请等,就会将对应工作增加到事件触发线程中,在对应事件合乎触发条件触发时,就把事件增加到待处理队列的队尾,等JS引擎解决说下浏览器的过程、线程模型,线程模型中的每个线程都是干嘛用的?Chrome为例,有四种过程模型,别离是 Process-per-site-instance:默认模式。拜访不同站点创立新的过程,在旧页面中关上的新页面,且新页面与旧页面属于同一站点的话会共用一个过程不会创立Process-per-site:同一站点应用同一过程Process-per-tab:每一个标签页都创立新的过程Single Process:单过程模式线程模型中的线程都是干嘛的呢? MessagePumpForIO:解决过程间通信的线程,在Chrome中,这类线程都叫做IO线程MessagePumpForUI:解决UI的线程用的MessagePumpDefault:个别的线程用到的每一个Chrome的线程,入口函数都差不多,都是启动一个音讯循环,期待并执行工作 你晓得哪些过程间通信的形式?管道通信:就是操作系统在内核中开拓一段缓冲区,过程1能够将须要交互的数据拷贝到这个缓冲区里,过程2就能够读取了音讯队列通信:音讯队列就是用户能够增加和读取音讯的列表,音讯队列里提供了一种从一个过程向另一个过程发送数据块的办法,不过和管道通信一样每个数据块有最大长度限度共享内存通信:就是映射一段能被其余过程拜访的内存,由一个过程创立,但多个过程都能够拜访,共享过程最快的是IPC形式信号量通信:比方信号量初始值是1,过程1来拜访一块内存的时候,就把信号量设为0,而后过程2也来拜访的时候看到信号量为0,就晓得有其余过程在拜访了,就不拜访了socket:其余的都是同一台主机之间的过程通信,而在不同主机的过程通信就要用到socket的通信形式了,比方发动http申请,服务器返回数据多标签之间怎么通信?没有方法间接通信,须要有一个相似中介者进行音讯的转发和接管,比方 localStorage:在一个标签页监听localStorage的变动,而后当另一个标签页批改的时候,能够通过监听获取新数据WebSocket:因为websocket能够实现实时服务器推送,所以服务器就能够来当这个中介者。标签页通过向服务器发送数据,而后服务器再向其余标签推送转发ShareWorker:会在页面的生命周期内创立一个惟一的线程,并开启多个页面也只会应用同一个线程,标签页共享一个线程postMessage: // 发送方 window.parent().pastMessage('发送的数据','http://接管的址') // 接管方 window.addEventListener('message',(e)=>{ let data = e.data })你晓得僵尸过程和孤儿过程吗?孤儿过程:故名思义,就是没爹的孩子。父过程退出了,而它的一个或多个过程还在运行,那么这些子过程都会成为孤儿过程。这些孤儿都将被init过程收养,并负责这些孤儿的当前僵尸过程:就是子过程比父过程先完结,而父过程又没有开释子过程占用的资源,那么子过程的形容还留在零碎中,这种过程就是僵尸过程结语点赞反对、手留余香、与有荣焉 参考浏览器工作原理与实际

October 1, 2021 · 1 min · jiezi

关于浏览器:浏览器工作原理及V8引擎

浏览器解析过程当浏览器加载html资源时,会进行如下的解析过程 遇见 HTML 标记,构建 DOM 树遇见 style/link 标记调用相应解析器解决CSS标记,并构建出CSS款式树遇见 script 标记 调用javascript引擎 解决script标记、绑定事件、批改DOM 树/CSS树等将 DOM树 与 CSS树 合并成一个渲染树依据渲染树来渲染,以计算每个节点的几何信息最终将各个节点绘制到屏幕上用一张十分经典的图来示意 浏览器引擎浏览器引擎分为两局部,渲染引擎和js引擎。 渲染引擎用于解析、解决html、css文件、布局绘制JavaScript引擎用于解析js文件,常见的JavaScript引擎有JavascriptCore、V8咱们晓得,javascript是一门高级语言,它须要通过编译能力被计算机辨认,那么编译的这个过程就由V8引擎来实现 V8引擎V8解决JS文件通过以下几个步骤 1、Parser模块拥护Javascript代码进行词法剖析,解析成AST(形象语法树)AST的生成如下图所示,定义一个名为name的常量,解析成左边的树结构 这样所有的代码的构造都十分对立,便于解决 2、Ignition将AST解析成bytecode(字节码),最初依据不同的操作系统/环境编译成计算机可辨认的机器码比方windows/macos,cpu架构不统一所能执行的机器指令是不一样的,字节码能够跨平台,等到执行的时候,V8引擎再将字节码解析成机器码 3、Ignition收集优化信息,通过Turbofan将bytecode编译成机器码如果一个函数会被屡次执行,AST-->bytecode-->机器码这样的过程比拟节约性能,为了进行优化,会标记此函数为热点函数,此时Ignition会收集优化信息,如函数的参数,这样间接通过Turbofan将字节码编译成机器码。如果优化信息产生的变动,比方函数入参的类型始终是 number,忽然变成了string,这时候Turbofan会将机器码反向的编译成字节码,再同Iginition解析成机器码执行。 图示如下 Parser模块Parser模块解析成AST的过程中还通过了以下步骤 Blink(Chrome浏览器内核)将源码交给V8引擎,Stream进行编码转换Scanner进行词法剖析后,将代码转成tokenPreParser(预解析),如果函数没有调用则不会被解析Parser模块解析成ASTIgnition、Toburfan再解析图示如下

September 25, 2021 · 1 min · jiezi

关于浏览器:Mozilla火狐浏览器背后神秘又伟大的开源组织|Open-Source-Prism

https://www.bilibili.com/vide...

September 20, 2021 · 1 min · jiezi

关于浏览器:前端要知道的浏览器知识

渲染从浏览器多过程到JS单线程,JS运行机制最全面的一次梳理 浏览器过程页面渲染过程复合图层EventLoop回流与重绘制 https://juejin.cn/post/684490...Tasks, microtasks, queues and schedules 译文参考:https://segmentfault.com/a/11...Tasks, microtasks具体介绍 + 运行演示网络

September 1, 2021 · 1 min · jiezi

关于浏览器:从输入URL到页面呈现超详细

解析地址栏中的信息浏览器监听用户输出的信息并尝试匹配你想要拜访的网址或关键词。以掘金为例,在浏览器地址栏中输出信息,而后回车,浏览器会进行以下判断: 判断是否是非法的 URL 链接;是。持续判断 URL 是否残缺,如果不残缺,浏览器可能会对域进行猜想,对输出的内容增加前缀、后缀、或者前后缀来补全 URL,常见的 URL 通产包含: 协定:如 http https websocket域名(主机名):可能是IP地址,也可能是域名。域名可能由根域名、顶级域名、二级域名等组成,域名的叫法是依据域名从右向左以 . 分隔进行划分,比方:juejin.cn.,. 代表根域名,.cn 代表顶级域名,juejin.cn 代表二级域名(也就是主机名)端口号:http 协定默认端口号为 80,https 协定默认端口号为 443。浏览器会自动隐藏默认端口号。门路:以 / 划分每一层目录,比方:/web/user查问:以 ? 开始,以 & 分隔键值对,如:?username="张三"&age=16哈希:以 # 开始,利用它可实现定位到以后页面的具体位置否。浏览器将输出的内容作为搜寻条件,应用用户设置的默认搜索引擎进行查问并返回后果查找强缓存浏览器过程通过过程间通信(IPC)将 URL 申请发送给网络过程,网络过程接管到URL申请后,会发动真正的申请。但在申请之前,网络过程会查找本地是否缓存了该资源。如果有缓存资源,那么间接返回资源给浏览器过程。首选,查找强缓存资源,如果有则查看强缓存资源是否过期,没过期间接应用该资源,过期则从新向服务器申请资源。强缓存波及到两个字段: Expires。即过期工夫(Expires=Wed, 21 Oct 2015 07:28:00 GMT),HTTP/1.0 采纳此字段,它存在于服务器返回的响应头中,告知浏览器在过期工夫范畴内间接应用缓存资源。但它有个很大的毛病,当服务器和客户端的工夫不统一时,那么服务器返回的工夫是不精确的,因而,HTTP/1.1 摈弃了这个字段而采纳了 Cache-Control字段Cache-Control。即过期时长(Cache-Control:max-age=3600),HTTP/1.1 采纳此字段,它也存在于服务器返回的响应头中,告知浏览器在过期时长范畴内间接应用缓存资源。它还能够设置其余指令,上面列举一些要害指令: public。浏览器和代理服务器都能够缓存资源private。只能浏览器缓存资源,代理服务器不能缓存资源no-cache。跳过强缓存阶段。向服务器发送申请,进入协商缓存阶段no-store。不缓存s-maxage。代理服务器的缓存工夫must-revalidate。一旦缓存过期,就必须回到源服务器验证扩大: 怎么设置强缓存?能够在服务端代码中设置 Cache-Control 字段以及他对应的值;强缓存资源缓存在哪儿? memory cache 或 disk cache ,也就是内存或硬盘中,个别会将图片、脚本文件、字体文件缓存在 memory cache 中;将款式文件缓存在 disk cache 中。拜访缓存的优先级?遵循三级缓存原理:先在 memory cache 中找,有则间接应用;没有再去 disk cache 中找,有则指间接应用;没有就进行网络申请,将申请返回的资源依据响应头字段信息进行缓存。DNS域名解析如果在强缓存中没有找到所需资源,那么间接进入网络申请流程。通常状况下,咱们在浏览器的地址栏中输出的都是域名,而在网络通信中是以 IP 地址确定目标主机的,所以还得通过域名找到对应的 IP 地址。 DNS 又是什么?DNS全名是 domain name system(域名零碎),它将域名和 IP 地址映射关系保留在一个分布式数据库中,所以咱们能够通过 DNS 找到对应的 IP,而这个查找的过程就是 DNS 域名解析。上面以 juejin.cn.来剖析域名的解析过程: ...

July 13, 2021 · 3 min · jiezi

关于浏览器:浏览器设备信息UserAgent查询

浏览器设施信息UserAgent查问浏览器设施信息UserAgent查问 本工具反对对用户以后浏览器设施的UserAgent,IP,设施信息等进行查问。 https://tooltt.com/ua/

June 26, 2021 · 1 min · jiezi

关于浏览器:Chrome的同源

好久不见。 又来了好久好久好久不见。但有时候我想想,人还是得学习。保持真的是个无益的能力。同源策略(主讲Chrome 91的坑)简要介绍同源(same-origin):那就是常见的三个元素,协定,主机名,端口(scheme, hostname, port)都得一样。同站(same-site):无效的顶级域名+顶级域名前的局部,都得一样。Same Origin 上图中的 scheme, hose name, port 都雷同则为 same origin ,否则为 cross origin。 Origin A(雷同的例子)Origin BExplanation of whether Origin A and B are "same-origin" or "cross-origin"https://www.example.com:443https://www.evil.com:443cross-origin: different domainshttps://www.example.com:443https://example.com:443cross-origin: different subdomainshttps://www.example.com:443https://login.example.com:443cross-origin: different subdomainshttps://www.example.com:443http://www.example.com:443cross-origin: different schemeshttps://www.example.com:443https://www.example.com:80cross-origin: different portshttps://www.example.com:443https://www.example.com:443same-origin: exact matchhttps://www.example.com:443https://www.example.comsame-origin: implicit port number (443) matchesSame Site 上图中的 eTLD+1 雷同则为 same site ,否则为 cross site。 Origin A(雷同的例子)Origin BExplanation of whether Origin A and B are "same-site" or "cross-site"https://www.example.com:443https://www.evil.com:443cross-site: different domainshttps://www.example.com:443https://login.example.com:443same-site: different subdomains don't matterhttps://www.example.com:443http://www.example.com:443same-site: different schemes don't matterhttps://www.example.com:443https://www.example.com:80same-site: different ports don't matterhttps://www.example.com:443https://www.example.com:443same-site: exact matchhttps://www.example.com:443https://www.example.comsame-site: ports don't matterSchemeful Same Site ...

June 7, 2021 · 1 min · jiezi

关于浏览器:IE-浏览器将退出历史舞台微软2022-年-Win10-不再支持-IE-11-桌面应用程序

5 月 19 日,微软发表 Windows 10 版本中的 Internet Explorer 浏览器将被 Microsoft Edge 取代,2022 年 6 月 15 日某些 Windows 10 版本将停止使用 Internet Explorer 11 桌面应用程序。微软示意,Microsoft Edge 比 IE 浏览器更快、更平安、为用户带来更古代的浏览体验,而且还解决了一个关键问题:对旧的、legacy 网站和利用具备兼容性。Microsoft Edge 内置了 Internet Explorer 模式(IE mode),用户能够间接从 Microsoft Edge 拜访基于旧版 Internet Explorer 的网站和利用。 不过,该决策对 Windows 10 LTSC、Server Internet Explorer 11 桌面应用程序、MSHTML (Trident) 引擎不会造成影响,Windows 7 和 8.1 版本也不会受到影响。 (图注)微软此次决策受影响和未受影响的 Windows 版本。 此外,微软给出了 IE 11 桌面应用程序的「服役」时间表:2021 年 8 月 17 日,Microsoft 365 等 app 将进行反对 IE 11;2022 年 6 月 15 日,进行反对 IE11 桌面应用程序。 ...

May 20, 2021 · 2 min · jiezi

关于浏览器:chrome浏览器中使用adblockplus拦截广告

adblock plus是一款能够屏蔽广告以及任何你想屏蔽元素的软件,屏蔽之后的成果如下图所示,abp主动屏蔽广告,还能够自行添加屏蔽内容,右上角红色的ABP标识就是该软件 下载地址 https://downloads.adblockplus.org/devbuilds/adblockpluschrome/ 抉择一个下载,倡议不要在chrome浏览器中,chrome浏览器中下载实现之后无奈装置到利用市场会间接删除下载的文件,亲测firefox中能够下载。 下载实现之后将文件名后缀改成 rar,并解压,在谷歌浏览器的拓展程序中加载已解压的拓展程序 加载实现之后在拓展程序中就能看到对应的插件 而后在右上角拓展程序按钮将adblock plus插件固定住 抉择拦挡元素,淡黄色框住的内容就是拦挡的内容 确定增加过滤元素 此时浏览器页面干干净净,就能够欢快的上网啦~

May 14, 2021 · 1 min · jiezi

关于浏览器:译深入了解现代web浏览器三渲染进程内部工作

渲染过程的外部工作这是咱们理解浏览器如何工作4篇博客的第3篇。之前,咱们介绍了 多过程架构 和 导航流程。在本文中,咱们将钻研渲染过程外部产生了什么。 渲染器过程波及web优化的许多方面。因为渲染过程外部产生了很多事件,因而本文只是概述。如果你想更加深刻,“web基础知识的性能优化局部”有更多的资源。 渲染过程解决web内容渲染过程负责解决tab选项卡内产生的所有事件。在一个渲染过程中,主过程解决你发送给用户的大多数代码。如果有时候你应用web worker 或者 service worker,你的局部 javascript 由woker线程解决。排版和光栅线程也在渲染过程外部运行,以便高效,晦涩的渲染页面。 渲染过程的外围工作是将html、css和javascript转换为能够与用户交互的web页面。 解析DOM结构当渲染过程接管到导航提交的信息,并且开始接管html数据,主线程开始解析文本字符(html),并且将其转换为文档对象模型(DOM)。 DOM是一个浏览器对页面的外部示意,也是web开发者能够通过javascript与之交互的数据结构和API。 解析一个HTML文档到DOM是通过HTML规范来定义的。你可能留神到将HTML放到浏览器素来没有抛出过谬误。例如,短少闭合 </p> 是一个非法的HTML。谬误的标记例如 Hi! I'm Chrome! (b标签在i标签之前敞开),它被看成是 Hi! I'm Chrome!。这是因为HTML标准定义了如何优雅的解决这些谬误。如果你关怀这些事件是如何实现的,你能够浏览HTML标准中“错误处理和解析中奇怪的例子”一节。 子资源加载一个网站通常会应用额定的资源,例如图片、css和javascript。这些文件须要从网络或者缓存中加载。主过程能够 在解析构建DOM的时候一个接一个的申请他们,但为了加快速度,“预加载扫描”会同时运行。如果在HTML外面有一些像img和link的内容,预加载会查看HTML解析生成的token,并且在浏览器过程中发送网络申请。 javascript会阻塞解析当HTML解析发现一个script标签,它进行解析HTML文档,并且去加载,解析,并且执行javascript代码。为什么?因为javascript能够扭转文档的形态,应用document.write()能够扭转整个的DOM构造(解析模型概述在HTML定义里有一个好的绘图)。这是HTML解析为什么在复原HTML文档解析之前期待javascript执行。如果你像深刻理解javascript执行产生了什么,V8团队对于此的探讨在这。 提醒浏览器如何加载资源web开发者有很多种形式能够发送提醒给浏览器按序加载资源。如果你的javascript没有应用document.write(),你能够增加 async 和 defer 属性给 <script> 标签。浏览器能够异步地加载和执行 javascript 代码,并且不会阻塞html解析。如果适宜的话你可能也会应用 javascript module。<link rel="preload">是一种告诉浏览器在以后导航须要尽可能早的下载资源的形式。你能够浏览更多的内容在这里 Resource Prioritization – Getting the Browser to Help You. 款式计算只有一个DOM是不足以晓得页面长什么样子的,因为咱们能够在css中设置页面款式。主线程解析CSS并且为每个DOM节点精确地计算出款式。这是基于CSS选择器为每个元素利用对应款式的信息。你能够在 DevTools 中的 computed 局部看到这些信息。 即便你没有提供任何的CSS,每个DOM节点也会又一个computed款式。<h1>标签比<h2>标签展现进去大,并且为每个元素都定义了外间距。这是因为浏览器有一个默认样式表。如果你想晓得chrome有哪些默认的css,请查看这个chrome默认css。 布局当初渲染过程晓得文档的构造和每个节点的款式,然而这些还不足以渲染一个页面。设想一下你在电话外面为你的敌人形容一副画。“这里有一个大红色的圆和一个小的蓝色正方形”这些信息不可能让你的敌人精确的晓得画到底是什么样子。 布局是一个寻找元素坐标的过程。主线程遍历DOM和计算款式,创立蕴含x,y坐标和边界框大小的布局树。布局树和DOM树有着类似的构造,然而它仅仅蕴含页面上可见元素的关联信息。如果利用了 display:none,那么这个元素就不是布局树的一部分(然而,一个visibility:hidden的元素在布局树中)。相似地,一个蕴含内容的伪类就像p::before{content: "Hi!"}被利用,它会蕴含在布局树中,即便它不在DOM中。 确定页面布局是一个有挑战的工作。即便最简略的页面,从上到下块布局,也必须去思考字体多大,哪里须要换行,因为这些都会影响段落的大小和形态;而且也会影响下一行的段落的内容。 CSS能够使元素浮动到一边,屏蔽溢出项,扭转书写的方向。你能够设想,这个布局阶段有一个艰巨的工作。在Chrome中,一个工程师团队都在为布局工作。如果你想理解更多他们的工作细节,请点击 演讲视频 观看乏味的记录。 绘制有了DOM,款式,布局还是不足以渲染一个页面。假如你想模拟一幅画。你晓得大小,形态,元素的地位,然而你依然须要判断绘制的程序。 例如,会为一些元素设置z-index,在上面的例子中,依照HTML的程序绘制将会呈现谬误的渲染后果。 ...

April 23, 2021 · 1 min · jiezi

关于浏览器:重绘及回流

浏览器的渲染过程解析HTML,生成DOM树,解析CSS,生成CSSOM树将DOM树和CSSOM树联合,生成渲染树(Render Tree)Layout(回流):依据生成的渲染树,进行回流(Layout),失去节点的几何信息(地位,大小)Painting(重绘):依据渲染树以及回流失去的几何信息,失去节点的相对像素Display:将像素发送给GPU,展现在页面上。为了构建渲染树,浏览器次要实现了以下工作: 从DOM树的根节点开始遍历每个可见节点。对于每个可见的节点,找到CSSOM树中对应的规定,并利用它们。依据每个可见节点以及其对应的款式,组合生成渲染树。第一步中,既然说到了要遍历可见的节点,那么咱们得先晓得,什么节点是不可见的。不可见的节点包含: 一些不会渲染输入的节点,比方script、meta、link等。一些通过css进行暗藏的节点。比方display:none。留神,利用visibility和opacity暗藏的节点,还是会显示在渲染树上的。只有display:none的节点才不会显示在渲染树上。回流后面咱们通过结构渲染树,咱们将可见DOM节点以及它对应的款式联合起来,可是咱们还须要计算它们在设施视口(viewport)内的确切地位和大小,这个计算的阶段就是回流。 重绘最终,咱们通过结构渲染树和回流阶段,咱们晓得了哪些节点是可见的,以及可见节点的款式和具体的几何信息(地位、大小),那么咱们就能够将渲染树的每个节点都转换为屏幕上的理论像素,这个阶段就叫做重绘节点。 何时产生回流回流这一阶段次要是计算节点的地位和几何信息,那么当页面布局和几何信息发生变化的时候,就须要回流。比方以下状况: 增加或删除可见的DOM元素元素的地位发生变化元素的尺寸发生变化(包含外边距、内边框、边框大小、高度和宽度等)内容发生变化,比方文本变动或图片被另一个不同尺寸的图片所代替。页面一开始渲染的时候(这必定防止不了)浏览器的窗口尺寸变动(因为回流是依据视口的大小来计算元素的地位和大小的)浏览器的优化机制古代的浏览器都是很聪慧的,因为每次重排都会造成额定的计算耗费,因而大多数浏览器都会通过队列化批改并批量执行来优化重排过程。浏览器会将批改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列。然而!当你获取布局信息的操作的时候,会强制队列刷新,比方当你拜访以下属性或者应用以下办法: offsetTop、offsetLeft、offsetWidth、offsetHeightscrollTop、scrollLeft、scrollWidth、scrollHeightclientTop、clientLeft、clientWidth、clientHeightgetComputedStyle()getBoundingClientRect缩小重绘与回流CSS应用 transform 代替 top应用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(扭转了布局防止应用table布局,可能很小的一个小改变会造成整个 table 的从新布局。尽可能在DOM树的最末端扭转class,回流是不可避免的,但能够缩小其影响。尽可能在DOM树的最末端扭转class,能够限度了回流的范畴,使其影响尽可能少的节点。防止设置多层内联款式,CSS 选择符从右往左匹配查找,防止节点层级过多。将动画成果利用到position属性为absolute或fixed的元素上,防止影响其余元素的布局,这样只是一个重绘,而不是回流,同时,管制动画速度能够抉择 requestAnimationFrame,详见探讨 requestAnimationFrame。防止应用CSS表达式,可能会引发回流。将频繁重绘或者回流的节点设置为图层,图层可能阻止该节点的渲染行为影响别的节点,例如will-change、video、iframe等标签,浏览器会主动将该节点变为图层。CSS3 硬件加速(GPU减速),应用css3硬件加速,能够让transform、opacity、filters这些动画不会引起回流重绘 。 JavaScript防止频繁操作款式,最好一次性重写style属性,或者将款式列表定义为class并一次性更改class属性。防止频繁操作DOM,创立一个documentFragment,在它下面利用所有DOM操作,最初再把它增加到文档中。防止频繁读取会引发回流/重绘的属性,如果的确须要屡次应用,就用一个变量缓存起来。对具备简单动画的元素应用相对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。

April 10, 2021 · 1 min · jiezi

关于前端:浏览器缓存机制强缓存和协商缓存

1、为什么须要浏览器缓存?当咱们拜访同一个页面时,申请资源、数据都是须要肯定的耗时,如果能够将一些资源缓存下来,那么从第二次拜访开始,就能够缩小加载工夫,进步用户体验,也能加重服务器的压力 2、有哪些缓存?浏览器缓存分为强缓存和协商缓存,当存在缓存时,客户端第一次向服务器申请数据时,客户端会缓存到内存或者硬盘当中,当第二次获取雷同的资源,强缓存和协商缓存的应答形式有所不同。 强缓存:当客户端第二次向服务器申请雷同的资源时,不会向服务器发送申请,而是间接从内存/硬盘两头读取 协商缓存:当客户端第二次向服务器申请雷同的资源时,先向服务器发送申请"询问"该申请的文件缓存在ben'd与服务器相比是否更改,如果更改,则更新文件,如果没有就从内存/硬盘中读取 强缓存由服务器的响应头里 cache-control 和 expires 两个字段决定,协商缓存由 last-modified 和 etag两个字段决定。 3、强缓存(1) expireshttp1.0时定义的字段,示意过期工夫,格局如 expires: Mon, 29 Mar 2021 01:03:05 GMT ,示意在这个工夫之前,如果客户端须要再次获取这个资源,不会向服务器中取,会间接在缓存里读取。 (2) cache-controlhttp1.1时的字段,示意缓存的工夫长度,格局如 cache-control: max-age=2592000,单位为秒,示意可缓存的工夫是30天。cache-contorl 还有其它一些能够设置的值no-cache,示意不进行强缓存,但不影响协商缓存no-store,既不强缓存,也不协商缓存 (3) 两者的优先级:cache-control 的优先级要高于 expires 4、协商缓存(1) last-modified 与 if-modified-sincelast-modified 示意该文件上一次被批改的工夫,格局如 last-modified: Tue, 04 Aug 2020 14:54:28 GMT,当客户端第一次向服务器第一次申请时,服务器会在响应头上带上最初批改工夫 last-modified,等到第二次客户端向服务器申请同样的资源时,客户端会在申请头上的 if-modified-since带上上一次申请的 last-modifed值,服务器对最初批改工夫进行比拟,如果工夫统一,服务器返回304状态码,客户端间接在缓存中读取数据,如果不统一,服务器返回200的状态码,并更新文件 (2) etag 与 if-none-matchetag示意文件的惟一标识,格局如 etag: "5f2976a4-17d",当客户端第一次向服务器第一次申请时,服务器会在响应头上带上文件惟一标识etag,等到第二次客户端向服务器申请同样的资源时,客户端会在申请头上的 if-none-match带上上一次申请的etag值,服务器对etag进行比拟,如果工夫统一,服务器返回304状态码,客户端间接在缓存中读取数据,如果不统一,服务器返回200的状态码,并更新文件 (3) 两者有什么区别呢?etag的呈现时为了解决last-modified所存在的一些问题① 当周期性的更改文件的工夫,然而并没有更改文件的内容时,② last-modifed只能准确到秒,如果一个文件在1秒内更改了屡次,那么无奈更新到最新的数据,而etag的精确度更高③ 某些服务器不能准确的失去文件的最初批改工夫 (4) 两者如何应用last-modified与etag是能够一起应用的,服务器会优先验证etag,统一的状况下,才会持续比对last-modified,最初才决定是否返回304

March 24, 2021 · 1 min · jiezi

关于浏览器:前端面试每日-31-第701天

明天的知识点 (2021.03.17) —— 第701天 (我也要出题)[html] 写一个select下拉分组的组件[css] 说说你对:-webkit-autofill的了解[js] 写一个办法判断浏览器的标签是否在以后页面[软技能] 在线版的代码编辑器,你感觉如何?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

March 17, 2021 · 1 min · jiezi

关于浏览器:浏览器开发者工具之网络面板一

浏览器开发者工具概览 模块1.控制器 2. 过滤器过滤筛选性能。通过过滤器模块来筛选你想要的文件类型。3. 抓图信息用来剖析用户期待页面加载工夫内所看到的内容,剖析用户理论的体验状况勾选面板上的“Capture screenshots”即可启用屏幕截图。4. 工夫线用来展现 HTTP、HTTPS、WebSocket 加载的状态和工夫的一个关系用于直观感触页面的加载过程。如果是多条竖线重叠在一起,那阐明这些资源被同时被加载。5. 具体列表具体记录了每个资源从发动申请到实现申请这两头所有过程的状态,以及最终申请实现的数据信息。通过该列表,你就能很容易地去诊断一些网络问题。6. 下载信息概要下载信息概要中,你要重点关注下 DOMContentLoaded 和 Load 两个事件,以及这两个事件的实现工夫。 DOMContentLoaded,这个事件产生后,阐明页面曾经构建好 DOM 了,这意味着构建 DOM 所须要的 HTML 文件、JavaScript 文件、CSS 文件都曾经下载实现了。Load,阐明浏览器曾经加载了所有的资源(图像、样式表等)。具体列表1. 属性 2. 详细信息 3. 单个资源的工夫线 优化工夫线上耗时我的项目 参考极客工夫-《浏览器原理》 原文地址wolai掘金

March 4, 2021 · 1 min · jiezi

关于浏览器:有道写作浏览器扩展实践

有道写作浏览器扩大作为一款为网页减少英文语法批改的辅助工具,容许用户在任意网页上绝大部分的富文本编辑器、多行文本输入框中编辑英文文本,可实时失去批改后果反馈,并自行承受倡议主动批改,实现完满写作。起源/ 有道技术团队公众号作者/ 李靖雯编辑/ 刘振宇一、背景介绍有道写作服务是有道出品的写作智能批改产品,为用户提供优质的作文拼写、语法、款式方面的批改服务。有道写作不仅仅反对浏览器扩大模式,还反对在其余平台应用:例如有道词典 APP-作文批改、Web 在线端、Word 插件、PC 词典内。欢送各位体验。 http://write.youdao.com/ 浏览器插件在浏览器外面的称说是 Browser Extension,也就是浏览器扩大,是一个扩大网页浏览器性能的插件。它次要基于 HTML、JavaScript、CSS 开发,同时因为是扩大个性,能够利用浏览器自身提供的底层 API 接口进行开发,能够给所用页面或者特定页面增加一些非凡性能而不影响本来页面逻辑。 每个反对扩大的浏览器有本人下载扩大的利用商店,能够间接在利用商店下载。有些产品本人提供浏览器扩大的 .crx 文件让用户下载并装置。 二、适配浏览器有道写作在 Windows/Mac 零碎都可装置,适配 Chrome、360平安浏览器、360极速浏览器、Edge 新版浏览器等,在以上浏览器商店中搜寻有道写作,点击装置按钮即可。 三、性能介绍&成果展现在介绍开发思路与实际之前,咱们先来直观地看一下有道写作浏览器扩大的实际效果,并对其性能进行简略的介绍。 3.1 体现形式视觉效果就是,给谬误的文本字符上面画一条横线,在 hover 的时候,能够给文本减少一个高亮的成果。在选承受倡议的时候,能够替换成咱们想要的文本数据。 3.2 实用场景>>> 在线邮件编辑: 163邮箱 Outlook 邮箱 Gmail >>> 社交动静、评论: Facebook 微博动静 评论 >>> 工具、笔记类: 有道翻译 Google 翻译 石墨文档 3.3 性能介绍>>> 实时批改: 反对一边批改一边实时提供批改反馈,展现批改谬误数量。 >>> 语法检测: ![上传中...]() >>> 加强编辑框: ...

March 3, 2021 · 2 min · jiezi

关于浏览器:浏览器的重排和重绘

参考文章:https://www.html5rocks.com/zh/tutorials/internals/howbrowserswork/浏览器的高层构造1、用户界面 - 包含地址栏、后退/后退按钮、书签菜单等。2、浏览器引擎 - 在用户界面和出现引擎之间传送指令。3、渲染引擎 - 负责显示申请的内容。4、网络 - 用于网络调用,比方http申请。5、用户界面后端 - 用于绘制根本的窗口小部件。6、javascript解释器 - 用于解析和执行javascript代码。7、数据存储 - 数据长久化。 和大多数浏览器不同,Chrome 浏览器的每个标签页都别离对应一个渲染引擎实例。每个标签页都是一个独立的过程。渲染引擎主流程1、 解析 HTML 文档,构建DOM树。解析内部 CSS 文件和行内款式,生成 CSS 规定树。2、将 DOM 树和 CSS 规定树连贯在一起创立了另一个渲染树Render Tree,它是一个带有多个视觉属性的(色彩、尺寸)的矩形,这些矩形的排列程序就是它们在屏幕上的显示程序。3、开始进入“布局”解决阶段,也就是为每个节点调配一个呈现在屏幕上的确切坐标。4、“绘制”阶段,渲染引擎遍历渲染树,由用户后端层将每个节点绘制进去。 主流程示例 出现树构建在 DOM 树构建的同时,浏览器还会构建另一个树结构:出现树。这是由可视化元素依照其显示程序而组成的树,也是文档的可视化示意。它的作用是让您依照正确的程序绘制内容。 Firefox 将出现树中的元素称为“框架”。WebKit 应用的术语是出现器或出现对象。 出现器晓得如何布局并将本身及其子元素绘制进去。 每一个出现器都代表了一个矩形的区域,通常对应于相干节点的 CSS 框,它蕴含诸如宽度、高度和地位等几何信息。 重排 or 布局渲染引擎在渲染树创立实现的时候,并不蕴含地位和大小信息。计算这些值的过程称为布局或重排。HTML采纳基于流的布局模型,这意味着大多数状况下只有一次遍历就能计算出几何信息。处于流中靠后地位元素不会影响靠前地位元素的几何特色,因而布局能够依照从左往右,从上往下的程序遍历文档。坐标系是绝对于根框架而建设的,应用的是上坐标和左坐标。布局是一个递归的过程。它从根出现器<html>开始,而后递归遍历局部或所有的框架层次结构,为每一个须要计算的出现器计算几何信息。根出现器的地位右边是0,0,其尺寸为视口(也就是浏览器窗口的可见区域)。所有的出现器都会有一个“layout”或“reflow”办法,没一个出现器都会调用须要布局的子代的layout办法。** Dirty 位零碎为防止对所有细小更改都进行整体布局,浏览器采纳了一种“dirty 位”零碎。如果某个出现器产生了更改,或者将本身及其子代标注为“dirty”,则须要进行布局。有两种标记:“dirty”和“children are dirty”。“children are dirty”示意只管出现器本身没有变动,但它至多有一个子代须要布局。 全量布局和增量布局全局布局是指触发了整个出现树范畴的布局,触发起因可能包含: 影响所有出现器的全局款式更改,例如字体大小更改。屏幕大小调整。布局能够采纳增量形式,也就是只对 dirty 出现器进行布局。 全局布局往往是同步触发的。增量布局是异步执行的,webkit有用于执行增量布局的计时器:对出现树进行遍历,并对dirty出现器进行布局。 绘制在绘制阶段,零碎会便当出现树,并调用出现树的“paint”办法,将出现树的内容显示在屏幕上。绘制也分为全局绘制和增量绘制。增量绘制中,局部出现器产生了更改,然而不会影响整个树,更改后的出现器将其在屏幕上对应的矩形区域设为有效,这导致操作系统将其视为一块“dirty区域”,并生成“paint”事件。操作系统会奇妙地将多个区域合并成一个。 绘制程序绘制的程序就是元素进入堆栈款式上下文的程序。上面是css2标准的绘制流程程序: https://drafts.csswg.org/css2/#stacking-contextWithin each stacking context, the following layers are painted in back-to-front order: ...

February 24, 2021 · 2 min · jiezi

关于浏览器:DOM-元素大小

一、偏移量 (offset dimension)元素的偏移量偏移量,包含元素在屏幕上占用的所有可见空间。元素的可见大小由其高度、宽度决定,包含内容 content 大小、内边距 padding、滚动条 scrollbar 大小、边框 border 大小,不包含外边距 margin。 通过下列 4 个属性能够获得元素的偏移量: offsetHeight :元素在垂直方向上占用的空间大小,以像素计算。包含元素的高度、(可见的)程度滚动条的高度、高低边框高度。offsetWidth :元素在程度方向上占用的空间大小,以像素计算。包含元素的宽度、(可见的)垂直滚动条的高度、左右边框的宽度。offsetLeft :元素的左外边框至蕴含元素 offsetParent 的左内边框之间的像素间隔。offsetTop :元素的上外边框至蕴含元素 offsetParent 的上内边框之间的像素间隔。其中,MDN 对 offsetParent 的定义是: HTMLElement.offsetParent 是一个只读属性,返回一个指向最近的(指蕴含层级上的最近)蕴含该元素的定位元素或者最近的 table,td,th,body元素。当元素的 style.display 设置为 "none" 时,offsetParent 返回 null。offsetParent 很有用,因为 offsetTop 和 offsetLeft 都是绝对于其内边距边界的。须要补充的是,元素的 position 为 fixed 时,offsetParent 也返回 null。元素 body 的 offsetParent 也返回 null。 元素在整个页面上的偏移量:绝对于文档的坐标想要获取元素在页面上的偏移量,即元素在页面上的相对横纵坐标,能够通过累加该元素及其各层蕴含元素的 offsetTop 和 offsetLeft 即可。示例代码如下: function getElementLeft(element) { var actualLeft = element.offsetLeft; var current = element.offsetParent; while (current !== null) { actualLeft += current.offsetLeft; current = current.offsetParent; } return actualLeft;}function getElementTop(element) { var actualTop = element.offsetTop; var current = element.offsetParent; while (current !== null) { actualTop += current.offsetTop; current = current.offsetParent; } return actualTop;}须要留神的是,对于应用表格和内嵌框架布局的页面,因为不同浏览器实现这些元素的形式不同,因而失去的值不肯定可信。另外,如果其中一层蕴含元素呈现滚动条,这两个函数计算的值也不可用。 ...

February 16, 2021 · 1 min · jiezi

关于浏览器:从前端角度看浏览器加载资源的渲染过程

欲知 渲染过程,先看浏览器的组成。如有不对,欢送斧正。我也是查看很多材料,加上集体了解得出的,没找到官网正式文档,固不保障正确,欢送大家指出谬误。。 从前的我认为是这样的从前的我认为,浏览的的组成,是这样的。 但总感觉 逻辑有点不分明。 js引擎,怎么就是浏览器引擎了? 网络 和用户界面,和js 引擎 怎么就同一个级别了? js 引擎和js 解释器是什么关系?? 3个引擎之间的关系是什么?? 改良之后的浏览器组成先理解下 过程和线程,再看组成。 过程和线程的了解! 浏览器的组成 再细细讲下渲染过程,浏览器内核: 所以浏览器加载一个资源的过程是怎么的? 实践和实际相结合晓得这些有什么用?做性能优化。如 不白屏,浏览器渲染页面很快,不卡顿,等等。 直到渲染机制,所以咱们尽量减少重排;只有浏览器要下载资源,在渲染,所以咱们网络越快越好,资源越小越少。一个tcp 能够多个http 申请,申请又一系列过程,所以申请能少则少,如何少,可应用个缓存。 不能少,返回的数据能不能小一点,多余的数据不要。。。。写出高性能,优雅的代码即写出优雅的 性能较好的代码。

February 2, 2021 · 1 min · jiezi

关于浏览器:事件循环Event-loop到底是什么

摘要:本文通过联合官网文档MDN和其余博客深刻解析浏览器的事件循环机制,而NodeJS有另一套事件循环机制,不在本文探讨范畴中。process.nextTick和setImmediate是NodeJS的API,所以本文也不予探讨。首先,先理解几个概念。 Javascript到底是单线程还是多线程语言?Javascript是一门单线程语言。置信应该有不少敌人对于Javascript是单线程语言还有些疑难(题外话:之前在某次面试中遇到一个面试官,一来就是“咱们晓得JS是一门多线程语言。。。”巴拉巴拉,过后就把我给愣住了。),不是有Web Worker能够创立多个线程吗?答案就是,Javascript是单线程的,然而他的运行环境不是单线程。要如何了解这句话,首先得从Javascript运行环境比方浏览器的多线程说起。 浏览器通常蕴含以下线程: GUI渲染线程次要负责页面的渲染,解析HTML、CSS,构建DOM树,布局和绘制等。当界面须要重绘或者因为某种操作引发回流时,将执行该线程。该线程与JS引擎线程互斥,当执行JS引擎线程时,GUI渲染会被挂起。JS引擎线程该线程负责解决Javascript脚本,执行代码。负责执行待执行的事件,比方定时器计数完结,或者异步申请胜利并正确返回时,将顺次进入工作队列,期待JS引擎线程执行。该线程与GUI线程互斥,当JS线程执行Javascript脚本事件过长,将导致页面渲染的阻塞。定时器触发线程负责执行异步定时器一类函数的线程,如:setTimeout,setInterval。主线程顺次执行代码时,遇到定时器会将定时器交给该线程解决,当计数结束后,事件触发线程会将计数结束的事件回调退出到工作队列,期待JS引擎线程执行。事件触发线程次要负责将期待执行的事件回调交给JS引擎线程执行。异步http申请线程负责执行异步申请一类函数的线程,如:Promise,axios,ajax等。主线程顺次执行代码时,遇到异步申请,会将函数交给该线程解决,当监听到状态码变更,如果有回调函数,事件触发线程会将回调函数退出到工作队列,期待JS引擎线程执行。Web Worker是浏览器为Javascript提供的一个能够在浏览器后盾开启一个新的线程的API(相似下面说到浏览器的多个线程),使Javascript能够在浏览器环境中多线程运行,但这个多线程是指浏览器自身,是它在负责调度治理Javascript代码,让他们在失当机会执行。所以Javascript自身是不反对多线程的。 异步Javascript的异步过程通常是这样的: 主线程发动一个异步申请,异步工作承受申请并告知主线程已收到(异步函数返回);主线程继续执行后续代码,同时异步操作开始执行;异步操作执行实现后告诉主线程;主线程收到告诉后,执行异步回调函数。这个过程有个问题,异步工作各工作的执行工夫过程长短不同,执行实现的工夫点也不同,主线程如何调控异步工作呢?这就引入了音讯队列。 栈、堆、音讯队列栈:函数调用造成的一个由若干帧组成的栈。 堆:对象被调配在堆中,堆是一个用来示意一大块(通常是非结构化的)内存区域。 音讯队列:一个Javascript运行时蕴含了一个待处理音讯的音讯队列。每一个音讯都关联着一个用来解决这个音讯的回调函数。在事件循环期间,运行时会从最先进入队列的音讯开始解决,被解决的音讯会被移出队列,并作为输出参数来调用与之关联的函数。而后事件循环在解决队列中的下一个音讯。 事件循环Event loop理解了上述要点,当初回到主题事件循环。那么Event loop到底是什么呢? Event loop是一个执行模型,在不同的中央有不同的实现。浏览器和NodeJS基于不同的技术实现了各自的Event loop。当初明确为什么要把NodeJS排除在外了吧?同样网上很多Event loop的相干博文一来就是Javascript的Event loop,实际上说的都是浏览器的Event loop。浏览器的Event loop是在Html5标准中定义的,大抵总结如下: 一个事件循环里有很多个工作队列(task queues)来自不同工作源,每一个工作队列里的工作(task)都是严格依照先进先出的程序执行的,然而不同工作队列的工作执行程序是不确定的,浏览器会本人调度不同工作队列。也有中央把task称之为macrotask(宏工作)。标准中还提到了microtask(微工作)的概念,以下是标准论述的过程模型: 抉择以后要执行的工作队列,抉择一个最先进入工作队列的工作,如果没有工作能够抉择,则会跳转至microtask的执行步骤;将事件循环的以后运行工作设置为已抉择的工作;运行工作;将事件循环的当前任务设置为null,将运行完的工作从工作队列中移除;microtask步骤:进入microtask检查点;更新界面渲染;返回第一步。执行进入microtask检查点时,用户代理会执行以下步骤: 设置进入microtask检查点的标记为true;当事件循环的微工作队列不为空时:抉择一个最先进入microtask队列的microtask,设置事件循环以后运行工作为此microtask;运行microtask;设置事件循环以后运行工作为null,将运行完结的microtask从microtask队列中移除;对于相应事件循环的每个环境设置对象,告诉它们哪些promise为rejected;清理indexedDB的事务;设置进入microtask检查点的标记为false。由上可总结为:在事件循环中,用户代理会一直从task队列中按程序取task执行,每执行完一个task都会查看microtask队列是否为空(执行完一个task的具体标记时函数执行栈为空),如果不为空则会一次性执行完所有microtask。而后再进入下一个循环去task队列中取下一个task执行。 task/macrotask(宏工作)script(整体代码)setTimeoutsetIntervalI/OUI renderingmicrotask(微工作)Promise.then catch finallyMutationObserver来看一个例子: console.log('script start');setTimeout(function() { console.log('setTimeout');}, 0);Promise.resolve().then(function() { console.log('promise1');}).then(function() { console.log('promise2');});console.log('script end'); 运行后果是: script startscript endpromise1promise2setTimeout 那么问题来了,不是说每个事件循环开始会从task队列取最先进入的task执行,而后再执行所有microtask吗?为什么setTimeout是task却在Promise.then这个task的后面呢?反正我一开始是有这个纳闷的,很多文章都没有说分明这个具体执行的程序,大部分都是在形容标准的时候说的是“每个事件循环开始会从task队列中取一个task执行,而后再执行所有microtask”,然而也有局部文章说的是“每个事件循环开始都是先执行所有microtask”。通过自己多方查证,标准里的形容如上的确就是每个事件循环都是先执行task,那为什么下面例子外面体现进去的是先执行所有microtask呢? script(整体代码)属于task。 来看一下下面例子的具体执行过程: 事件循环开始,task队列中只有一个script,抉择script作为事件循环的已抉择工作;script按程序执行,同步代码间接输入(script start、script end);遇到setTimeout,0ms后将回调函数放入task队列;遇到Promise,将第一个then的回调函数放入microtask队列;当所有script代码执行实现后,此时函数执行栈为空,开始查看microtask队列,队列只有第一个.then的回调函数,执行输入“promise1”,因为第一个.then返回的仍然是promise,所以第二个.then的回调会放入microtask队列继续执行,输入“promise2”;此时microtask队列空了,进入下一个事件循环,查看task队列取出setTimeout回调函数,执行输入“setTimeout”,代码执行实现。这样是不是分明了?所以实际上一开始执行script代码的时候就曾经开始事件循环了,这就解释了为什么如同每次都是先执行所有的microtask。同时,这个例子中还引申出一个要点:在执行microtask工作的时候,如果又产生了新的microtask,那么会持续增加到队列的开端,且也会在这个事件循环周期执行,直到microtask队列为空为止。

January 27, 2021 · 1 min · jiezi

关于浏览器:前端面试每日-31-第640天

明天的知识点 (2021.01.15) —— 第640天 (我也要出题)[html] HTML5的Server-Sent和WebSocket如何抉择哪一个?[css] 在Less中是如何导入的?[js] 如何监听浏览器窗口大小变动?[软技能] 批改了文件并已commit,如何吊销?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

January 15, 2021 · 1 min · jiezi

关于浏览器:10步写了个Django网站正经网站

 Django做网站只有10步,真的只有10步,不信?咱们来数数…… 明天次要解说用Pycharm编辑器搭建网站,网站性能是 实现在局域网中疾速传递大文件! 比方:共事要给你个1G的文件,你丢一个网站链接给他。他上传后,文件就在你电脑啦!演示成果如下动图:从电脑F磁盘通过浏览器上传,在D盘呈现文件,这里浏览器上传文件能够在其余任意电脑上,上传文件将存于你的D盘! 装置Pycharm专业版 留神Pycharm须要装置 专业版 Django网站搭建第一步 Pycharm关上后,新建我的项目:点击左上角File文件——New Project创立我的项目弹出方框,即第二步中的图示。 第二步 创立我的项目内容,点击右边 Django ,在上方 Locattion 中输出我的项目地址+项目名称。图中我的项目地址为:" E:PyCharm Project "项目名称为" Decrypt_Test ",用""隔开!点击 "ProjectInterpreter:Python3.7" ,会开展选项如下图。抉择" Existing interpreter "(意思是已存在的解释器)在Interpreter中输出Python环境所在地址+python.exe。能够手工输出,也能够用点击左边"三个点"控件抉择文件门路。最初点击Create创立我的项目。 也能够在开展的 "ProjectInterpreter:Python3.7" 中抉择New environment using,这个是默认抉择的,为每个我的项目独自建设一个虚拟环境。老手倡议抉择此项,节俭操作步骤! 留神装置Pycharm前须要当时装置Python环境,如果不晓得装置的小伙伴能够参照 想学Python不知如何入门,教你! 文章下半段Python环境装置教程。 第三步 第二步创立实现我的项目后,会弹出如下对话框。抉择 Open in current window ,点击 OK 第四步 点击OK后,会进入到方才创立的我的项目,如下图。默认关上了settings.py和urls.py文件,对应的就是左侧文件。 点击界面左下角图标,抉择Terminal,并在光标出输出 python manage.py startapp decrypt,按enter完结后,会在我的项目左侧看见新增了一个文件夹,如下图2: 第五步 在settings.py中的找到 INSTALLED_APPS ,在中括号内新增 'decrypt.apps.DecryptConfig', 示意注册App。如下图: 在settings.py中的找到" ALLOWED_HOSTS ",在中括号内写入 "*" ,代码任意IP地址可拜访你的网站。 ...

January 14, 2021 · 1 min · jiezi

关于浏览器:13-聊聊Chrome从输入url到页面展示

3000字长文预警~ 第一关:Chrome的多过程架构:并发与并行的辨别并发:领有解决多任务的能力并行:领有同时解决多任务的能力过程与线程的辨别:作为科班生,先分享我在OS课堂上听过的,印象最深的的说法:过程是资源分配的最小单位;线程是任务调度的最小单位。 线程必须依靠于过程存在。同一过程内的线程共享过程资源。过程内一个线程解体,则该过程解体。但不会影响到操作系统。过程间通过IPC机制通信:共享内存、socket、管道通信(通过内核)Chrome的多线程架构实现:主过程×1:用户交互、子过程治理、存储管理。网络过程×1:资源加载GPU过程×1:3D渲染渲染过程xn:负责文档解析和子资源加载(每个页面都会创立一个)插件过程×n:因为插件不稳固,须要与其余过程隔离开。第二关:TCP/IP协定四层网络模型OSI七层模型与TCP/IP四层模型比照 我的了解是:OSI 是更偏重于规范性的体系结构,而 TCP/IP 则是目前网络环境中的最佳实际。 实际上在本科的课本中是形象为五层模型来讲的: 应用层(应用层+表示层+会话层)=> 传输层=> 网络层=> 链路层=> 物理层 可见具体的分层形式并不是要害,要害的是上图两头列对应的重要性能是否失去了实现。 数据包的漂泊:这是每个本科老师都十分善于讲的故事。过后听课的我并没有因这个故事而很快了解计算机网络的根本运作,但时至今日,这个例子却很好地领导了我对于计算机网络的了解。 第三关:Domain Name System(DNS)前置内容DNS的工作:对于给定的url查问其对应的ip地址。DNS的查问形式分为两种:迭代 / 递归; 浏览器向本地DNS服务器查问个别采纳递归形式;本地DNS服务器向其余服务器查问个别采纳迭代形式;DNS采纳UDP协定进行查问:疾速高效。查问过程:浏览器将URL发送给本地DNS服务器(LDNS);本地DNS服务器查找本地缓存,若存在该URL的记录且尚未过期,则返回该ip地址,DNS查问过程完结;若本地DNS服务器不存在该URL对应的记录,则迭代查找ip地址;本地DNS服务器首先向根域名服务器发送DNS报文,根域名服务器依据报文中申请的URL返回对应的顶级域名服务器地址本地DNS服务器向顶级域名服务器发送DNS报文,顶级域名服务器依据报文中申请的URL返回对应的权威服务器地址。反复以上过程直到失去最终URL对应的IP地址。本地DNS服务器将该 [ip,url] 的记录写入缓存,将ip返回。第四关:SSL协定 — HTTPSHTTPS是什么?HTTPS (http secure)= HTTP + 混合加密 + 权威认证 + 完整性保障 因为网络中对于HTTPS的详尽介绍十分丰盛,此处不进行具体地叙述了,间接奔向论断。 SSL协定运行机制网络上蕴含两种说法(3个随机数生成密钥 or 2个随机数生成密钥),但大同小异,都采纳了对称加密+非对称加密的形式: Client向Server发送:加密套件列表 + 随机数client_randomServer向Client返回:选中的加密套件 + 随机数server_random + 数字证书(带公钥)Client对数字证书进行合法性验证,若非法:产生一个随机数pre-master,并用该证书中的公钥进行加密。将加密后的数据包发送给ServerServer应用私钥对该数据包进行解密,失去pre-master此时单方利用曾经协商好的加密套件对client_random+server_random+pre-master进行加密生成对称密钥。尔后就能够应用此对称密钥进行加密通信了 第五关:TCP协定TCP协定特点面向连贯,牢靠的传输层协定。 三次握手三次握手的基本目标:确认我方和对方的发送、接管能力是否均失常三次握手过程: Client与Server都明确本身的发送和承受能力失常,须要确定对方的发送和接管能力。 第一次握手:Client向Server发送报文:SYN=1,seq=x;第二次握手:Server接管到报文,向Client发送报文:ACK=1,ack=x+1,SYN=1,seq=y;Server确认Client的发送能力失常:Client发送了SYN报文。 第三次握手:Client接管到报文,向Server发送报文:ACK=1,seq=x+1,ack=y+1。Client确认Server的发送和接管能力失常:因为Server正确地接管并响应了Client。 Server确认Client的接管能力失常:Server接管到了Client的ACK。 为什么不应用两次握手:假如舍弃最初一次握手,则Server端无奈明确Client的接管能力是否失常。 四次挥手四次握手的目标:保障单方的数据均发送结束,再敞开连贯。四次挥手过程: 第一次挥手:Client向Server发送FIN报文,表明Client不会再向Server发送数据:FIN=1,seq=x第二次挥手:Server向Client发送ACK报文示意回应:AKC=1,seq=y,ack=x+1期间Server能够持续向Client发送数据,此时处于TCP的半连贯状态; Client还须要持续监听Server发送来的报文。 第三次挥手:Server向Client发送FIN报文,表明Server不会再向Client发送数据:FIN=1,seq=z,ack=x+1第四次挥手:Client向Server发送ACK报文示意回应:ACK=1,seq=x+1,ack=z+1。同时期待2MSL,若此期间没有接管到报文,则TCP连贯顺利断开。为什么是四次挥手而不是像建设连贯时应用三次挥手?这是因为服务端在LISTEN(监听)状态下,收到建设连贯申请的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而敞开连贯时,当收到对方的FIN报文时,仅仅示意对方不再发送数据了然而还能接收数据,己方是否当初敞开发送数据通道,须要下层利用来决定,因而,己方ACK和FIN个别都会离开发送。 为什么要期待2MSL? 第四次握手,客户端收回ACK但并不会收到回应,所以客户端无奈确认本人的ACK是否顺利达到,所以此时须要期待2MSL来给服务器重发FIN报文的机会。客户端发送ACK后的1MSL内,服务器的计时器也会到时,如果因为某种原因并没有收到ACK,则会重发FIN报文。FIN文件会在1MSL内达到客户端;此时客户端的计时器还未清零,收到FIN后重启2MSL计时器并回送ACK。第五关:ARP协定定义地址解析协定,是通过解析ip地址来寻找MAC地址的一个在网络协议包中十分重要的网络传输协定。ARP属于链路层协定。工作过程同一网段:播送查问 -> 单播回应不同网段:播送查问 -> 单播回应 -> 网关直达 -> 反复参考:https://juejin.cn/post/6890167829984149518从输出URL到页面展现产生了什么?浏览器侧:用户输出url由浏览器判断地址栏中的字符串是否合乎url命名规定。若不合乎则将该字符串交由搜索引擎解决;若正当则进入第二步。 构建HTTP报文GET url HTTP/1.1 ...

January 13, 2021 · 1 min · jiezi

关于浏览器:前端面试每日-31-第622天

明天的知识点 (2020.12.28) —— 第622天 (我也要出题)[html] 说说你对H标签在布局中的重要性的了解[css] Sass脚本反对哪些数据类型?[js] 写一个办法js将数组对象中某个属性值雷同的对象合并成一个新对象[软技能] 浏览器缓存什么时候会呈现如下状况:from disk、from memory?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 28, 2020 · 1 min · jiezi

关于浏览器:浏览器缓存的这些知识点你都清楚吗

一、浏览器缓存根本意识分为强缓存和协商缓存 1、浏览器在加载资源时,先依据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器间接从本人的缓存中读取资源,不会发申请到服务器。比方某个css文件,如果浏览器在加载它所在的网页时,这个css文件的缓存配置命中了强缓存,浏览器就间接从缓存中加载这个css,连申请都不会发送到网页所在服务器。 2、当强缓存没有命中的时候,浏览器肯定会发送一个申请到服务器,通过服务器端根据资源的另外一些http header验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个申请返回,然而不会返回这个资源的数据,而是通知客户端能够间接从缓存中加载这个资源,于是浏览器就又会从本人的缓存中去加载这个资源。 强缓存与协商缓存的共同点是:如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;区别是:强缓存不发申请到服务器,协商缓存会发申请到服务器。 当协商缓存也没有命中的时候,浏览器间接从服务器加载资源数据。 二、强缓存的原理2.1 介绍当浏览器对某个资源的申请命中了强缓存时,返回的http状态为200,在chrome的开发者工具的network外面size会显示为from cache,比方京东的首页里就有很多动态资源配置了强缓存,用chrome关上几次,再用f12查看network,能够看到有不少申请就是从缓存中加载的 强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来示意资源在客户端缓存的有效期。 Expires是http1.0提出的一个示意资源过期工夫的header,它形容的是一个相对工夫,由服务器返回,用GMT格局的字符串示意,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT- 2.2 Expires缓存原理1、浏览器第一次跟服务器申请一个资源,服务器在返回这个资源的同时,在respone的header加上Expires,如 2、浏览器在接管到这个资源后,会把这个资源连同所有response header一起缓存下来(所以缓存命中的申请返回的header并不是来自服务器,而是来自之前缓存的header) 3、浏览器再申请这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟以后的申请工夫比拟,如果申请工夫在Expires指定的工夫之前,就能命中缓存,否则就不行 4、如果缓存没有命中,浏览器间接从服务器加载资源时,Expires Header在从新加载的时候会被更新 Expires是较老的强缓存治理header,因为它是服务器返回的一个相对工夫,在服务器工夫与客户端工夫相差较大时,缓存治理容易呈现问题,比方随便批改下客户端工夫,就能影响缓存命中的后果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个绝对工夫,在配置缓存的时候,以秒为单位,用数值示意,如:Cache-Control:max-age=315360000- 2.3 Cache-Control缓存原理1、浏览器第一次跟服务器申请一个资源,服务器在返回这个资源的同时,在respone的header加上Cache-Control,如: 2、浏览器在接管到这个资源后,会把这个资源连同所有response header一起缓存下来 3、浏览器再申请这个资源时,先从缓存中寻找,找到这个资源后,依据它第一次的申请工夫和Cache-Control设定的有效期,计算出一个资源过期工夫,再拿这个过期工夫跟以后的申请工夫比拟,如果申请工夫在过期工夫之前,就能命中缓存,否则就不行 4、如果缓存没有命中,浏览器间接从服务器加载资源时,Cache-Control Header在从新加载的时候会被更新 Cache-Control形容的是一个绝对工夫,在进行缓存命中的时候,都是利用客户端工夫进行判断,所以相比拟Expires,Cache-Control的缓存治理更无效,平安一些。 这两个header能够只启用一个,也能够同时启用,当response header中,Expires和Cache-Control同时存在时,Cache-Control优先级高于Expires: = 三、强缓存的治理后面介绍的是强缓存的原理,在理论利用中咱们会碰到须要强缓存的场景和不须要强缓存的场景,通常有2种形式来设置是否启用强缓存1、通过代码的形式,在web服务器返回的响应中增加Expires和Cache-Control Header 2、通过配置web服务器的形式,让web服务器在响应资源的时候对立增加Expires和Cache-Control Header 比方在javaweb外面,咱们能够应用代码设置强缓存还能够通过java代码设置不启用强缓存 nginx和apache作为业余的web服务器,都有专门的配置文件,能够配置expires和cache-control,这方面的常识,如果你对运维感兴趣的话,能够在百度上搜寻nginx 设置 expires cache-control或 apache 设置 expires cache-control 都能找到不少相干的文章。 因为在开发的时候不会专门去配置强缓存,而浏览器又默认会缓存图片,css和js等动态资源,所以开发环境下常常会因为强缓存导致资源没有及时更新而看不到最新的成果,解决这个问题的办法有很多,罕用的有以下几种 解决缓存带来的问题 1、间接ctrl+f5,这个方法能解决页面间接援用的资源更新的问题 2、应用浏览器的隐衷模式开发 3、如果用的是chrome,能够f12在network那里把缓存给禁掉(这是个十分无效的办法) 4、在开发阶段,给资源加上一个动静的参数,如css/index.css?v=0.0001,因为每次资源的批改都要更新援用的地位,同时批改参数的值,所以操作起来不是很不便,除非你是在动静页面比方jsp里开发就能够用服务器变量来解决(v=${sysRnd}),或者你能用一些前端的构建工具来解决这个参数批改的问题 5、如果资源援用的页面,被嵌入到了一个iframe外面,能够在iframe的区域右键单击从新加载该页面,以chrome为例 6、如果缓存问题呈现在ajax申请中,最无效的解决办法就是ajax的申请地址追加随机数 7、还有一种状况就是动静设置iframe的src时,有可能也会因为缓存问题,导致看不到最新的成果,这时候在要设置的src前面增加随机数也能解决问题 8、如果你用的是grunt和gulp、webpack这种前端工具开发,通过它们的插件比方grunt-contrib-connect来启动一个动态服务器,则齐全不必放心开发阶段的资源更新问题,因为在这个动态服务器下的所有资源返回的respone header中,cache-control始终被设置为不缓存 四、强缓存的利用强缓存是前端性能优化最无力的工具,没有之一,对于有大量动态资源的网页,肯定要利用强缓存,进步响应速度。通常的做法是,为这些动态资源全副配置一个超时工夫超长的Expires或Cache-Control,这样用户在拜访网页时,只会在第一次加载时从服务器申请动态资源,其它时候只有缓存没有生效并且用户没有强制刷新的条件下都会从本人的缓存中加载,比方后面提到过的京东首页缓存的资源,它的缓存过期工夫都设置到了2026年 ...

November 19, 2020 · 1 min · jiezi

详解浏览器跨域的几种方法

摘要:本文针对浏览器的跨域个性,做一下深刻介绍,以便咱们在进行WEB前端开发和测试时,对浏览器跨域个性有全面的了解和把握。1 前言在WEB前端开发中,咱们常常会碰到“跨域”问题,最常见的就是浏览器在A域名页面发送B域名的申请时会被限度。跨域问题波及到WEB网页安全性问题,使用不当会造成用户隐衷泄露危险,但有时业务上又须要进行跨域申请。如何正确的应用跨域性能,既能满足业务需要,又可能满足安全性要求,显得尤为重要。 本文针对浏览器的跨域个性,做一下深刻介绍,以便咱们在进行WEB前端开发和测试时,对浏览器跨域个性有全面的了解和把握。 2 背景常识介绍2.1 同源政策1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都履行这个政策。 最后,它的含意是指,A 网页设置的 Cookie,B 网页不能关上,除非这两个网页“同源”。所谓“同源”指的是“三个雷同”: 协定雷同域名雷同端口雷同同源政策的目标,是为了保障用户信息的平安,避免歹意的网站窃取数据。 构想这样一种状况: A 网站是一家银行,用户登录当前,A 网站在用户的机器上设置了一个 Cookie,蕴含了一些隐衷信息(比方贷款总额)。用户来到 A 网站当前,又去拜访 B 网站,如果没有同源限度,B 网站能够读取 A 网站的 Cookie,那么隐衷信息就会透露。更可怕的是,Cookie 往往用来保留用户的登录状态,如果用户没有退出登录,其余网站就能够假冒用户,随心所欲。因为浏览器同时还规定,提交表单不受同源政策的限度。由此可见,同源政策是必须的,否则 Cookie 能够共享,互联网就毫无平安可言了。 以后,如果非同源,共有三种行为受到限制: Cookie、LocalStorage 和 IndexDB 无奈读取DOM 无奈取得AJAX 申请不能发送2.2 为什么要有跨域限度Ajax 的同源策略次要是为了避免 CSRF(跨站申请伪造) 攻打,如果没有 AJAX 同源策略,相当危险,咱们发动的每一次 HTTP 申请都会带上申请地址对应的 cookie,那么能够做如下攻打: 用户登录了本人的银行页面 mybank.com,mybank.com向用户的cookie中增加用户标识。用户浏览了歹意页面 evil.com。执行了页面中的歹意AJAX申请代码。evil.com向http://mybank.com发动AJAX HTTP申请,申请会默认把http://mybank.com对应cookie也...。银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回申请数据。此时数据就泄露了。而且因为Ajax在后盾执行,用户无奈感知这一过程。DOM同源策略也一样,如果 iframe 之间能够跨域拜访,能够这样攻打: 做一个假网站,外面用iframe嵌套一个银行网站 mybank.com。把iframe宽高啥的调整到页面全副,这样用户进来除了域名,别的局部和银行的网站没有任何差异。这时如果用户输出账号密码,咱们的主网站能够跨域拜访到http://mybank.com的dom节点,就能够拿到用户的输出了,那么就实现了一次攻打。所以有了跨域拜访限度之后,咱们才可能平安的上网。 3 浏览器跨域的解决方案3.1 CORS规范CORS 是一个 W3C 规范,全称是跨域资源共享(CORSs-origin resource sharing),它容许浏览器向跨源服务器,收回XMLHttpRequest申请。 其实,精确的来说,跨域机制是阻止了数据的跨域获取,不是阻止申请发送。 CORS须要浏览器和服务器同时反对。目前,所有浏览器都反对该性能,IE浏览器不能低于IE10。 https://caniuse.com/#search=cors 整个CORS通信过程,都是浏览器主动实现,不须要用户参加。对于开发者来说,CORS通信与同源的AJAX通信没有差异,代码齐全一样。浏览器一旦发现AJAX申请跨源,就会主动增加一些附加的头信息,有时还会多出一次附加的申请,但用户不会有感觉。 ...

July 13, 2020 · 2 min · jiezi

各大浏览器本地实现跨域模式

chromemac笔记本 1.彻底敞开chrome浏览器,从程序坞中右击彻底敞开。2.关上终端输出一下命令open -n -a /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --args --user-data-dir="/tmp/chrome\_dev\_test" --disable-web-security firefox装置 "CORS Everywhere"扩大程序 safari1.safari -> 偏好设置 -> 高级 -> 选中“在菜单中显示’开发‘菜单” 2.在“开发”菜单中选中“进行跨源限度”

July 9, 2020 · 1 min · jiezi