前端性能优化——加载性能优化

目录

一、减少HTTP请求

[1. 合并 CSS 和 JavaScript 文件](#1. 合并 CSS 和 JavaScript 文件)

2.使用精灵图(雪碧图)

3.内联小图片

二、压缩文件

[1.压缩 CSS 和 JavaScript 文件](#1.压缩 CSS 和 JavaScript 文件)

2.压缩图片

三、延迟加载

1.图片懒加载

2.异步加载JavaScript文件

四、使用CDN


前端性能优化可以从多个方面下手,例如加载性能优化、渲染性能优化、代码优化、缓存优化、性能监测和优化等方面下手,下面针对加载性能优化分享一下优化思路。

一、减少HTTP请求

1. 合并 CSS 和 JavaScript 文件

在前端开发中,每一个 CSS 和 JavaScript 文件的加载都需要一个单独的 HTTP 请求。当项目规模较大时,过多的文件会导致加载时间变长。通过合并多个 CSS 和 JavaScript 文件,可以减少 HTTP 请求的数量,从而提高页面的加载速度。

使用工具如 Webpack,可以轻松地将多个文件合并为一个。在 Webpack 的配置文件中,可以设置入口文件和输出文件,Webpack 会自动将入口文件中引入的所有模块打包成一个或多个输出文件。

例如,以下是一个简单的 Webpack 配置文件示例,用于合并 CSS 和 JavaScript 文件:

javascript 复制代码
     const path = require('path');

     module.exports = {
       entry: {
         main: './src/index.js',
         styles: './src/styles.css',
       },
       output: {
         filename: '[name].bundle.js',
         path: path.resolve(__dirame, 'dist'),
       },
     };

在上述配置中,entry 字段指定了入口文件,这里有两个入口文件,一个是 JavaScript 文件 index.js,另一个是 CSS 文件 styles.cssoutput 字段指定了输出文件的名称和路径,这里将输出文件命名为 [name].bundle.js,其中 [name] 会被替换为入口文件的名称,即 main.bundle.jsstyles.bundle.js。这样,Webpack 会将 index.js 中引入的所有 JavaScript 模块打包成 main.bundle.js,将 styles.css 打包成 styles.bundle.js。如果需要将 CSS 和 JavaScript 文件合并到一个文件中,可以将 output 字段中的 filename 改为 bundle.js,这样 Webpack 会将所有的模块打包成一个文件。

2.使用精灵图(雪碧图)

精灵图(雪碧图)是一种将多个小图标合并成一个大的图片文件的技术。通过使用 CSS 的 background-position 属性,可以在页面上显示不同的图标,从而减少图片请求的数量。

例如,假设有三个小图标 icon1.pngicon2.pngicon3.png,可以使用工具如 Photoshop 或在线的 CSS Sprites 生成工具将它们合并成一个大的图片文件 sprites.png。然后,在 CSS 中,可以使用以下方式来显示不同的图标:

javascript 复制代码
    .icon1 {
       background-image: url('sprites.png');
       background-position: 0 0;
       width: 32px;
       height: 32px;
     }

    .icon2 {
       background-image: url('sprites.png');
       background-position: -32px 0;
       width: 32px;
       height: 32px;
     }

    .icon3 {
       background-image: url('sprites.png');
       background-position: -64px 0;
       width: 32px;
       height: 32px;
     }

在上述代码中,通过设置不同的 background-position 值,可以在页面上显示不同的图标。这样,只需要加载一个图片文件,就可以显示多个图标,减少了图片请求的数量。

3.内联小图片

对于一些小的图片,可以使用 Data URI 的方式将图片内联到 HTML 或 CSS 文件中,避免额外的图片请求。

Data URI 是一种将图片数据编码为字符串的方式,可以直接在 HTML 或 CSS 文件中使用。例如,以下是一个内联图片的 HTML 代码示例:

javascript 复制代码
     <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==" alt="Inline Image">

在上述代码中,src 属性的值是一个 Data URI,其中 data:image/png;base64 表示图片的类型是 PNG,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg== 是图片的编码数据。通过这种方式,可以将小图片直接内联到 HTML 文件中,避免了额外的图片请求。

二、压缩文件

1.压缩 CSS 和 JavaScript 文件

使用工具如 UglifyJS、Clean-CSS 等来压缩 CSS 和 JavaScript 文件,可以减小文件大小,加快加载速度。

UglifyJS 是一个 JavaScript 压缩工具,可以去除 JavaScript 代码中的注释、空格和换行符,缩短变量名等,从而减小文件大小。可以在命令行中使用 UglifyJS,也可以在构建工具如 Webpack 中配置 UglifyJS 插件来自动压缩 JavaScript 文件。

Clean-CSS 是一个 CSS 压缩工具,可以去除 CSS 代码中的注释、空格和换行符,合并相同的样式规则等,从而减小文件大小。可以在命令行中使用 Clean-CSS,也可以在构建工具如 Webpack 中配置 Clean-CSS 插件来自动压缩 CSS 文件。

例如,以下是在 Webpack 中配置 UglifyJS 和 Clean-CSS 插件的示例:

javascript 复制代码
     const path = require('path');
     const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
     const MiniCssExtractPlugin = require('mini-css-extract-plugin');
     const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

     module.exports = {
       entry: {
         main: './src/index.js',
         styles: './src/styles.css',
       },
       output: {
         filename: '[name].bundle.js',
         path: path.resolve(__dirname, 'dist'),
       },
       plugins: [
         new MiniCssExtractPlugin({
           filename: '[name].bundle.css',
         }),
       ],
       module: {
         rules: [
           {
             test: /\.css$/,
             use: [
               MiniCssExtractPlugin.loader,
               'css-loader',
             ],
           },
         ],
       },
       optimization: {
         minimizer: [
           new UglifyJsPlugin(),
           new OptimizeCSSAssetsPlugin(),
         ],
       },
     };

在上述配置中,使用了 UglifyJsPluginOptimizeCSSAssetsPlugin 两个插件来分别压缩 JavaScript 和 CSS 文件。同时,使用了 MiniCssExtractPlugin 插件来将 CSS 代码提取到单独的文件中,以便进行压缩。

2.压缩图片

使用图片压缩工具如 TinyPNG、ImageOptim 等来压缩图片,可以减小图片文件大小,同时不影响图片质量。

TinyPNG 是一个在线的图片压缩工具,可以将 PNG 和 JPEG 图片压缩到较小的文件大小,同时保持较好的图片质量。可以在网页上上传图片进行压缩,也可以使用其提供的 API 进行批量压缩。

ImageOptim 是一个 Mac 平台上的图片压缩工具,可以自动压缩图片文件,去除不必要的元数据等,从而减小文件大小。同时,ImageOptim 还可以与其他工具如 Sketch、Photoshop 等集成,方便在设计过程中进行图片压缩。

例如,使用 TinyPNG 进行图片压缩的步骤如下:

(1)打开 TinyPNG 的官网(TinyPNG -- Compress WebP, PNG and JPEG images intelligently)。

(2)点击页面上的 "上传图片" 按钮,选择要压缩的图片文件。

(3)TinyPNG 会自动对图片进行压缩,并显示压缩前后的文件大小和图片质量。

(4)点击 "下载" 按钮,下载压缩后的图片文件。

三、延迟加载

1.图片懒加载

当页面滚动到图片位置时再加载图片,可以减少页面初始加载时的请求数量。可以使用插件如 lazyload.js 来实现图片懒加载。

lazyload.js 是一个轻量级的 JavaScript 插件,可以实现图片懒加载功能。使用 lazyload.js 非常简单,只需要在页面中引入 lazyload.js 文件,然后在 HTML 中为需要懒加载的图片添加 data-src 属性,并将图片的真实地址赋值给 data-src 属性,同时将 src 属性设置为一个占位图片地址。当页面滚动到图片位置时,lazyload.js 会自动将 data-src 属性的值赋值给 src 属性,从而加载图片。

例如,以下是使用 lazyload.js 实现图片懒加载的 HTML 代码示例:

javascript 复制代码
     <img src="placeholder.jpg" data-src="image.jpg" alt="Lazy Load Image">

在上述代码中,src 属性的值是一个占位图片地址,data-src 属性的值是图片的真实地址。当页面滚动到图片位置时,lazyload.js 会自动将 data-src 属性的值赋值给 src 属性,从而加载图片。

2.异步加载JavaScript文件

将非关键的 JavaScript 文件延迟加载,等到页面加载完成后再加载,可以提高页面的初始加载速度。可以使用 deferasync 属性来实现异步加载。

defer 属性和 async 属性都是用于异步加载 JavaScript 文件的 HTML 属性。defer 属性表示脚本将在页面解析完成后执行,而 async 属性表示脚本将在下载完成后尽快执行,不保证执行顺序。

例如,以下是使用 defer 属性和 async 属性异步加载 JavaScript 文件的 HTML 代码示例:

javascript 复制代码
     <script src="script1.js" defer></script>
     <script src="script2.js" async></script>

在上述代码中,script1.js 文件将在页面解析完成后执行,script2.js 文件将在下载完成后尽快执行,不保证执行顺序。

四、使用CDN

内容分发网络(CDN)可以将静态资源分发到全球各地的服务器上,用户可以从离自己最近的服务器上获取资源,加快加载速度。可以使用如阿里云 CDN、腾讯云 CDN 等服务。

使用 CDN 非常简单,只需要将静态资源的 URL 替换为 CDN 的 URL 即可。例如,如果你的网站使用了 jQuery 库,可以将 jQuery 的 URL 从 https://code.jquery.com/jquery-3.6.0.min.js 替换为 https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js,这样用户就可以从 jsDelivr 的 CDN 上获取 jQuery 库,加快加载速度。

在使用 CDN 时,需要注意以下几点:

选择可靠的 CDN 服务提供商,确保 CDN 的稳定性和安全性。

对于一些关键的静态资源,可以同时从多个 CDN 上获取,以提高可用性。

定期检查 CDN 的性能和可用性,及时调整 CDN 的配置。

相关推荐
每天都要喝奶茶20 分钟前
vue3uniapp实现自定义拱形底部导航栏,解决首次闪烁问题
前端·vue.js·uni-app
May_Xu_21 分钟前
vue3+less使用主题定制(多主题定制)可切换主题
前端·javascript·vue.js·vue·less·css3
qq_4275060822 分钟前
less解决function中return写法在浏览器被识别成Object导致样式失败的问题
前端·css·less
Elastic 中国社区官方博客28 分钟前
将你的 Kibana Dev Console 请求导出到 Python 和 JavaScript 代码
大数据·开发语言·前端·javascript·python·elasticsearch·ecmascript
北京_宏哥1 小时前
《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频
前端·python·测试
小霖家的混江龙1 小时前
Vite 打包 H5 如何注入版本号
前端·vite
concisedistinct1 小时前
Python的协程与传统的线程相比,是否能更有效地利用计算资源?在多大程度上,这种效率是可测量的?如何量化Python协程的优势|协程|线程|性能优化
python·性能优化·多线程
夏河始溢1 小时前
一七一、React性能优化方式
javascript·react.js·性能优化
白-胖-子1 小时前
【原创分享】生产环境JAVA中间件性能优化调优要点和案例分析
java·中间件·性能优化
夏河始溢1 小时前
一七二、Vue3性能优化方式
性能优化·vue·vue3