js 性能优化之快速响应的用户界面

发布时间 - 2026-01-10 23:04:51    点击率:

用于执行JavaScript和更新用户界面的进程通常被称为“浏览器UI线程”。JavaScript和用户界面更新在同一个进程中运行,因此一次只能处理一件事情。 

·任何JavaScript任务都不应当执行超过100毫秒,过长的运行时间导致UI更新出现明显延迟,从而会影响用户体验。 

·浏览器有两类限制JavaScript任务的运行时间的机制,调用栈大小限制(即记录自脚本开始以来执行的语句的数量)和长时间运行脚本限制(记录脚本执行的总时长,超时的时候会有弹框提示用户[chrome没有单独的程云霞脚本限制,替代做法是依赖其通用奔溃检测系统来处理此类问题])。

一些优化JavaScript任务时间的常见做法:

①使定时器让出时间片段

1.使用定时器处理数组。当处理过程不须同步,数据不须按顺序处理时。即可考虑用定时器分解任务。

如:

function processArray(items,process,callback){
 var todo = items.concat();
 setTimeout(function(){
 process(todo.shift());
 
 if(todo.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback(items);
 }
 },25);
}
var items = [1,2,3];
function output(value){
 console.log(value);
} 
processArray(items,outputValue,function(){
 console.log('finished output!')
});

②分割任务

如果一个函数的运行时间过长,那么可以把它拆分为一系列能在较短时间内完成的子函数。

如:

function multistep(steps,args,callback){
 var tasks = steps.concat();
 setTimeout(function(){
 var task = tasks.shift();
 task.apply(null,args||[]);
 
 if(tasks.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback();
 }
 },25);
}
function saveDocument(id){
 var tasks = [open,write,close];
 multistep(tasks,[id],function(){
 console.log('finished!');
 })
} 

③记录代码的运行时间

有时每次只执行一个任务的效率不高,且在两次之间产生25ms的延迟就更不好了。所以可以添加时间检测机制来改进processArray()方法。

如:

function timeProcessArray(items,process,callback){
 var todo = items.concat();
 setTimeout(function(){
 var start = +new Date();
 do{
 process(todo.shift());
 }while(todo.length > 0 &&(+new Date() - start < 50)) ;
 if(todo.length > 0){
 setTimeout(arguments.callee,25);
 } else {
 callback(items);
 }
 },25);
}

注意,定时器虽然可以提高性能,但是过度使用会适得其反。需要控制web应用中的使用数量。

④使用Worker

Web Worker是新版浏览器支持的特性,它允许在UI线程外部执行JavaScript代码,从而避免锁定UI。

参考资料:http://www.alloyteam.com/2015/11/deep-in-web-worker/

备注:

个人觉得,Worker的缺陷还是太多了。用不起来,而且要慎用。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # 性能优化  # Web性能优化系列 10个提升JavaScript性能的技巧  # 整理AngularJS框架使用过程当中的一些性能优化要点  # javascript性能优化之事件委托实例详解  # nodejs的10个性能优化技巧  # JS性能优化笔记搜索整理  # js性能优化技巧  # web性能优化之javascript性能调优  # js性能优化 如何更快速加载你的JavaScript页面  # JS 网站性能优化笔记  # js 性能优化之算法和流程控制  # 会有  # 都不  # 长时间  # 两次  # 把它  # 能在  # 时间内  # 适得其反  # 不高  # 添加时间  # 此类  # 被称为  # 就更  # 参考资料  # 两类  # 一件事情  # 时长  # 较短  # 检测系统  # 一个函数 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  高性能网站服务器部署指南:稳定运行与安全配置优化方案  再谈Python中的字符串与字符编码(推荐)  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel如何使用Collections进行数据处理?(实用方法示例)  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  jquery插件bootstrapValidator表单验证详解  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何用已有域名快速搭建网站?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Android使用GridView实现日历的简单功能  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Swift中循环语句中的转移语句 break 和 continue  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  浅谈redis在项目中的应用  如何用PHP快速搭建高效网站?分步指南  Bootstrap CSS布局之列表  如何快速搭建高效WAP手机网站吸引移动用户?  WEB开发之注册页面验证码倒计时代码的实现  网站建设整体流程解析,建站其实很容易!  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  浅析上传头像示例及其注意事项  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  iOS中将个别页面强制横屏其他页面竖屏  iOS正则表达式验证手机号、邮箱、身份证号等  香港服务器部署网站为何提示未备案?  如何在IIS7上新建站点并设置安全权限?  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  如何在七牛云存储上搭建网站并设置自定义域名?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Java遍历集合的三种方式  Laravel如何使用.env文件管理环境变量?(最佳实践)  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在橙子建站上传落地页?操作指南详解  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何在IIS中新建站点并配置端口与IP地址?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  使用C语言编写圣诞表白程序  JavaScript实现Fly Bird小游戏