首页 文章 精选 留言 我的

精选列表

搜索[优化],共10000篇文章
优秀的个人博客,低调大师

Mozilla 正在优化 Firefox 在 macOS 上的使用体验

根据外媒 Softpedia 的报道,Mozilla 正在致力于改进 Firefox 在所有平台上的使用体验,并且在最近发布的 Nightly 版本提供了一系列专门针对 Apple 用户的改进。也就是说,Mozilla 希望 Firefox 能提供原生般的体验。 Mozilla 最近证实了 macOS 版本的 Firefox 现在支持挤压动画效果,这实际上是用户在滚动页面时到达网站顶部和底部时看到的动画。 此外,Mozilla 表示它还在为 macOS 版本的 Firefox 开发一个增强的黑暗模式,用户目前已经可以通过在 Nightly 版本中设置名为 widget.macos.respect-system-appearance 的选项来启用它。 事实上,在苹果生态中,一个备受期待的更新是对原生全屏模式的全面支持,这对于那些使用浏览器观看视频的用户来说显然更方便,无论是在 YouTube 还是其他平台。Mozilla 称目前正在努力让 Firefox 在 macOS 上支持原生全屏,通过设置full-screen-api.macos-native-full-screen 的选项即可启用。用户还可以将全屏 YouTube 视频放置在另一个应用程序旁边的原生“分屏”中。 由于目前这些改进只在 Nightly 版本提供,进入稳定版还需要一段时间,因此如果希望尝试请下载 Firefox Nightly 版本。

优秀的个人博客,低调大师

Facebook 将对 React 的优化实现到了浏览器!

