专栏名称: 奇舞精选
《奇舞精选》是由奇舞团维护的前端技术公众号。除周五外,每天向大家推荐一篇前端相关技术文章,每周五向大家推送汇总周刊内容。
目录
相关文章推荐
南方能源观察  ·  《抽水蓄能电站开发建设管理暂行办法》印发 ·  21 小时前  
南方能源观察  ·  eo封面 | 争鸣“十五五”能源规划(上) ·  21 小时前  
航空工业  ·  蓄力奋战“开门红” 跑出新年“加速度” ·  昨天  
航空工业  ·  他们,在“战位”迎新春 ·  2 天前  
能源电力说  ·  全国各地2月峰谷电价 ·  3 天前  
能源电力说  ·  全国各地2月峰谷电价 ·  3 天前  
51好读  ›  专栏  ›  奇舞精选

前端性能优化

奇舞精选  · 公众号  ·  · 2024-10-23 18:30

主要观点总结

本文介绍了前端开发者在提高性能和用户体验方面可以采取的措施,包括压缩和最小化资源、使用内容分发网络(CDN)、使用浏览器缓存,以及异步和延迟加载等技术。同时,文章还涉及了图像压缩、监控和分析性能等方面的内容。

关键观点总结

关键观点1: 压缩和最小化资源

介绍了使用UglifyJS、Terser、CSSNano等工具压缩JavaScript和CSS资源的方法,以及如何使用Imagemin压缩图像。

关键观点2: 使用内容分发网络(CDN)

解释了CDN的原理,以及如何通过CDN减少页面加载时间,包括减少传输延迟、负载均衡、缓存内容等方面的优势。

关键观点3: 使用浏览器缓存

阐述了浏览器缓存的工作原理,以及长期缓存和短期缓存的缓存策略。

关键观点4: 异步和延迟加载

介绍了异步和延迟加载的概念,以及在Vue中的应用,包括异步组件加载、路由的懒加载等。

关键观点5: 性能监控和分析

建议使用Chrome DevTools、Vue Devtools等性能分析工具监控和分析应用性能。


正文

本文作者系360奇舞团前端开发工程师

前端开发者终其一生都在讨论一个问题,那就是提高性能并提高用户体验。那么想要提高性能可以从哪些地方入手呢?请看我细细道来。

压缩和最小化资源

1.JavaScript
  • UglifyJS:UglifyJS是一个流行的JavaScript压缩工具,可以删除空格、注释,重命名变量等

// 安装
npm install uglify-js -g

// 使用UglifyJS压缩文件
uglifyjs input.js -o output.min.js
  • Terser:Terser是另一个现代的JavaScript压缩工具,支持ES6+特性。

// 安装
npm install terser -g
// 使用Terser压缩文件
terser input.js -o output.min.js
2. CSS文件
  • CSSNano:CSSNano是一个基于PostCSS的CSS压缩工具,能够移除不必要的空格、注释等。

// 安装
npm install cssnano -g
// 使用CSSNano压缩文件
cssnano input.css output.min.css
  • CleanCSS:CleanCSS是一个免费的CSS精简压缩工具,通过这个在线工具,可以将你的CSS文件压缩、优化成更精简

// 安装
npm install clean-css-cli -g
// 使用CleanCSS压缩文件
cleancss -o output.min.css input.css
  • 在webpack中使用插件TerserPlugin

// 安装webpack和TerserPlugin
npm install webpack webpack-cli terser-webpack-plugin --save-dev

webpack.config.js 文件中配置插件

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
filename: 'bundle.min.js',
path: __dirname + '/dist'
},
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
};
3. 图像压缩
  • Imagemin Imagemin 是一个强大的图像压缩工具,可以通过插件扩展支持多种格式。

// 安装
npm install imagemin imagemin-pngquant imagemin-mozjpeg imagemin-svgo --save-dev

使用Imagemin压缩图像

const imagemin = require('imagemin');
const imageminPngquant = require('imagemin-pngquant');
const imageminMozjpeg = require('imagemin-mozjpeg');
const imageminSvgo = require('imagemin-svgo');

(async () => {
await imagemin(['images/*.{jpg,png,svg}'], {
destination: 'dist/images',
plugins: [
imageminPngquant({
quality: [0.6, 0.8]
}),
imageminMozjpeg({
quality: 75
}),
imageminSvgo({
plugins: [
{removeViewBox: false}
]
})
]
});

console.log('Images optimized');
})();
  • 可以使用线上工具:https://tinypng.com/

使用内容分发网络(CDN)

