第六篇 提升网页性能:深入解析HTTP请求优化策略(一)

深入浅出HTTP请求前后端交互系列专题
第一章 引言-HTTP协议基础概念和前后端分离架构请求交互概述
第二章 HTTP请求方法、状态码详解与缓存机制解析
第三章 前端发起HTTP请求
第四章 前后端数据交换格式详解
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
第六篇 提升网页性能:深入解析HTTP请求优化策略(一)
第七篇 提升网页性能:深入解析HTTP请求优化策略(二)
第八篇 提升网页性能:深入解析HTTP请求优化策略(三)
第九篇 API设计原则与最佳实践
第十篇 Axios最佳实战:前端HTTP通信的王者之选
第十一篇 前沿趋势与展望:深入探索GraphQL、RESTful API、WebSocket、SSE及QUIC与HTTP/3

文章目录

  • 资源合并与压缩技术
  • 1 资源合并(Concatenation)
  • 2 资源压缩(Minification)
    • 2.1 文本资源压缩
    • 2.2 媒体资源压缩
  • 3 实践方法
    • 3.1 CSS合并于压缩
    • 3.2 JavaScript合并与压缩
      • Gulp + gulp-concat 和 gulp-uglify
      • Webpack + webpack.optimize.concatenateModules(已弃用) 和 TerserWebpackPlugin
      • Rollup + rollup-plugin-terser
    • 3.3 雪碧图(CSS Sprite)
      • 步骤一:合并图片
      • 步骤二:编写CSS样式

资源合并与压缩技术

资源合并与压缩技术是前端性能优化中至关重要的手段,它们主要用于减少HTTP请求的数量以及减小每个请求的数据量,从而提升网页加载速度和用户体验。以下是对这两种技术的详细介绍:

1 资源合并(Concatenation)

资源合并主要是将多个小型静态资源(如JavaScript文件、CSS样式表、图片等)合并成一个或几个较大的文件。这样做的主要目的是减少浏览器对服务器发起HTTP请求的数量。因为在HTTP/1.x时代,浏览器对于同一域名下的并发请求数量有限制(通常为6个),过多的小文件会阻塞后续资源的加载。通过合并这些资源,可以显著减少因建立和关闭TCP连接产生的延迟开销。

2 资源压缩(Minification)

资源压缩则是通过对原始资源进行特定处理,去除不必要的字符、注释、空白符以及进行代码优化,使得文件大小变小,从而加快网络传输的速度。

2.1 文本资源压缩

  • JS压缩:使用工具如UglifyJS、Terser等删除注释、缩短变量名、简化表达式等,生成最小化的JavaScript代码。
  • CSS压缩:类似地,有CSSNano这样的工具可以压缩CSS代码,移除空格、换行和注释,并优化CSS选择器。
  • HTML压缩:移除HTML中的多余空白字符、换行及注释,但要注意保持HTML结构的有效性。

2.2 媒体资源压缩

  • 图片压缩:使用各种格式转换工具(如TinyPNG、imagemin等)进行无损或有损压缩,或将高分辨率图片适配不同的屏幕尺寸,采用响应式图片方案。
  • 视频压缩:通过编码工具(如FFmpeg)对视频进行转码,降低比特率和分辨率以减小文件大小。
// 使用Webpack配合UglifyJSPlugin实现代码压缩
const webpack = require('webpack');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');module.exports = {// 其他配置项...optimization: {minimizer: [new UglifyJSPlugin({test: /\.js(\?.*)?$/i,sourceMap: true,parallel: true,cache: true,}),],},
};

3 实践方法

3.1 CSS合并于压缩

