前端网络、JavaScript优化以及开发小技巧

news2024/10/1 7:39:51

一、网络优化

YSlow有23条规则,中文可以参考这里。这几十条规则最主要是在做消除或减少不必要的网络延迟将需要传输的数据压缩至最少

1)合并压缩CSS、JavaScript、图片,静态资源CDN缓存

通过构建工具Gulp,可以在开发的时候就将合并压缩的事情一起做掉。

之所以要做合并压缩是因为:HTTP 1.x不允许一个连接上的多个响应数据交错到达(多路复用),因而一个响应必须完全返回后,下一个响应才会开始传输。

也就是说即使客户端同时发送了两个请求,而且CSS资源先准备就绪,服务器也会先发送HTML响应,然后再交付CSS

使用CDN是为了让用户访问的时候能用最近的资源,减少来回传输时间。

HTTP2.0改进了HTTP1.x很多方面。

2)CSS放顶部,JavaScript放底部

CSS可以并行下载,而JavaScript加载之后会造成阻塞。

但凡事还是会有例外,如果把行内脚本放在样式表之后,会明显地延迟资源的下载(结果是样式表下载完成并且行内脚本执行完毕时,后续资源才能开始下载)。

这是因为行内脚本可能含有依赖于样式表中样式的代码,比如document.getElementsByClassName()。

<head>
  <link rel="stylesheet" href="css/all-normal.css" type="text/css" />
</head>
<body>
  <div id="content"></div>
  <script>
    var content = '';
    for(i=1; i<1000000; i++)
        content += '写入页面';
    document.getElementById('content').innerHTML = content;
  </script>
  <img src="data:images/ui.png" />
</body>

 

下面通过Chrome的工具查看下:

3)优化DNS解析,减少重定向

在做一个“女神评选活动”的时候,需要在微信中访问能够获取用户的openid,微信获取用户基本信息是需要经过几个步骤的:

先获取code,再通过code获取openid,最后再跳转访问静态页面。

由于公司将业务分成了多个小组,所以短短的三步其实需要三个小组配合,需要重定向多个域名

下图是未优化前的瀑布图,但不是最坏情况,有时候访问到静态页面需要经过10多秒,完全不能接受,下图中会跳转4个域名

 

后面不跳index那个域名,直接跳转到微信操作域名,减少一个域名的跳转,各小组代码再做优化,但效果还是不理想,仅仅快了几秒。

最后发现其实是在与微信的服务器做交互的时候,DNS解析花了太多时间!不得已,在服务器的host中添加一条记录,直接通过IP指向。

下图是最终优化结果,虽然达不到秒开,但至少可以接受了:

二、JavaScript优化

1)图片预加载

在做一个“秋名山活动”的时候,使用了图片预加载。这个活动中有120多张图片。

流程很简单,就是答题,最后给评论结果,再分享出去。

    

如果一下子加载那么多图片,一定是愚蠢的想法,最后决定,在页面载入的时候先加载一些通用图片。

在答题的时候当前页面,预先加载后面页面中的图片,防止访问页面的时候直接不展示图片,图片也做了适当的合并。

将网站地址放在gtmetrix.com测试,下面是最终的瀑布图,可以发现图片都在其他静态资源的后面,这样能尽早的展现页面给用户:

优化还远远没有结束,在Chrome中分别模拟了good 2G、good 3G以及4G后,有结果的情况并不理想。

good 2G:

  

good 3G:

  

4G:

  

还有很大的优化空间可以做,关于这个预加载的原理,可以参考《图片预加载与懒加载》

2)减少分支

在写业务逻辑的时候,经常会用到if else,switch之类的逻辑判断,如果每次都做这么多判断,很容易影响性能。

所以可以通过多种方式来避免过多的判断。

1. 惰性模式

这是在看《JavaScript设计模式》的时候看到的。

减少每次代码执行时的重复性分支判断,通过对对象重定义来屏蔽原对象中的分支判断。

惰性模式分为两种:第一种文件加载后立即执行对象方法来重定义,第二种是当第一次使用方法对象时来重定义。

公司有个页面要提供给第三方APP,但是最终发现第三方APP不能使用localStorage缓存,最终只得做兼容的方式。

但为了避免每次引用方法的时候都做判断,就使用加载后立即重定义:

var getFn = function() {
  if (sore.enabled)
    return sore.get;
  return cookie.get;
}();
var setFn = function() {
  if (sore.enabled)
    return sore.set;
  return cookie.set;
}();

2. 建立映射关系

页面中经常需要弹出框提示,后面就自己做了一个,但弹出框会有很多款式。

如果用简单工厂模式创建的话,免不了switch分支判断,后面就直接用赋不同的key,还能缓存起来,只初始化一次。

/**
 * 弹出框单例模式
 */
var factories = {};
var DialogFactory = function(type, options) {
  if (factories[type])
    return factories[type];
  return factories[type] = new iDialog(options);
};
/**
 * 提示框
 */