CDN的原理
  1. 用户请求网站内容:当用户访问网站时,浏览器会发出请求来获取网页上的各种资源(如HTML、CSS、JavaScript、图片等)。

  2. DNS解析:通过DNS解析,用户的请求会被重定向到最近的CDN节点,而不是直接访问原始服务器。

  3. CDN节点响应请求:

  • 缓存命中:如果请求的资源在CDN节点的缓存中,节点会直接返回资源给用户。

  • 缓存未命中:如果请求的资源不在缓存中,节点会向原始服务器请求资源,获取后缓存下来并返回给用户。

  1. 用户获取资源:用户从最近的CDN节点获取资源,减少了传输时间和延迟。

CDN可以通过什么方式减少页面加载时间
  1. 减少物理距离:CDN在全球多个地点(称为节点)分布服务器,当用户请求资源时,CDN会从离用户最近的节点提供资源,从而减少传输延迟和加载时间。

  2. 负载均衡:CDN可以在多个服务器之间分配流量,避免单个服务器过载,确保所有用户都能快速访问资源。

  3. 缓存内容:CDN会将静态内容(如图片、CSS、JavaScript文件等)缓存到各个节点。当用户请求这些内容时,可以直接从缓存中获取,而不需要每次都从原始服务器获取,从而减少服务器压力和加载时间。

  4. 提高可用性和可靠性:由于CDN节点分布在多个地理位置,即使某些节点出现故障,其他节点仍然可以提供服务,确保高可用性和可靠性。

  5. 优化传输:CDN通常使用优化的传输协议和技术(如HTTP/2、TCP优化等)来提高传输效率,减少延迟。

  6. 减少带宽消耗:通过缓存和分发内容,CDN可以减少原始服务器的带宽消耗,使服务器能够更高效地处理动态内容和其他请求。

使用浏览器缓存

浏览器缓存通过存储本地副本的静态资源(如HTML、CSS、JavaScript、图像等),可以减少页面加载时间。当用户再次访问同一网站时,浏览器可以直接从本地缓存中加载这些资源,而不需要重新从服务器获取,从而减少网络请求、带宽消耗和延迟。

浏览器缓存的工作原理
  1. 首次请求:

  • 用户首次访问网站时,浏览器会向服务器请求所有需要的资源。

  • 服务器返回资源并设置缓存头,指示浏览器如何缓存这些资源。

  1. 缓存存储:

  • 浏览器根据缓存头信息将资源存储在本地缓存中。

  1. 后续请求:

  • 当用户再次访问同一网站时,浏览器会首先检查本地缓存是否有有效的副本。

  • 如果缓存资源有效,浏览器会直接从本地缓存中加载资源。

  • 如果缓存资源已过期或无效,浏览器会向服务器发送请求,获取最新的资源。

缓存策略
  1. 长期缓存:适用不频繁改变的资源

  2. 短期缓存:适用于频繁更新的资源

异步和延迟加载

异步和延迟加载是优化网页加载性能的关键技术,尤其适用于JavaScript文件。这些技术可以加快页面的初始加载速度,提升用户体验。

异步加载

异步加载(Asynchronous Loading)允许浏览器在下载JavaScript文件时继续解析HTML文档,而不会阻塞页面的渲染。可以通过在 标签中使用async属性来实现。

  • 脚本会在下载完成后立即执行,但不会阻塞HTML解析。

  • 脚本执行顺序不保证。






异步加载示例


异步加载示例





延迟加载

延迟加载(Deferred Loading)允许浏览器在下载JavaScript文件时继续解析HTML文档,并且等到HTML文档完全解析完毕后再执行脚本。可以通过在 标签中使用defer属性来实现。

  • 脚本会在HTML文档完全解析完毕后执行。

  • 脚本会按顺序执行(如果有多个defer脚本)。






延迟加载示例


延迟加载示例





vue中异步和延迟

异步组件加载
const AsyncComponent = () => import('./components/MyComponent.vue');

new Vue({
components: {
AsyncComponent
}
});
路由的懒加载
// 安装
npm install vue-router

// 路由配置中使用懒加载
import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routes = [
{
path: '/home',
name: 'Home',
component: () => import('./views/Home.vue') // 懒加载Home组件
},
{
path: '/about',
name: 'About',
component: () => import('./views/About.vue') // 懒加载About组件
}
];

const router = new Router({
routes
});

export default router;

监控和分析性能

  • 使用性能分析工具如Chrome DevTools、Vue Devtools监控和分析应用性能。

Vue.config.performance = true;

还有其他点可以优化性能

  • 图像懒加载

  • 按需引入

  • 减少DOM操作

  • 减少HTTP请求数

  • 使用服务器渲染

-







请到「今天看啥」查看全文