将多个CSS文件合并为一个,以减少样式表加载数量。
CSS合并通常可以通过构建工具如Gulp、Grunt或Webpack配合相应的插件来实现。以下是一些常用的Node.js插件及其用法详解:

  1. 使用Gulp + gulp-concat

    // 安装gulp以及gulp-concat插件
    npm install --save-dev gulp gulp-concat// 在gulpfile.js中配置任务
    var gulp = require('gulp');
    var concat = require('gulp-concat');gulp.task('concat-css', function() {return gulp.src(['css/style1.css', 'css/style2.css']) // 指定要合并的CSS文件路径.pipe(concat('all.css')) // 合并后的文件名.pipe(gulp.dest('dist/css')); // 输出合并后CSS文件的目标路径
    });// 运行任务
    gulp.run('concat-css');
    
  2. 使用Gulp + gulp-clean-css

    除了合并,还可以在合并的同时进行压缩。安装gulp-clean-css插件以压缩CSS。

    npm install --save-dev gulp-clean-css// 修改上述任务为同时合并和压缩
    var cleanCSS = require('gulp-clean-css');gulp.task('concat-and-minify-css', function() {return gulp.src(['css/style1.css', 'css/style2.css']).pipe(concat('all.min.css')).pipe(cleanCSS()) // 压缩CSS.pipe(gulp.dest('dist/css'));
    });
    
  3. 使用Webpack + mini-css-extract-plugin

    Webpack也支持CSS资源的合并与优化。结合mini-css-extract-plugin可以将CSS从JS文件中提取出来,并且可以和其他优化插件(如optimize-css-assets-webpack-plugin)一起使用。

    // webpack.config.js
    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");module.exports = {// ...module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, // 提取CSS到单独文件"css-loader", // 解析CSS导入语句],},],},plugins: [new MiniCssExtractPlugin({filename: "[name].min.css", // 输出CSS文件名}),new OptimizeCSSAssetsPlugin({}), // CSS压缩插件],
    };
    

以上展示了如何通过不同的Node.js构建工具及其插件来实现CSS文件的合并和压缩操作。在实际项目中,可以根据具体需求选择合适的工具和流程。

3.2 JavaScript合并与压缩

将多个JS脚本合并为一个大脚本或者按需模块打包,避免多次加载脚本阻塞页面渲染。

在Node.js环境中,用于JavaScript合并和压缩的常见插件主要包括用于构建工具如Gulp、Grunt以及Webpack的插件。以下是一些常用的插件及其用法详解:

Gulp + gulp-concat 和 gulp-uglify

gulp-concat:用于合并JavaScript文件。

安装:

npm install --save-dev gulp gulp-concat

使用示例:

var gulp = require('gulp');
var concat = require('gulp-concat');gulp.task('concat-js', function() {return gulp.src(['src/js/*.js']) // 指定要合并的JS文件路径.pipe(concat('all.js')) // 合并后的文件名.pipe(gulp.dest('dist/js')); // 输出合并后JS文件的目标路径
});// 运行任务
gulp.run('concat-js');

gulp-uglify:用于压缩合并后的JavaScript代码。

安装:

npm install --save-dev gulp-uglify

添加到上述任务中进行合并与压缩:

var uglify = require('gulp-uglify');gulp.task('concat-and-minify-js', function() {return gulp.src(['src/js/*.js']).pipe(concat('all.min.js')).pipe(uglify()) // 压缩JS.pipe(gulp.dest('dist/js'));
});

Webpack + webpack.optimize.concatenateModules(已弃用) 和 TerserWebpackPlugin

注意: Webpack从v4开始不再直接提供webpack.optimize.concatenateModules插件,而是通过其内部优化算法自动实现模块的合并。

现代WebPack项目通常会通过配置mode: 'production'开启内置的压缩优化功能,或者显式地使用TerserWebpackPlugin

安装TerserWebpackPlugin:

npm install --save-dev terser-webpack-plugin

在Webpack配置中启用TerserWebpackPlugin:

const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');module.exports = {entry: './src/index.js',output: {filename: 'bundle.min.js',path: path.resolve(__dirname, 'dist'),},optimization: {minimize: true,minimizer: [new TerserPlugin()], // 使用TerserPlugin进行压缩},
};

对于合并,Webpack本身处理模块依赖时就已经实现了资源的合并,无需额外配置。当多个模块通过import或require关联时,最终生成的bundle会包含所有引用到的模块内容。如果需要对特定类型的文件进行手动合并,可以考虑使用entry点数组来指定多个入口文件,它们会被合并到一个bundle中。

Rollup + rollup-plugin-terser

Rollup也有相应的插件用来合并和压缩JavaScript代码,比如rollup-plugin-terser。