var Alert = function(content, options) {
  var d = DialogFactory('alert', options);
  //其他逻辑省略
  return d;
};
/**
 * 确认框
 */
var Confirm = function(content, options) {
  var d = DialogFactory('confirm', options);
  //其他逻辑省略
  return d;
};

3)第三方代码异步加载

第三方代码,例如百度统计、微信SDK等,这些完全可以在将业务资源加载完后再添加。

/**
 * 百度统计设置
 */
util.baidu = function(key) {
  global._hmt = global._hmt || [];
  (function() {
    var hm = document.createElement("script");
    hm.src = "//hm.baidu.com/hm.js?" + key;
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
};

4)cookie与localStorage缓存

有了缓存后,就能减少与服务器的通信,在本地操作。

公司有个查违章的业务,在本地添加好车辆后,再次进入页面的时候就需要能直接选择事先添加好的车辆。

最理想的方式就是添加好后,就在本地缓存起来,下次进入直接调取缓存。

  

我会优先使用localStorage,下面的表格就是对比:

cookie

localStorage

数据生命周期

可设置失效时间除非被清除,否则永久保存

数据大

大约4KB大约5M

与服务器通信

每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 不参与和服务器的通信

本地存储,之前的历史大概如下图所示:

localStorage在浏览器兼容方面,IE8居然也支持了。

5)事件委托

使用事件委托技术能让你避免对特定的每个节点添加事件监听器。

事件监听器是被添加到它们的父元素上,通过事件冒泡,触发执行。

在开发的时候,经常会出现动态添加元素的情况。

如果每次都重新绑定一次事件,那会有很多多余操作,而绑定在此元素的父级,就只需绑定一次即可。

document.getElementById('ul').onclick = function(e) {
  var e = e || window.event,
    tar = e.target || e.srcElement;
  if (tar.nodeName.toLowerCase() == 'li') {
    tar.style.background = 'black';
  }
}

6)节流与去抖动

节流(throttle):预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期。

例如mousemove 事件、window对象的resize和scroll事件。

去抖动(debounce):当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。

例如文本输入keydown 事件,keyup 事件,做autocomplete等。

节流与去抖动最大的不同的地方就是在计算最后执行时间的方式上。著名的开源工具库underscore中有内置了两个方法。

在做公司内部的一个系统的时候,需要方希望在左右滚动表格的时候,能将第一列固定在最左边,方便查看。

为了让操作能更流畅,我再这里用了节流,有些浏览器会出现卡顿,就得需要增加周期时间。

三、小技巧

1)在手机中打印变量

在移动页面的时候经常需要调试字段,又不能用console.log,每次alert的话,碰到对象就看不到内容了。

只能自己写个小方法来打印出来,JSON.stringify,通过这个方法能够方便的实现功能。

var print = function(obj, space) {
  space = space || 4;
  var html = JSON.stringify(obj, null, space);
  html = html.replace(/\n/g, '<br>').replace(/\s/g, '&nbsp');
  var pre = document.createElement('pre');
  var div = document.createElement('code');
  pre.style.cssText = 'border:1px solid #000;padding:10px;background:#FFF;margin-bottom:20px;';
  div.innerHTML = html;
  pre.appendChild(div);
  var body = document.querySelector('body');
  body.insertBefore(pre, body.children[0]);
};
 
print({a:1, b:'demo', c:{text:'content'}});

 

2)chrome插件JSON-handle

服务器返回的很多都是JSON格式的数据,通常写好后给你个接口,顺便给你几个demo参数。

在浏览器中打开后,就是一串字符串,但要给人看的话,就得格式化一下了,这个插件就是用来让人看的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDPS教程:机器人工作站导出为JT格式文件操作方法

目录 功能简介 功能注意事项 导出JT格式文件操作 导出JT格式文件查看 功能简介 PDPS软件不仅能够从外部导入JT格式的模型文件&#xff0c;还能够将创建好的机器人工作站/生产线导出为JT格式的模型文件。这个能够导出JT格式文件的功能就是“Export JT”命令。 使用“Expor…

零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

本篇博客会讲解力扣“2710. 移除字符串中的尾随零”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是示例&#xff1a; 以下是提示&#xff1a; 本题的思路是&#xff1a; 先遍历字符串&#xff0c;找到字符串末尾的\0。从\0开始&#xff0c;向前遍历&a…

如何写一篇让人挑不出毛病的产品需求文档?

需求”这个词是产品经理工作中的常客&#xff0c;产品需求文档也贯穿于整个产品经理的日常工作中&#xff0c;本周小编将通过什么是产品需求文档&#xff0c;产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD&#xff0c;让需求文档助力产品…

30分钟开发微信小程序并部署

30分钟开发微信小程序并部署 首先&#xff0c;今天我们会使用到腾讯为我们提供的云平台来协助我们小程序的开发和部署。 环境准备&#xff1a; 微信开发者账号&#xff08;自己在微信公众号平台注册一个账号&#xff09;&#xff1a;https://mp.weixin.qq.com/&#xff0c;同时…

