前端性能优化与安全防护实战指南

更新日期: 2025-11-04 阅读: 34 标签: 性能

网站开发中,性能和安全同样重要。一个加载缓慢的网站会失去用户,一个存在安全漏洞的网站会带来更大风险。今天我们来探讨几个关键的前端优化技术


图片懒加载技术

什么是懒加载

懒加载也叫延迟加载,指的是在长页面中,只有当图片进入可视区域时才加载它们。这种做法能显著提升页面性能。

想象一个图片很多的页面,如果一次性加载所有图片,会消耗大量带宽和系统资源。但用户刚开始只能看到第一屏的内容,下面的图片暂时看不到。懒加载就是让这些暂时看不到的图片先不加载,等用户滚动到相应位置时再加载。

懒加载的优势

提升加载速度:只加载当前需要的图片,页面初次加载更快。

节省流量:用户可能不会滚动看完所有内容,未浏览的图片就不会加载。

减轻服务器压力:减少不必要的图片请求。

实现原理

懒加载的核心思路很简单:图片不直接设置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中。


webpack构建优化

提升打包速度

缓存配置

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()],
  },
};


安全防护措施

XSS防护

转义用户输入

function escapeHtml(unsafe) {
  return unsafe
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

// 使用示例
const userInput = '<script>alert("xss")</script>';
document.getElementById('content').innerHTML = escapeHtml(userInput);

CSRF防护

添加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);
});


总结

前端性能优化是一个持续的过程,需要根据实际项目情况选择合适的优化方案。记住这些要点:

  1. 图片懒加载能显著提升长页面性能

  2. 减少回流和重绘可以改善页面响应速度

  3. 防抖和节流能有效控制函数执行频率

  4. 选择合适的图片格式可以减小资源体积

  5. Webpack优化能提升开发体验和产品性能

  6. 安全防护是必不可少的一环

这些优化技术结合起来使用,能够让你的网站更快、更安全、用户体验更好。在实际项目中,建议先测量再优化,找到真正的性能瓶颈,有针对性地进行改进。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13129

提高js加载速度,实现js无阻塞加载方式,高性能的加载执行JavaScript

为解决JS加载速度慢,采用js的延时加载,和动态加载。由于js的堵塞特性,当浏览器在加载javascript代码时,不能同时做其他任何事情,如果javascript执行时间越久,浏览器等待响应的时间就越久。

如何提高CSS性能?CSS优化、提高性能提升总汇

如何提高CSS性能,根据页面的加载性能和CSS代码性能,主要表现为: 加载性能 (主要是从减少文件体积,减少阻塞加载,提高并发方面入手),选择器性能,渲染性能,可维护性。

前端性能优化_css加载会造成哪些阻塞现象?

css的加载是不会阻塞DOM的解析,但是会阻塞DOM的渲染,会阻塞link后面js语句的执行。这是由于浏览器为了防止html页面的重复渲染而降低性能,所以浏览器只会在加载的时候去解析dom树,然后等在css加载完成之后才进行dom的渲染以及执行后面的js语句。

2018 前端性能检查表

性能十分重要。然而,我们真的知道性能瓶颈具体在哪儿吗?是执行复杂的 JavaScript,下载缓慢的 Web 字体,巨大的图片,还是卡顿的渲染?研究摇树(Tree Shaking),作用域提升(Scope Hoisting)

高性能Javascript总结

Js高性能总结:加载和运行、数据访问、DOM编程、算法和流程控制、响应接口、Ajax 异步JavaScript和XML、编程实践...

优化网站性能规则_前端性能优化策略【网络加载、页面渲染】

前端网站性能优化规则:网络加载类、页面渲染类。包括:减少 HTTP 资源请求次数、减小 HTTP 请求大小、避免页面中空的 href 和 src、合理设置 Etag 和 Last-Modified、使用可缓存的 AJAX、减少 DOM 元素数量和深度等

前端性能的本质是什么?

性能一直以来是前端开发中非常重要的话题。随着前端能做的事情越来越多,浏览器能力被无限放大和利用:从 web 游戏到复杂单页面应用,从 NodeJS 服务到 web VR/AR 和数据可视化,前端工程师总是在突破极限

BigPipe_高性能流水线页面技术

BigPipe是一个重新设计的基础动态网页服务体系。大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行。这是类似于大多数现代微处理器的流水线执行过程:多重指令管线通过不同的处理器执行单元,以达到性能的最佳。

用CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗?现在大多数电脑的显卡都支持硬件加速。鉴于此,我们可以发挥GPU的力量,从而使我们的网站或应用表现的更为流畅。

原生js实现懒加载并节流

像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费。采用懒加载技术,即用户浏览到哪儿,就加载该处的图片。这样节省网络资源、提升用户体验、减少服务器压力。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!