安装:

npm install --save-dev rollup-plugin-terser

在Rollup配置中启用rollup-plugin-terser:

import { terser } from 'rollup-plugin-terser';export default {input: 'src/main.js',output: {file: 'dist/bundle.min.js',format: 'iife',},plugins: [terser(), // 使用terser进行压缩],
};

在Rollup中,由于其模块打包机制,默认情况下已经将所有引入的模块进行了合并。所以,Rollup主要关注的是如何将多个输入文件整合为单个输出文件,并在此过程中进行代码压缩。

3.3 雪碧图(CSS Sprite)

构建CSS雪碧图(CSS Sprite)主要分为两个步骤:合并图片和编写对应的CSS样式。

步骤一:合并图片

  1. 手动合并

    • 使用图像处理软件,如Adobe Photoshop、GIMP等,将多个小图标或者背景元素拼接到一张大图上,确保各个部分之间有一定的间距,并且记录下每个元素在大图中的位置坐标。
  2. 自动工具合并

    • 使用自动化构建工具如gulp、grunt配合插件进行自动化合并。例如,使用gulp.spritesmithgrunt-spritesmith等插件可以自动生成雪碧图以及相应的CSS样式文件。

    以下是一个使用gulp.spritesmith生成雪碧图的示例配置:

    // 安装所需插件
    npm install --save-dev gulp.spritesmith// 在gulpfile.js中添加任务
    const gulp = require('gulp');
    const spritesmith = require('gulp.spritesmith');function generateSprites() {return gulp.src('src/images/icons/*.png') // 指定源文件目录下的所有PNG图标.pipe(spritesmith({imgName: 'spritesheet.png', // 输出雪碧图文件名cssName: '_sprites.scss' // 输出样式表文件名// 其他配置项,如cssTemplate, padding, algorithm等})).pipe(gulp.dest('dist/images')); // 输出雪碧图到目标目录
    }// 注册任务
    gulp.task('sprites', generateSprites);
    

步骤二:编写CSS样式

  • 对于已经合并好的雪碧图,需要编写CSS来引用并定位每个子图标的显示位置。
/* 假设雪碧图的类名为 .sprite */
.sprite {background-image: url('spritesheet.png'); /* 引用雪碧图 */
}.icon-home {width: 32px;height: 32px;background-position: 0 0; /* 根据实际计算得到的偏移量设置 */
}.icon-settings {width: 16px;height: 16px;background-position: -32px -32px; /* 根据实际计算得到的偏移量设置 */
}

在上述代码中,.icon-home.icon-settings 是你页面中需要用到不同图标的元素的类名,它们通过 background-position 属性来指定在雪碧图中的位置,从而显示出正确的图标。这些位置值应当根据实际雪碧图中各小图标的排列顺序和间距来进行精确计算。如果使用了像gulp.spritesmith这样的插件,则会自动生成包含正确位置信息的CSS样式文件,无需手动计算。

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

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

相关文章

水仙花数(Java解法)

什么是水仙花数? 水仙花数是指一个 3 位数,它每位上的数字的 3 次幂之和等于它本身(例如: 1 5 3 153 ),水仙花数的取值范围在 100~1000 之间。 解题思路: 这个题需要把所以的数字都拿到&…

Egg框架搭建后台服务【2】

前言 接上文 Egg框架搭建后台服务【1】,继续优化后台服务,之前直接用 SQL 语句调用的数据库数据,既不安全,也比较麻烦,当然最重要的是“显着不专业”。 所以本文仍然是增删改查,重点是将原本 SQL 语句操作…

【QT】QMessageBox 弹出消息框,对话确认框(确定/取消)

1.无互动 QMessageBox::information(nullptr,"信息","登陆成功");2.互动:确定、取消 QMessageBox::StandardButton box; box QMessageBox::question(this, "提示", "确定要添加吗?", QMessageBox::Yes|QMessageBox::…

8个Linux软件包管理命令

软件包管理器允许在 Linux 发行版上轻松安装、更新和删除软件。常用的软件包管理器包括 APT、YUM、DNF、Pacman 和 Zypper。 1. apt – Debian/Ubuntu 软件包管理器 apt 命令使用 APT 软件库管理 Debian/Ubuntu 系统上的软件包。它允许安装、更新和删除软件包。 例子&#x…

Linux 使用小记

安装IDEA mkdir -p /home/app/idea tar -zxvf ideaIU-2022.3.3.tar.gz -C /home/app/idea cd /usr/local/IDEA/idea-IU-223.8836.41/bin sh ./idea.sh 配置 IDEA 快捷方式 sudo gedit /usr/share/applications/idea.desktop 写入下面的内容 [Desktop Entry] NameIntelliJ …

大模型学习读书笔记01——大模型基础

大模型学习读书笔记01——大模型基础 1、什么是语言模型 语言模型 评判由一些单词排列组合而成的句子是否更像真正的、自然的句子。(通俗的说是否像人话) 语言模型的经典定义是一种对词符(token)序列的概率分布。每个token在真…

Docker 镜像的详解及创建(Dockerfile详解)

目录 镜像加载的原理 联合文件系统(UnionFS) 镜像结构的分层 Dockerfile Dockerfile结构 dockerfile常用命令 Dockerfile 编写规范 docker创建镜像的方法 基于现有镜像创建 示例: 基于本地模版创建 示例 基于Dockerfile 创建 示…

关于基于STM32使用外部中断控制按键

关于基于STM32使用外部中断控制按键的相关论文,虽然我不能直接提供具体的论文全文,但可以为您描述一下这类论文可能涉及的内容和框架: 标题:《基于STM32微控制器的外部中断系统在按键控制应用中的设计与实现》 摘要:…

AcWing 846. 树的重心(dfs)

这是一道我一开始没怎么看懂的题目,然后后面看了y神的讲解就豁然开朗了 不过我们首先要有先置知识来理解这道题目 先置知识 邻接表:是一种表示图的数据结构,它通过链表的方式记录每个顶点及其相邻的顶点。在这个具体的问题中,使…

RAG代码实操之斗气强者萧炎

📑前言 本文主要是【RAG】——RAG代码实操的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&#x…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可扩展的网络服务器和客户端。它是一个开源项目,最初由JBoss公司开发,现在由社区维护。Netty的…

企业网络出口部署案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

行分类问题

行分类问题可以应用于多个领域和问题,其中一些示例包括: 文本分类: 在自然语言处理中,可以将文本分为不同的类别,例如情感分析、主题分类等。每个文本可以被视为一个“行”,而分类任务就是对每个行进行分类…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下: select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接,此时就会执行到连接…

C++20结构化绑定应用实例(二百五十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Neonode触摸传感器模块之I2C鼠标和键盘

引言 触摸传感器模块可用于通过I2C向计算机发送键盘或鼠标输入。Arduino Library示例zForceKeyboardMouse中包含了如何实现这一点的示例。该示例使用官方的Arduino库<Mouse.h>和<Keyboard.h>与主机系统通信。 zForceKeyboardMous…

VR转接器:打破界限,畅享虚拟现实

你是否曾梦想过踏入另一个世界,体验那种仿佛置身其中的感觉?随着科技的飞速发展,虚拟现实(VR)已经成为了现实。而VR转接器,正是让你畅享虚拟现实的关键所在。 添加图片注释,不超过 140 字&…

猫头虎分享:探索TypeScript的世界 — TS基础入门 ‍

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

Web前端 ---- 【Vue3】vue3中的组件传值(props、自定义事件、全局事件总线)

目录 前言 props 自定义事件 全局事件总线 安装第三方库mitt 封装event-bus.js文件 使用全局事件总线 清除全局事件绑定 前言 本文介绍在vue3中的组件传值,props、自定义事件以及全局事件总线。相较于vue2中,略有变化。关于vue2中的组件传值看这篇…

vscode运行Python的两种方法,及无法运行的原因

vscode运行Python代码 下面介绍的vscode运行Python代码的方法基于的一个前提条件是:当前的计算机已经安装好了Python,且已经配置好了相关的环境变量。如果要查看是否已经都安装好了,可以打开Windows系统的命令行工具Windows PowerShell&…