FAQ?
解释浏览器标准模式和怪异模式
标准模式(也称为严格模式)是浏览器按照HTML和CSS规范处理网页的模式。这意味着浏览器将尽力显示HTML和CSS的正确解释,遵循最新的W3C规范和推荐。在标准模式下,浏览器会使用严格的布局和渲染规则,比如盒模型、块级盒和行框盒等等。
而怪异模式(也称为混杂模式或兼容模式)则是浏览器使用较为宽松的规则渲染网页的模式,在这种模式下,浏览器可能会用自己的方式处理HTML和CSS,而不是遵循W3C标准。这种模式源于早期浏览器中对HTML和CSS支持的限制,保留了对这些旧网页的支持。
要理解网页在什么模式下,可以查看浏览器的开发者工具,并检查标头元素是否有声明DTD(文档类型),因为这将定义页面的模式。浏览器在默认情况下通常会尝试切换到标准模式,但是在某些情况下,它可能会自动切换到怪异模式,特别是当网页中有错误时。因此,开发人员应该尽量编写符合HTML和CSS标准的代码,以便在不同的浏览器中以标准模式呈现网页。
chrome浏览器一般哪些进程
当用户打开一个新的标签页(Tab)时,Chrome 浏览器通常会创建一个新的渲染进程。以下是一般情况下 Chrome 浏览器中的各个进程:
- 浏览器进程 (Browser Process):负责浏览器的界面显示、用户交互、子进程管理,以及通过 IPC 与渲染进程、插件进程、网络进程等通信。
- 渲染进程 (Renderer Process):渲染网页,每个标签页都有一个独立的渲染进程,用于处理网页 V8 引擎、JavaScript 执行、布局和绘制等任务,以保证页面的流畅性和响应速度。因为渲染进程具有很高的权限,可以访问用户的敏感信息,所以 Chrome 浏览器通过沙盒机制,将每个渲染进程限制在自己的进程空间内,防止恶意代码对系统造成危害。渲染进程中还包括以下类型的子进程:
- 主渲染进程(Main Renderer Process):包括浏览器界面、地址栏等元素。
- 子渲染进程(Sub Renderer Process):渲染网页的具体内容。
- GPU渲染进程(GPU Process):处理 GPU 相关任务,例如 3D 加速等。
- 插件进程 (Plugin Process):用来运行 NPAPI 插件,每种插件对应一个插件进程。
- GPU进程 (GPU Process):处理与 GPU 相关的任务,例如 WebGL。
- 网络进程 (Network Process):负责处理网络请求和响应,以及路由功能。
- 绑定进程 (Utility Process):负责解析运行 Chrome 浏览器内部页面协议(chrome://),以及一些外部插件服务。
- 扩展进程 (Extension Process):负责运行 Chrome 扩展(Extension)应用程序
Chrome 浏览器中有以下几种线程
- 主线程(Main Thread):也称 UI 线程,是唯一运行在浏览器进程中的线程,负责用户界面、输入事件、JavaScript 执行和页面交互等。
- I/O 线程(I/O Thread):负责处理大部分浏览器事件(如鼠标点击、键盘输入等)的输入输出操作,同时管理浏览器的文件缓存。
- 渲染线程(Render Thread):渲染进程中的子线程,负责网页的渲染,以及与 GPU 进程交互和通信,而具体的页面 JavaScript 执行任务则由该线程进程提交到 V8 引擎线程中执行。
- V8 引擎线程(V8 Thread):负责 JavaScript 代码在渲染线程中的执行,包括脚本解析、执行和垃圾回收等。
- 网络线程(Network Thread):浏览器进程中的子线程,负责所有的网络请求和响应,与网络进程进行通信。
- GPU 线程(GPU Thread):GPU 进程中的线程,负责处理图像的呈现和渲染任务。
这些线程都是在各自的进程中启动的,通过进程间通信(IPC)机制来相互协作,实现浏览器的各项功能。其中,主线程、I/O 线程、网络线程、GPU 线程均由浏览器进程启动,而渲染线程和 V8 引 擎线程则是由渲染进程启动。
有哪些可能引起前端安全的问题?
-
跨站脚本攻击(XSS):攻击者通过注入恶意脚本代码,使得网站在用户浏览器中执行这些脚本,从而窃取用户信息、篡改页面内容等。
-
跨站请求伪造攻击(CSRF):攻击者利用受害者已经登录的身份,在用户不知情的情况下发送恶意请求,执行未授权的操作。
-
点击劫持攻击:攻击者将目标网站嵌入在一个透明的覆盖层下,诱使用户在不知情的情况下点击恶意按钮或链接,从而触发未预期的操作。
-
不安全的数据传输:未使用加密协议(如HTTPS)传输敏感数据,导致数据被拦截和篡改。
-
不当使用第三方库和插件:使用不受信任或过时的第三方库和插件,可能存在漏洞或安全问题,导致被攻击者利用。
-
不当处理用户输入:未对用户输入进行充分验证和过滤,导致存在代码注入或其他安全漏洞。
-
不当配置安全策略:未正确配置内容安全策略(CSP)、跨域资源共享(CORS)等安全策略,导致恶意脚本或资源的加载。
-
不安全的身份验证和授权:使用不安全的方式进行用户身份验证和授权,如明文存储密码、不合理的会话管理等。
-
敏感信息泄露:在页面或代码中不当处理敏感信息,导致信息泄露,如将敏感信息直接存储在浏览器端或日志中。
-
过度信任客户端:未进行合适的输入验证和权限验证,使得客户 端可能发送恶意请求或绕过验证。
网络劫持有哪几种,如何防范?
-
DNS劫持:攻击者篡改DNS解析过程,将域名解析到错误的IP地址上。防范方法包括:
- 使用可信赖的DNS解析服务提供商。
- 配置DNSSEC(DNS安全扩展)来验证域名解析的完整性。
- 定期检查DNS解析配置,确保没有异常。
-
ARP劫持:攻击者在本地网络中发送虚假的ARP(地址解析协议)响应,将合法的IP地址映射到攻击者的MAC地址上。防范方法包括:
- 使用虚拟专用网络(VPN)来加密通信,阻止ARP劫持。
- 配置网络设备,限制网络中ARP响应的广播范围。
- 定期检查网络设备,确保没有异常。
-
HTTP劫持:攻击者篡改HTTP通信,截取或修改数据流量。防范方法包括:
- 使用HTTPS加密协议来保护通信的安全性。
- 配置响应头部中的安全策略,如Strict-Transport-Security(STS)和Content-Security-Policy(CSP)。
- 定期检查网站的通信安全性,确保没有异常。
-
WiFi劫持:攻击者通过伪造WiFi热点或中间人攻击等方式窃取用户的信息。防范方法包括:
- 连接可信赖的WiFi网络,避免连接未知或不受信任的WiFi热点。
- 使用VPN来加密通信,阻止中间人攻击。
- 关闭WiFi自动连接功能,手动选择要连接的网络。
-
MITM攻击(中间人攻击):攻击者在通信的两端之间插入自己,窃取信息或篡改通信内容。防范方法包括 :
- 使用加密通信协议,如HTTPS、SSL/TLS等,防止信息被窃取或篡改。
- 验证服务端的数字证书,确保与合法的服务端进行通信。
- 尽量避免使用公共的、不安全的网络进行敏感操作。
浏览器渲染进程的线程有哪些
-
主线程(Main Thread):也称为渲染线程或UI线程,负责处理用户交互、执行 JavaScript 代码、布局计算和渲染页面等任务。
-
GUI 渲染线程:负责将渲染进程接收到的绘制命令转化为页面的可视输出,包括绘制窗口、处理图像和文字等。
-
JavaScript 引擎线程:负责解析和执行 JavaScript 代码,例如 V8 引擎线程。
-
定时器线程(Timer Thread):负责处理定时器相关的任务,包括 setTimeout、setInterval 等。
-
事件触发线程(Event Thread):负责处理事件的派发和监听,例如用户交互事件、网络请求的响应等。
-
异步 HTTP 请求线程:负责发送网络请求和接收响应数据。
-
Web Worker 线程:Web Worker 是运行在后台的独立线程,可以进行一些耗时的计算任务,与主线程相互独立。
僵尸进程和孤儿进程是什么?
僵尸进程:当一个进程的执行完成,但其父进程尚未对其进 行处理(即尚未调用 wait() 或类似的系统调用来获取该进程的退出状态),该进程就会变成僵尸进程。僵尸进程不再执行任何代码,但仍然存在于进程表中,以记录其退出状态,直到其父进程对其进行处理。僵尸进程不会占用任何系统资源,但如果大量积累,可能会消耗一定的进程表资源。
孤儿进程:当一个父进程先于其子进程退出时,子进程就会成为孤儿进程。孤儿进程的父进程 ID 变为 1(通常为 init 进程),由 init 进程接管其管理。孤儿进程不会引起系统问题,因为它已经有一个新的父进程来管理它。
如何实现浏览器内多个标签页之间的通信?
-
Cookies:通过在不同标签页之间共享和读取同一域名下的 Cookie 数据来进行通信。每个标签页可以读取和修改共享的 Cookie 值,从而实现简单的通信。
-
LocalStorage/SessionStorage:使用浏览器的本地存储机制,如LocalStorage或SessionStorage,来存储和读取共享数据。不同标签页可以通过监听Storage事件来感知到其他标签页对存储的更改。
-
Broadcast Channel API:通过Broadcast Channel API实现跨标签页的消息广播和监听。该API允许在同一域名下的不同标签页之间发送消息,并通过事件订阅机制接收消息。
-
SharedWorker:使用SharedWorker作为中间代理,不同标签页可以通过与共享的Worker进行通信,实现跨标签页的消息传递。
-
IndexedDB:利用浏览器的IndexedDB提供的数据库存储功 能,不同标签页可以读取和写入同一数据库中的数据,以实现数据共享和通信。
-
Window.postMessage():使用Window.postMessage()方法,通过向其他窗口发送消息和监听消息事件来实现跨标签页的通信。这种方式可以在不同域名和跨源的窗口之间进行通信。
点击刷新按钮或者按 F5、按 Ctrl+F5 (强制刷新)、地址 栏回车有什么区别?
点击刷新按钮或者按 F5:浏览器直接对本地的缓存文件过期,但是 会带上 If-Modifed-Since,If-None-Match,这就意味着服务器会对 文件检查新鲜度,返回结果可能是 304,也有可能是 200。 用户按 Ctrl+F5(强制刷新):浏览器不仅会对本地文件过期,而且 不会带上 If-Modifed-Since,If-None-Match,相当于之前从来没有 请求过,返回结果是 200。 地址栏回车: 浏览器发起请求,按照正常流程,本地检查是否过期, 然后服务器检查新鲜度,最后返回内容。
点击刷新按钮或按 F5:这两种方式是浏览器的标准刷新操作,它们会向服务器发送一个请求,请求页面的最新版本。如果服务器设置了缓存策略,浏览器会检查缓存的页面是否过期,如果过期或者没有缓存,则会重新加载页面。
按 Ctrl+F5(强制刷新):这个快捷键组合会强制浏览器忽略缓存,无论服务器返回的响应是否被缓存,都会向服务器发送一个新的 请求,获取最新版本的页面。它会忽略浏览器缓存和代理服务器缓存,始终获取最新内容。
地址栏回车:在地址栏中输入网址并按下回车,也会向服务器发送一个请求,获取页面的最新版本。如果服务器设置了缓存策略,浏览器会根据缓存是否过期来判断是否重新加载页面。
总结:
-
点击刷新按钮或按 F5:默认刷新方式,会根据缓存策略来决定是否使用缓存。
-
按 Ctrl+F5(强制刷新):强制忽略缓存,总是重新请求最新版本的页面。
-
地址栏回车:与点击刷新按钮类似,根据缓存策略来决定是否使用缓存。
这些刷新方式在页面的展示效果上并没有区别,区别主要在于是否强制忽略缓存,获取最新的页面内容。在开发过程中,使用不同的刷新方式可以帮助我们检查缓存是否正常工作,或者强制获取最新的代码变更。
前端储存的⽅式有哪些?
- cookies: 在 HTML5 标准前本地储存的主要⽅式,优点是兼容性好, 请求头⾃带 cookie⽅便,缺点是⼤⼩只有 4k,⾃动请求头加⼊cookie浪费流量,每个 domain 限制 20 个 cookie,使⽤起来麻烦,需要⾃ ⾏封装;
- localStorage:HTML5 加⼊的以键值对(Key-Value)为标准的⽅式, 优点是操作⽅便,永久性储存(除⾮⼿动删除),⼤⼩为 5M,兼容 IE8+ ;
- sessionStorage:与 localStorage 基本类似,区别是 sessionStorage 当⻚⾯关闭后会被清理,⽽且与 cookie、localStorage 不同,他不 能在所有同源窗⼝中共享,是会话级别的储存⽅式;
- Web SQL:2010 年被 W3C 废弃的本地数据库数据存储⽅案,但是主流 浏览器(⽕狐除外)都已经有了相关的实现,web sql 类似于 SQLite, 是真正意义上的关系型数据库,⽤sql进⾏操作,当我们⽤JavaScript 时要进⾏转换,较为繁琐;
- IndexedDB:是被正式纳⼊HTML5 标准的数据库储存⽅案,它是 NoSQL 数据库,⽤键值对进⾏储存,可以进⾏快速读取操作,⾮常适合 web 场景,同时⽤JavaScript 进⾏操作会⾮常便。
标准模式和怪异模式
标准模式(Standard Mode)和怪异模式(Quirks Mode)是浏览器在渲染 HTML 页面时采用的两种不同的渲染模式。它们主要区别于页面的渲染规则和解析方式。
-
标准模式(Standard Mode):
- 也称为严格模式(Strict Mode)或标准兼容模式(Standards Mode)。
- 在标准模式下,浏览器会按照 HTML 和 CSS 规范进行页面的渲染和排版。
- 开发者应该优先考虑在标准模式下编写网页,以确保页面在不同浏览器中一致地呈现。
-
怪异模式(Quirks Mode):
- 也称为混杂模式(Compatibility Mode)或怪异兼容模式(Quirks Compatibility Mode)。
- 在怪异模式下,浏览器会尝试模拟早期浏览器的渲染行为,以保持旧网站的兼容性。
- 怪异模式可能导致页面在不同浏览器中呈现不一致,同时也可能影响到一些现代特性的使用。
如何触发这两种模式取决于页面的 <!DOCTYPE>
声明:
- 如果 HTML 文档中包含了有效的
<!DOCTYPE>
声明,且声明符合标准,浏览器会进入标准模式。 - 如果缺少
<!DOCTYPE>
声明,或者声明不完整或不规范,浏览器可能会进入怪异模式。
使用标准模式有助于确保页面按照当前的 HTML 和 CSS 规范进行渲染,而怪异模式可能导致页面的渲染方式与标准模式下不一致。因此,在编写网页时,建议始终提供合适的 <!DOCTYPE>
声明,以确保页面以标准模式渲染。
DOCTYPE(⽂档类型) 的作⽤
浏览器渲染页面的两种模式(可通过 document.compatMode 获取.
CSS1Compat:标准模式(Strick mode),默认模式,浏览器使用 W3C 的标准解析渲染页面。在标准模式中,浏览器以其支持的最高标准呈 现页面。
BackCompat:怪异模式(混杂模式)(Quick mode),浏览器使用自己的 怪异模式解析渲染页面。在怪异模式中,页面以一种比较宽松的向后 兼容的方式显示。
DOCTYPE
(文档类型)是位于 HTML 文档开头的声明,用于指示浏览器使用哪个 HTML 版本解析文档。它的作用主要包括以下几个方面:
-
文档解析模式选择:
DOCTYPE
声明告诉浏览器使用哪种文档解析模式来解析页面。不同的 HTML 版本有不同的解析规则和特性,DOCTYPE
声明帮助浏览器选择正确的解析模式,确保页面以正确的方式呈现。 -
文档验证: 一些 HTML 编辑器和工具可以使用
DOCTYPE
声明来验证文档的结构和格式是否符合规范。这有助于开发者编写符合标准的 HTML 代码。 -
浏览器兼容性: 不同浏览器对 HTML 版本和解析模式的支持可能有所不同。通过提供正确的
DOCTYPE
声明,可以确保页面在各种浏览器中以一致的方式呈现。 -
触发标准模式: 在标准模式下,浏览器会按照 HTML 和 CSS 规范进行页面渲染。如果缺少
DOCTYPE
声明或使用了过时的声明,浏览器可能会进入怪异模式(Quirks Mode),导致页面的渲染方式与标准模式不一致。 -
性能优化: 使用正确的
DOCTYPE
声明有助于浏览器更快地解析和渲染页面,提升页面加载性能。
常见的 DOCTYPE
声明包括以下几种:
- HTML5:
<!DOCTYPE html>
- HTML 4.01 Strict:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- HTML 4.01 Transitional:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- XHTML 1.0 Strict:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- XHTML 1.0 Transitional:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
正确使用 DOCTYPE
声明可以确保页面在不同浏览器和设备上以一致的方式呈现,提升页面的可靠性和性能。
HTML 语义化的理解
HTML 语义化是指在编写 HTML 代码 时,使用合适的标签来明确表达文档的结构和内容,使页面具有更好的可读性、可访问性和搜索引擎优化性能。语义化的 HTML 代码能够传达更多的信息,有助于开发者和浏览器正确地理解页面的结构和内容。
以下是 HTML 语义化的一些重要理解点:
-
合适的标签选择: 选择合适的 HTML 标签来表示不同的内容元素,如使用
<h1>
到<h6>
标签表示标题的层级,使用<p>
标签表示段落,使用<ul>
和<ol>
表示列表等。 -
结构清晰: 使用语义化的标签可以将页面的结构清晰地呈现出来,使开发者和维护者更容易理解页面的布局和内容。
-
可访问性: 语义化的 HTML 代码可以提升网页的可访问性,使屏幕阅读器等辅助技术更容易解读页面内容,从而使残障用户能够获得更好的浏览体验。
-
搜索引擎优化: 语义化的 HTML 代码有助于搜索引擎理解页面的内容,提升页面在搜索结果中的排名,从而增加网站的曝光度。
-
未来兼容性: 使用语义化的标签可以保证页面在未来的 HTML 版本中仍然能够正确显示和解释,增加代码的可维护性。
-
样式和脚本分离: 通过为不同类型的内容使用不同的标签,可以将样式和脚本与内容分离,使页面结构更清晰,易于管理。
总之,HTML 语义化是一种良好的编码实践,可以提升网页的质量和可用性,同时也有助于开发者更好地组织和维护代码。
浏览器是如何对 HTML5 的离线储存资源进行 管理和加载?
HTML5 引入了离线储存(Offline Storage)的功能,主要通过使用应用程序缓存(Application Cache)来实现。应用程序缓存允许开发者定义一组资源,这些资源可以在用户离线时被浏览器缓存下来,从而实现离线访问。
浏览器对 HTML5 离线储存资源进行管理和加载的过程如下:
-
定义应用程序缓存清单(Cache Manifest): 开发者需要在网页中创建一个文本文件,通常命名为
manifest.appcache
,用于定义哪些资源需要被缓存。 -
设置 HTML 标签属性: 在 HTML 页面中,需要在
<html>
标签中添加manifest
属性,指向定义的清单文件。例如:<html manifest="manifest.appcache">
。 -
浏览器解析清单文件: 当用户访问页面时,浏览器会解析指定的清单文件,其中列出了需要离线缓存的资源,包括 HTML、CSS、JavaScript、图片等。
-
缓存资源: 浏览器会根据清单文件中定义的资源列表,将这些资源下载并缓存到本地。这些资源会在用户离线时使用。
-
更新资源: 当用户访问页面时,浏览器会检查清单文件中的资源是否有更新。如果有更新,浏览器会下载更新的资源并进行更新。这可以通过在清单文件中修改版本号等方式来触发。
-
离线访问: 当用户离线时,他们仍然可以访问缓存的资源,包括页面、样式、脚本等, 使网页在断网或网络不稳定的情况下也能正常显示。
需要注意的是,应用程序缓存在一些方面存在一些限制和缺点,例如缓存容量受限、更新资源困难等。另外,由于安全性问题,现代的网络标准越来越倾向于使用 Service Worker 来实现更强大、灵活的离线访问和缓存控制。
localStorage 和 cookie 到底哪个更安全
TODO