arp欺骗(http)与dns欺骗

Arp欺骗 win7&#xff1a; ip:192.168.127.147 mac:00-0C-29-4F-1C-36 kali: ip:192.168.127.133 mac:00:0c:29:4c:4d:92 arp -a 获取网关 网关&#xff1a;ip&#xff1a;192.168.127.0 mac&#xff1a;00-0c-29-4c-4d-92 fping -g 192.168.127.0/24 192.168.127.1…

在华为眼里,ICT行业今年还有啥搞头?

大家好&#xff0c;我是老杨。 不知道你们有没有研究年报的习惯&#xff0c;一些超大厂是会每年发布年报的&#xff0c;而从年报里&#xff0c;你能看出很多行业趋势出来。 以最热门的华为举例&#xff1a; 每年&#xff0c;华为都会发布全年财报&#xff0c;对自己今年的整…

什么是低代码?国内常见的低代码平台有哪些?

一、什么是低代码开发&#xff1f; 低代码也称之为无代码或是 aPaas。要想了解低代码是什么&#xff0c;我们先来讨论低代码本质&#xff1f; 它是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。 图形用户界面和拖放功能使开发过程的各个方面自动化…

【大数据之Hive】三、Linux下安装MySQL8.0.33

1 安装MySQL &#xff08;1&#xff09;解压MySQL安装包: tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql&#xff08;2&#xff09;卸载系统自带的mariadb&#xff1a; sudo rpm -qa | grep mariadb | xargs sudorpm -e --nodeps&#xff08;3&am…

快速上手 SpringBoot 单元测试

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是单元测试&#xff1f;单元测试有哪些好处SpringBoot 单元测试使用单元测试的实现步骤生成单元测试类添加单元测试代码 …

rsync+inotfy实时同步

rsyncinotfy实时同步 目录 一、服务器端 二、客户端 一、服务器端 1、安装网站服务&#xff0c;启动&#xff0c;但是不写首页文件 yum -y install httpd 2、安装raync服务 yum -y install rsync 3、修改主配置文件 &#xff08;/etc/rsyncd.conf&#xff09; uid root gi…

transformer的dataset下载失败load_dataset(“glue“,“mrpc“)

下载的时候会报错https://huggingface.co/datasets/glue/resolve/main/glue.py这个路径无法下载&#xff0c;但是浏览器是可以打开的 所以&#xff0c;先去官网手动下载文件 然后让模型去读取&#xff0c;默认是会读取TRANSFORMERS_CACHE中的内容&#xff0c;不过在c盘&#x…

Ex-ChatGPT本地部署+Azure OpenAI接口配置+服务器部署

Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分&#xff0c;Ex-ChatGPT启动后是个web服务&#xff0c;通过访问ip端口体验&#xff1b; WebChatGPTEnhance可编译生成一个浏览器插件&#xff0c;Chrome或者Microsoft edge浏览器可以安装该插件&#xff0c;点击该插…

【Python入门篇】——Python中循环语句(循环中断break和continue)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!

前言 在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码…

【系统工具】Rundll32:Windows系统中的神奇工具,你知道吗?

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ Rundll32的使用使用方法 - cmd使用方法 - 运行窗口/任务管理器/资源管理器 2️⃣ 常见应用场景运行js或vbs的脚本代码执行命令绕过杀毒软件的作法&#xff1f;修改注册表增加一个服务修复Internet Explorer其它常见命令 3️⃣ 原理…

使用LoRA对大语言模型LLaMA做Fine-tune

使用LoRA对大语言模型LLaMA做Fine-tune 前言下载配置环境模型的训练 Fine-tune模型的使用 Inference参考 前言 目前有大量对LLM&#xff08;大语言模型&#xff09;做Fine-tune的方式&#xff0c;不过需要消耗的资源非常高&#xff0c;例如 Stanford Alpaca: 对LLaMA-7B做Fine-…

springboot + vue3实现视频播放Demo(video.js Vue3-video-play)

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…

物联网GPRS模块流量计算

物联网GPRS模块流量计算 MQTT(消息队列遥测传输) 是ISO 标准下一个基于TCP/IP的消息发布/订阅传输协议。 一、TCP消耗流量计算 以太网数据包结构&#xff1a; 以太网首部 IP首部 TCP首部 APPL首部 用户数据 以太网尾部 以太网首部为14个字节 IP首部为20个字节 TCP首部…

阿里云对象oss

1\RAM 首页 https://ram.console.aliyun.com/overview 点击用户进去 点击里面的一个用户&#xff0c;然后新建 id 和secret 上面灰色按钮&#xff0c;因为我已经绑定了两个。 "yourAccessKeyId", "yourAccessKeySecret" 这两个参数就对应上了 // 阿里云账…

【详解Collection接口、迭代器和Colletions工具类】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 &#x1f440;Collection接口的常用方法 &#x1f4a8;…