进程是cpu资源分配最小单位,线程是进程最小调度单位。 在我们的操作系统中,有许多许多的进程,操作系统每干一件事儿就会交给一个进程去做,比如打开音乐就是一个进程。而每个进程里又包含了许多的线程,例如打开了音乐播放器,放一首歌,就是一个新的线程,切换下一首,可能又是另外一个线程。总之他俩之间的关系就是一个进程包含多个线程。
浏览器一般都是多进程,每开一个tab页,就是一个新的进程。这也就是为什么一个tab页崩溃了不会影响到整个浏览器崩溃。他主要分为以下几个进程:
1、主进程:只有一个,负责调度主控整个浏览器
2、插件进程:每个插件都有一个进程,只在插件被调用的时候创建
3、GPU进程:只有一个,负责3d绘制
4、渲染进程:每个tab页一个,负责网页的渲染,脚本的执行和事件的处理等。这个进程也是前端最需要了解的进程。
要了解渲染进程,那就得从他有几个线程开始。
渲染进程主要有以下几个线程:
1、GUI线程:负责页面的构建和渲染,当页面需要被绘制的时候就会启动这个线程,要注意的是,他和js引擎线程是互斥的,不能并行执行
2、js引擎线程:负责解析和执行js脚本,因为他和GUI线程的互斥性,所以js代码是会导致页面渲染不连贯的,也就是常说的阻塞页面渲染
3、事件触发线程:归属于浏览器,而不是js引擎,他主要就是控制事件循环,将一系列的任务加入一个队列等js引擎空闲下来后去执行
4、定时器线程:管理定时器的计时,等时间到了就把事件推入任务队列,等待js引擎执行
5、异步http请求线程:每发送一个请求就会开启一个新的线程,等待响应后把回调函数推入任务队列,等js引擎执行。
以上几个就是渲染进程的主要线程。其实通过上述的了解我们就可以大概明白了,js的代码执行顺序为什么是那样,可以简单的认为只有同步代码是第一时间就在js引擎线程里去执行的,其他的例如宏任务,微任务,等都是由别的线程管理,当满足条件后才将代码交给js引擎去执行。
1、首先浏览器会去解析html文件,构建DOM树,然后解析css,生成css树。
2、等DOM树和css树都构建好了之后,会将两者合并,生成最终的render树
3、接着去布局render树,计算位置 尺寸。然后再绘制render树。
4、最后将各层的信息发送给GPU,GPU合成渲染层最终呈现出页面。
在浏览器的渲染过程中还有两个钩子会被触发,他们就是load事件和DOMcontentloaded事件
那二者有什么区别呢?
DOMcontentloaded事件会在dom树构建完成之后(不包括样式表,图片等)就执行,而load事件会在渲染完毕后被执行。所有前者是先于后者执行的
首先看一下浏览器的渲染流程图

可以看到,DOM的加载和css的加载时并行执行的,所以理论上来说css是不会阻塞dom渲染的,但是最终的渲染是需要dom树和css树共同生成一个render树,就算dom树构建好了,但是css树没构建好,那也没办法渲染页面。所以css的加载不会阻塞但是css的解析又是会阻塞页面渲染的。
回流指的时当元素发生大小位置上的变化,引起整个结构也变化了这个时候浏览器就会触发回流,重绘则是元素的颜色背景色等不影响布局变化的地方发生了变化,就会触发重绘。
回流一定触发重绘,但重绘不一定触发回流。
那平时应该怎么尽量避免这两个问题呢?
1、尽量把操作dom的过程统一执行,以减少回流重绘的次数
2、把需要多次操作的dom先display:none,操作完在展示出来
3、使带有动画的dom脱离文档流
4、尽量使用偏移量transform去代替left top等位移属性
5、使用一些能触发GPU加速的样式代替原来的写法
说完了html,css,当然还要聊一聊最重要的js环节了。
看完上面这些内容我们大概已经知道了,js为什么会阻塞页面渲染,那有没有什么办法避免呢。
首先了解以下script标签上的async和defer两个属性
async:异步加载js文件,他会在异步加载完成之后立即执行js文件,所以还是会阻塞后续的dom渲染。
defer:也是异步加载,他和async不同的是,他加载完成之后不会立即执行,而是会等到DOM树构建完毕DOMcontentloaded执行之前再去执行脚本。
并且因为async加载就执行的特点,导致async加载js文件时无序的,这可能会出现当某个js需要依赖上一个js的时候,上一个js还没加载过来的问题。而defer则时有序的执行js,会按照你书写的script标签顺序去执行。
好啦,了解完这么多,应该就明白了为什么通常js要放在页面的底部引入。只要记住GUI渲染线程和js线程是互斥的就能回答大部分阻塞的问题了
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
如何检查浏览器控制台是否有错误?例如,我用Selenium开发了浏览器(chrome或firefox),我用SeleniumWebDriver做了一些操作。之后我想知道Web控制台中是否有任何错误。 最佳答案 我试着像这样处理控制台错误:defcheck_console_logconsole_log=@browser.driver.manage.get_log(:browser)ifconsole_log!=nilraise(console_log)endend并将其记录到文件中defwrite_log(file_path)work
是否有一个SASS扩展可以采用SASS样式表,找到中性属性(例如border-radius)并为其输出所有特定于供应商的属性(例如-webkit-border-radius等)自动?我真的不想手动创建所有混入,也不想手动编写代码。我确定一定有这样的扩展名,但我找不到它。帮忙? 最佳答案 有一个非常好的gem可以满足您的需求。它叫做Bourbon它不会用特定于供应商的css替换您的css,因为它可以像SASS一样工作。它基本上是一个正确生成跨浏览器css的mixin集合。 关于ruby-用
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在rubyonrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