在网站开发中,性能和安全同样重要。一个加载缓慢的网站会失去用户,一个存在安全漏洞的网站会带来更大风险。今天我们来探讨几个关键的前端优化技术。
懒加载也叫延迟加载,指的是在长页面中,只有当图片进入可视区域时才加载它们。这种做法能显著提升页面性能。
想象一个图片很多的页面,如果一次性加载所有图片,会消耗大量带宽和系统资源。但用户刚开始只能看到第一屏的内容,下面的图片暂时看不到。懒加载就是让这些暂时看不到的图片先不加载,等用户滚动到相应位置时再加载。
提升加载速度:只加载当前需要的图片,页面初次加载更快。
节省流量:用户可能不会滚动看完所有内容,未浏览的图片就不会加载。
减轻服务器压力:减少不必要的图片请求。
懒加载的核心思路很简单:图片不直接设置src属性,而是用>代码实现
class LazyLoader {
constructor() {
this.images = document.querySelectorAll('img[>);
this.init();
}
init() {
this.checkImages();
window.addEventListener('scroll', () => this.checkImages());
window.addEventListener('resize', () => this.checkImages());
}
isInViewport(img) {
const rect = img.getBoundingClientRect();
return (
rect.top <= window.innerHeight &&
rect.bottom >= 0 &&
rect.left <= window.innerWidth &&
rect.right >= 0
);
}
loadImage(img) {
const src = img.getAttribute('>);
if (!src) return;
img.src = src;
img.removeAttribute('>);
img.onload = () => {
img.style.opacity = '1';
};
}
checkImages() {
this.images.forEach(img => {
if (this.isInViewport(img)) {
this.loadImage(img);
}
});
}
}
// 使用示例
document.addEventListener('domContentLoaded', () => {
new LazyLoader();
});对应的html结构:
<img >="image1.jpg" alt="图片1" style="opacity: 0; transition: opacity 0.3s;">
<img >="image2.jpg" alt="图片2" style="opacity: 0; transition: opacity 0.3s;">回流:当页面布局发生变化时,浏览器需要重新计算元素的位置和大小,这个过程叫回流。
重绘:当元素的外观样式改变,但不影响布局时,浏览器只需要重新绘制元素,这叫重绘。
重要提示:回流一定会引起重绘,但重绘不一定会引起回流。
改变窗口大小
修改字体大小
改变元素内容
调整元素尺寸
操作css类名
读取某些布局属性(如offsetWidth、scrollTop等)
添加或删除可见的DOM元素
改变颜色属性
调整背景图片
修改边框样式
改变透明度
调整阴影效果
减少DOM操作:多次DOM操作合并为一次。
// 不推荐
for (let i = 0; i < 100; i++) {
document.body.appendChild(document.createElement('div'));
}
// 推荐
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
fragment.appendChild(document.createElement('div'));
}
document.body.appendChild(fragment);避免频繁读取布局信息:
// 不推荐
const width = element.offsetWidth;
element.style.width = width + 10 + 'px';
const height = element.offsetHeight;
element.style.height = height + 10 + 'px';
// 推荐
const width = element.offsetWidth;
const height = element.offsetHeight;
element.style.width = width + 10 + 'px';
element.style.height = height + 10 + 'px';使用transform和opacity:这些属性不会触发回流。
// 性能更好
element.style.transform = 'translateX(100px)';
element.style.opacity = '0.5';防抖的意思是:在事件触发后等待一段时间,如果在这段时间内事件再次触发,就重新计时。
适用场景:
搜索框输入联想
表单验证
窗口大小调整
function debounce(func, wait, immediate = false) {
let timeout;
return function executedFunction(...args) {
const context = this;
const later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
// 使用示例
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(function(e) {
console.log('搜索:', e.target.value);
// 这里执行搜索请求
}, 500));节流的意思是:在一定时间间隔内,只执行一次函数调用。
适用场景:
页面滚动事件
鼠标移动事件
游戏中的按键处理
function throttle(func, limit) {
let inThrottle;
let lastFunc;
let lastRan;
return function(...args) {
const context = this;
if (!inThrottle) {
func.apply(context, args);
lastRan = Date.now();
inThrottle = true;
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(function() {
if (Date.now() - lastRan >= limit) {
func.apply(context, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
}
// 使用示例
window.addEventListener('scroll', throttle(function() {
console.log('处理滚动');
// 滚动时的处理逻辑
}, 200));JPEG:适合照片类图片,支持压缩。
PNG:适合需要透明度的图片,质量无损。
WebP:现代格式,压缩率更高,支持透明度和动画。
SVG:矢量格式,适合图标和简单图形。
响应式图片:
<img
srcset="image-320w.jpg 320w,
image-480w.jpg 480w,
image-800w.jpg 800w"
sizes="(max-width: 320px) 280px,
(max-width: 480px) 440px,
800px"
src="image-800w.jpg"
alt="示例图片">CSS替代图片:很多装饰性效果可以用CSS实现。
/* 用CSS实现渐变背景,代替图片 */
.gradient-bg {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
/* 用CSS实现图标 */
.icon-check {
width: 20px;
height: 20px;
border: 2px solid #4CAF50;
border-top: none;
border-right: none;
transform: rotate(-45deg);
}Base64编码小图片:对于小于2KB的图片,可以转成Base64嵌入CSS中。
缓存配置:
module.exports = {
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
cacheDirectory: true
}
}
]
}
};代码分割:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
};按需引入:
// 不推荐
import _ from 'lodash';
// 推荐
import debounce from 'lodash/debounce';压缩代码:
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
};转义用户输入:
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
// 使用示例
const userInput = '<script>alert("xss")</script>';
document.getElementById('content').innerHTML = escapeHtml(userInput);添加Token验证:
// 在请求头中添加Token
fetch('/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': getCSRFToken()
},
body: JSON.stringify(data)
});
function getCSRFToken() {
return document.querySelector('meta[name="csrf-token"]').getAttribute('content');
}// 监控页面性能
window.addEventListener('load', () => {
setTimeout(() => {
const perfData = performance.timing;
const loadTime = perfData.loadEventEnd - perfData.navigationStart;
const domReadyTime = perfData.domContentLoadedEventEnd - perfData.navigationStart;
console.log('页面加载时间:', loadTime, 'ms');
console.log('DOM准备时间:', domReadyTime, 'ms');
// 可以发送到监控系统
// sendToAnalytics({ loadTime, domReadyTime });
}, 0);
});前端性能优化是一个持续的过程,需要根据实际项目情况选择合适的优化方案。记住这些要点:
图片懒加载能显著提升长页面性能
减少回流和重绘可以改善页面响应速度
防抖和节流能有效控制函数执行频率
选择合适的图片格式可以减小资源体积
Webpack优化能提升开发体验和产品性能
安全防护是必不可少的一环
这些优化技术结合起来使用,能够让你的网站更快、更安全、用户体验更好。在实际项目中,建议先测量再优化,找到真正的性能瓶颈,有针对性地进行改进。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
为解决JS加载速度慢,采用js的延时加载,和动态加载。由于js的堵塞特性,当浏览器在加载javascript代码时,不能同时做其他任何事情,如果javascript执行时间越久,浏览器等待响应的时间就越久。
如何提高CSS性能,根据页面的加载性能和CSS代码性能,主要表现为: 加载性能 (主要是从减少文件体积,减少阻塞加载,提高并发方面入手),选择器性能,渲染性能,可维护性。
css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行。这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在css加载完成之后才进行dom的渲染以及执行后面的js语句。
性能十分重要。然而,我们真的知道性能瓶颈具体在哪儿吗?是执行复杂的 JavaScript,下载缓慢的 Web 字体,巨大的图片,还是卡顿的渲染?研究摇树(Tree Shaking),作用域提升(Scope Hoisting)
Js高性能总结:加载和运行、数据访问、DOM编程、算法和流程控制、响应接口、Ajax 异步JavaScript和XML、编程实践...
前端网站性能优化规则:网络加载类、页面渲染类。包括:减少 HTTP 资源请求次数、减小 HTTP 请求大小、避免页面中空的 href 和 src、合理设置 Etag 和 Last-Modified、使用可缓存的 AJAX、减少 DOM 元素数量和深度等
性能一直以来是前端开发中非常重要的话题。随着前端能做的事情越来越多,浏览器能力被无限放大和利用:从 web 游戏到复杂单页面应用,从 NodeJS 服务到 web VR/AR 和数据可视化,前端工程师总是在突破极限
BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。
你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗?现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅。
像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费。采用懒加载技术,即用户浏览到哪儿,就加载该处的图片。这样节省网络资源、提升用户体验、减少服务器压力。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!