点上方蓝字关注公众号「前端从进阶到入院」 精选原创好文、进阶交流群助你进入大厂 想要提高一个网页的加载速度是非常困难的,如果你的网站是在使用 JavaScript 渲染的内容,你必须要在网页的加载速度和网页的输入响应能力之间作出权衡: 一次性执行首屏需要执行的逻辑(负载性能好,输入响应能力差) 将复杂的逻辑拆分成更小块的任务执行,以保证对外界输入的响应(负载性能差,输入响应能力好) 为了避免这种取舍,Facebook 在 Chromium 中提出并实现了 isInputPending() API,它可以提高网页的响应能力,但是不会对性能造成太大影响。 目前 isInputPending API 仅在 Chromium 的 87 版本开始提供,其他浏览器并未实现。 背景 在现今的 JavaScript 生态中,大多数工作都是在一个线程完成的:主线程。这种设计为开发者提供了一个健壮的执行模型,但是如果脚本执行的时间太长,则用户体验(尤其是响应能力)可能会遭受严重损失。例如,用户正在输入一些内容时, JavaScript 正在执行大量的逻辑,则在这些逻辑完成之前,浏览器都不能处理用户的输入事件。 现在的最佳实践是通过将复杂的逻辑拆分成更小块的任务执行来解决这种问题。在页面加载期间,页面可以运行一些 JavaScript 逻辑,然后将控制权转交给浏览器,这时浏览器可以检测自己的事件队列,看看是不是需要响应用户输入,然后再继续运行 JavaScript ,这种方式虽然会有一些帮助,但是同时也可能会带来其他问题。 每次页面将控制权交还给浏览器时,浏览器都会花费一些时间来检查它的事件队列,处理完事件后再获取下一个 JavaScript 代码逻辑。当浏览器更快地响应事件时,页面的整体加载时间会变慢。而且,用户输交互比较多的情况下,页面加载会非常慢。如果我们不那么频繁地进行上面的过程,那么浏览器响应用户事件所花费的时间就会更长。 Facebook 提出的 isInputPending API 是第一个将中断的概念用于浏览器用户交互的的功能,并且允许 JavaScript 能够检查事件队列而不会将控制权交于浏览器。 下面我们来具体看一个例子。 一个例子 假设您需要做很多显示阻塞的工作来加载页面,例如,从组件生成标记,分解质数或仅绘制一个很酷的加载微调器。这些中的每一个都分解为一个离散的工作项。使用调度程序模式,让我们勾勒出如何在假设的processWorkQueue()函数中处理我们的工作: 假设你再首屏加载页面时要处理非常多的阻塞逻辑,例如从组件生成标记,分解质数,或者只是绘制一个很酷的加载器动画。这些逻辑都会被分解成一个独立的工作项。使用 scheduler 模式,让我们在一个假设的 processWorkQueue() 函数中处理我们的逻辑: constDEADLINE=performance.now()+QUANTUM;while(workQueue.length>0){if(performance.now()>=DEADLINE){//Yieldtheeventloopifwe'reoutoftime.setTimeout(processWorkQueue);return;}letjob=workQueue.shift();job.execute();} 通过 processWorkQueue() 延时链式调用 setTimeout(),我们使浏览器能够在某种程度上保持对输入的响应,同时仍然在相对不间断地运行。但是,可能需要很长时间才能完成其他需要控制事件循环的工作,或者使 QUANTUM 事件延迟增加一毫秒。 在RAIL模型下,QUANTUM 一个好的值是<50ms,这取决于要完成的工作类型。该值主要决定了处理能力和延迟之间的平衡。 但是,我们还可以做的更好: constDEADLINE=performance.now()+QUANTUM;while(workQueue.length>0){if(navigator.scheduling.isInputPending()||performance.now()>=DEADLINE){//Yieldifwehavetohandleaninputevent,orwe'reoutoftime.setTimeout(processWorkQueue);return;}letjob=workQueue.shift();job.execute();} 通过调用 navigator.scheduling.isInputPending(),我们可以更快地响应输入,同时仍然确保我们的阻塞逻辑能够不间断地执行。如果在完成这些逻辑之前对用户交互(例如绘画)以外的其他操作不感兴趣,则可以方便地增加输入的长度 QUANTUM。 默认情况下,“连续”的事件类型不会返回 isInputPending(),比如 mousemove,pointermove 等等。如果你对这些也感兴趣的话,没问题。可以通过为 isInputPending() 提供一个包含连续变量为true的字典: constDEADLINE=performance.now()+QUANTUM;constoptions={includeContinuous:true};while(workQueue.length>0){if(navigator.scheduling.isInputPending(options)||performance.now()>=DEADLINE){//Yieldifwehavetohandleaninputevent(anyofthem!),orwe'reoutoftime.setTimeout(processWorkQueue);return;}letjob=workQueue.shift();job.execute();} 像 React 这样的框架正在将 isInputPending() 使用类似的逻辑构建到其核心调度库中。希望这将使使用这些框架的开发人员能够从幕后的 isInputPending() 中受益,而不要进行重大的重写。 React Fiber 让我们回想下 React Fiber 中的时间分片: 把一个耗时长的任务分成很多小片,每一个小片的运行时间很短,虽然总时间依然很长,但是在每个小片执行完之后,都给其他任务一个执行的机会,这样唯一的线程就不会被独占,其他任务依然有运行的机会。 React Fiber 把更新过程碎片化,执行过程如下面的图所示,每执行完一段更新过程,就把控制权交还给 React 负责任务协调的模块,看看有没有其他紧急任务要做,如果没有就继续去更新,如果有紧急任务,那就去做紧急任务。 如果你对该库感兴趣,可以到 https://github.com/WICG/is-input-pending 参与反馈和讨论。 参考:https://web.dev/isinputpending/ 不得不说 React 团队还是非常强的,一个 JavaScript 库能带动浏览器的发展。虽然这还是第一个由 Facebook 贡献给浏览器的能力,不过未来可期,让我们期待更多更强大的 API 吧! 1.关注「前端从进阶到入院」,获取我分类整理的原创精选面试热点文章。 2. 加我好友,拉你进氛围贼好的前端进阶讨论群,2021 陪你一起度过。 分享给你的朋友是最好的支持~ 本文分享自微信公众号 - 前端从进阶到入院(code_with_love)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册