1.externals 提取公共依赖包,可以使用 externals 来提取这些依赖包,打包时可以忽略它 然后在 index.html 中使用 CDN 引入依赖
<body> <script src="http://lib.baomitu.com/vue/2.6.14/vue.min.js"></script> <script src="http://lib.baomitu.com/vue-router/3.5.1/vue-router.min.js"></script> <script src="http://lib.baomitu.com/axios/1.2.1/axios.min.js"></script> <script src="http://lib.baomitu.com/echarts/5.3.2/echarts.min.js"></script> </body>复制代码
2、组件库的按需引入
为什么没有使用 externals 的方式处理组件库呢?
externals缺点:直接在html内引入的,失去了按需引入的功能,只能引入组件库完整的js和css
组件库按需引入的原理:最终只引入指定组件和对应的样式
elementUI 需要借助 babel-plugin-component[1] 插件实现,插件的作用如下:
通过该插件,最终只引入指定组件和样式,来实现减少组件库体积大小
减小三方依赖的体积【很多没有用到的语言包】
使用 moment-locales-webpack-plugin 插件,剔除掉无用的语言包
HappyPack 多线程打包
HappyPack 就能实现多线程打包,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程,来提升打包速度
Gzip压缩
html、js、css资源,使用 gzip 后通常可以将体积压缩70%以上
这里介绍下使用 webpack 进行 gzip 压缩的方式,使用 compression-webpack-plugin 插件
- 如何提高构建速度
功能和业务代码也会随着越多,相应的 webpack 的构建时间也会越来越久,构建时间与我们日常开发效率密切相关,当我们本地开发启动 devServer 或者 build 的时候,如果时间过长,会大大降低我们的工作效率,
常见的提升构建速度的手段有如下:
- 优化 loader 配置
- 合理使用 resolve.extensions
- 优化 resolve.modules
- 优化 resolve.alias
- 使用 DLLPlugin 插件
- 使用 cache-loader
- terser 启动多线程
- 合理使用 sourceMap
优化loader配置
在使用loader时,可以通过配置include、exclude、test属性来匹配部分文件,
module.exports = {
module: {
rules: [
{
// 如果项目源码中只有 js 文件就不要写成 /\.jsx?$/,提升正则表达式性能
test: /\.js$/,
// babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启
use: ['babel-loader?cacheDirectory'],
// 只对项目根目录下的 src 目录中的文件采用 babel-loader
include: path.resolve(__dirname, 'src'),
},
]
},
};
合理使用 resolve.extensions
通过resolve.extensions是解析到文件时自动添加拓展名
module.exports = {
...
extensions:[".warm",".mjs",".js",".json"]
}
当我们配置的时候,则不要随便把所有后缀都写在里面,这会调用多次文件的查找,这样就会减慢打包速度
优化 resolve.alias
alias给一些常用的路径起一个别名,特别当我们的项目目录结构比较深的时候,一个文件的路径可能是./../../的形式
通过配置alias以减少查找过程
module.exports = {
...
resolve:{
alias:{
"@":path.resolve(__dirname,'./src')
}
}
}
使用 cache-loader
在一些性能开销较大的 loader 之前添加 cache-loader,以将结果缓存到磁盘里,显著提升二次构建速度
保存和读取这些缓存文件会有一些时间开销,所以请只对性能开销较大的 loader 使用此 loader
module.exports = {
module: {
rules: [
{
test: /\.ext$/,
use: ['cache-loader', ...loaders],
include: path.resolve('src'),
},
],
},
};
terser 启动多线程
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
parallel: true,
}),
],
},
};
合理使用 sourceMap
打包生成 sourceMap 的时候,如果信息越详细,打包速度就会越慢。对应属性取值如下所示:
总结
可以看到,优化webpack构建的方式有很多,主要可以从优化搜索时间、缩小文件搜索范围、减少不必要的编译等方面入手
3.webpack的热更新
HMR 全称 Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用
例如,我们在应用运行过程中修改了某个模块,通过自动刷新会导致整个应用的整体刷新,那页面中的状态信息都会丢失
如果使用的是 HMR,就可以实现只将修改的模块实时替换至应用中,不必完全刷新整个应用
在webpack中配置开启热模块也非常的简单,如下代码:
const webpack = require('webpack')
module.exports = {
// ...
devServer: {
// 开启 HMR 特性
hot: true
// hotOnly: true
}
}
通过上述这种配置,如果我们修改并保存css文件,确实能够以不刷新的形式更新到页面中
但是,当我们修改并保存js文件之后,页面依旧自动刷新了,这里并没有触发热模块
所以,HMR 并不像 Webpack 的其他特性一样可以开箱即用,需要有一些额外的操作
我们需要去指定哪些模块发生更新时进行HRM,如下代码:
if(module.hot){
module.hot.accept('./util.js',()=>{
console.log("util.js更新了")
})
}
Loader与Plugin对应的概
- loader 是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中
- plugin 赋予了 webpack 各种灵活的功能,例如打包优化、资源管理、环境变量注入等,目的是解决 loader 无法实现的其他事
常见的babel和plugin
下面介绍几个常用的插件用法:
HtmlWebpackPlugin
在打包结束后,⾃动生成⼀个 html ⽂文件,并把打包生成的js 模块引⼊到该 html 中
clean-webpack-plugin
删除(清理)构建目录
mini-css-extract-plugin
提取 CSS 到一个单独的文件中
前端安全
token是什么
token一般存放在localstorage中,每次请求接口都会带上
封装一个ajax接口都要配置什么
timeout: 8000,
url: '/api/pay/v1/queryByOrderNo',
method: 'POST',
data: data
headers: {'Content-Type': 'application/x-www-form-urlencoded', token: token,}
Content-Type:来告诉服务端如何处理请求的数据
说说 JavaScript 数字精度丢失的问题,解决方案?
解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)
// 0.1 + 0.2
(0.1*10 + 0.2*10) / 10 == 0.3 // true
如何给localStorage设置一个过期时间?
,localstorage原生是不支持设置过期时间的,想要设置的话,就只能自己来封装一层逻辑来实现:
function set(key,value){
var curtime = new Date().getTime();//获取当前时间
localStorage.setItem(key,JSON.stringify({val:value,time:curtime}));//转换成json字符串序列
}
function get(key,exp)//exp是设置的过期时间
{
var val = localStorage.getItem(key);//获取存储的元素
var dataobj = JSON.parse(val);//解析出json对象
if(new Date().getTime() - dataobj.time > exp)//如果当前时间-减去存储的元素在创建时候设置的时间 > 过期时间
{
console.log("expires");//提示过期
}
else{
console.log("val="+dataobj.val);
}
}
———————————————————————————————————————————
大文件上传-分片
如果上传文件过大,比如500M 1G 2G 那么大,可能上传超时和服务器的限制。
解决上面的问题可以用到分片上传:,每次只上传很小的一部分 比如2M,多上传几次就可以啦。
File
继承了Blob
的功能,Blob
对象表示原始数据,也就是二进制数据,它提供了对数据截取的方法slice
思路如下;
-
把大文件进行使用
slice
分段,比如分段成每个2M,发送到服务器携带一个标志,这里暂时用当前的时间戳,用于标识一个完整的文件 -
服务端保存各段文件
-
浏览器端所有分片上传完成,发送给服务端一个合并文件的请求
-
服务端根据文件标识、类型、各分片顺序进行文件合并
-
删除分片文件
---------------------------------------------------------------------------------------------------------------------------------
大文件上传-断点续传
分片上传的方式并不完美,因为大文件上传并不是短时间内就上传完成,如果期间断网,页面刷新了仍然需要重头上传
所以现在要解决的问题是:如何检测这些分片,不再重新上传即可。
方案;【上传的时候和本地保存的已经上传的分片的hash值做比对,来解决重复上传的问题】
-
为每个分段生成 hash 值,使用
spark-md5
三方模块 -
将上传成功的分段信息保存到
localStorage【
保存在客户端是最不保险的,最好让服务端增加一个接口。】
-
重新上传时,进行和本地分段 hash 值的对比,如果相同的话则跳过,继续下一个分段的上传
PS: 生成 hash 过程肯定也会耗费资源,但是和重新上传相比可以忽略不计了。
---------------------------------------------------------------------------------------------------------------------------------
JavaScript 中如何实现并发控制?【未完】
async function asyncPool(poolLimit, array, iteratorFn) {
const ret = []; // 存储所有的异步任务
const executing = []; // 存储正在执行的异步任务
for (const item of array) {
// 调用iteratorFn函数创建异步任务
const p = Promise.resolve().then(() => iteratorFn(item, array));
ret.push(p); // 保存新的异步任务
// 当poolLimit值小于或等于总任务个数时,进行并发控制
if (poolLimit <= array.length) {
// 当任务完成后,从正在执行的任务数组中移除已完成的任务
const e = p.then(() => executing.splice(executing.indexOf(e), 1));
executing.push(e); // 保存正在执行的异步任务
if (executing.length >= poolLimit) {
await Promise.race(executing); // 等待较快的任务执行完成
}
}
}
return Promise.all(ret);
}
1.使用promise.race(),等待较快的任务执行完成
2.当每完成一个进行中的任务时,就移除已完成的任务
3.最后return Promise.all
---------------------------------------------------------------------------------------------------------------------------------
并发
并发:代表计算机能够同时执行多项任务
并行:对于多核处理器,可以在不同的核心上真正并行的执行任务
---------------------------------------------------------------------------------------------------------------------------------
JS while 循环的语法格式如下:
while (条件表达式) {
// 要执行的代码
}
---------------------------------------------------------------------------------------------------------------------------------
JavaScript 中如何实现异步串行?
async/await
!号称JS异步的终极解决方案,真不是盖的,下面就来看看async/await
的方案,
一个for循环解决串行异步问题,没有回调没有嵌套看起来瞬间舒服多了~
var urlArr = ['http://www.qq.com','http://www.qq.com','http://www.qq.com'];
function makeRequest(url){
return new Promise((resolve,reject)=>{
$.get(url).success((ret)=>{
resolve(ret)
}).fail(()=>{
reject()
})
})
}
async function makaPromiseList(dataArr,handler){
var result = [];
for(let item of dataArr){
var ret = await handler(item);
result.push(ret);
}
return result;
}
makaPromiseList(urlArr,makeRequest).then((ret)=>{
console.log(ret)
});
---------------------------------------------------------------------------------------------------------------------------------
跨域,以及同源策略
-------------------------------------------------------------------------------------跨域之JSONP
---------------------------------------------------------------------------------------------------------------------------------
跨域之CORS
---------------------------------------------------------------------------------------------------------------------------------
给图片加白名单是什么意思
在计算机安全领域,给图片加白名单是指在网站或应用程序中配置一组被允许加载的图片地址列表。这个列表可以包括一些信任的、安全的图片来源,例如自己的网站或第三方图片服务商,而禁止从其他来源加载图片。这种做法可以防止恶意攻击者使用恶意图片来窃取用户的信息、执行跨站脚本(XSS)攻击等。
具体来说,在 Web 应用程序中,图片通常是通过 img
元素的 src
属性加载的。如果没有任何限制,攻击者可以通过在恶意网站中插入一个指向他们的服务器上的图片的链接来窃取用户的个人信息或执行其他恶意行为。通过给图片加白名单,我们可以防止这种情况的发生,只允许从信任的来源加载图片。
在实践中,通常会使用某些安全性能更好的图片服务来加载和分发图片,例如 AWS S3、Cloudinary 或 Imgix。这些服务通常提供了一些安全特性,如自动剪裁、缩放和优化图片、防盗链等,从而帮助保护用户数据安全。在使用这些服务时,也可以将它们的 URL 加入白名单中,以确保只从这些服务加载图片。
---------------------------------------------------------------------------------------------------------------------------------
阿里云OSS裁切图片是什么
阿里云OSS是阿里云推出的对象存储服务,提供了一种高效、安全、低成本的云存储解决方案。其中,OSS裁切图片是指对OSS存储的图片进行裁剪操作,以适应不同的展示场景。
具体来说,阿里云OSS提供了一系列图片处理接口,包括缩放、裁剪、旋转、加水印等功能,这些接口都支持通过指定参数来实现图片的处理。其中,OSS裁切图片的接口参数包括:
x
:裁剪起点横坐标。y
:裁剪起点纵坐标。w
:裁剪宽度。h
:裁剪高度。
通过指定这些参数,可以在保持图片原始比例的情况下,将图片裁剪成指定大小的图像,以适应不同的展示需求。例如,可以使用OSS裁切图片功能将一张大图裁剪成多个不同大小的缩略图,以在不同的设备上展示,提升用户体验。同时,OSS还提供了图片自适应功能,可以根据设备的屏幕大小和分辨率,自动适应裁剪大小,从而在不同的设备上展示清晰、美观的图片。
---------------------------------------------------------------------------------------------------------------------------------
网页是如何加载并渲染出来的
网页的加载和渲染过程可以大致分为以下几个步骤:
-
DNS 解析:浏览器首先会根据网址中的域名进行 DNS 解析,找到对应的 IP 地址。
-
建立连接:浏览器向服务器发起 TCP 连接,建立起网络连接。
-
发送请求:浏览器向服务器发送 HTTP 请求,请求网页的内容。
-
接收响应:服务器收到请求后,返回 HTTP 响应,其中包含网页的 HTML、CSS、JavaScript 等内容。
-
解析 HTML:浏览器开始解析 HTML 文件,并构建 DOM 树(文档对象模型)。DOM 树表示了网页的结构和内容。
-
加载 CSS 和 JavaScript:浏览器会同时加载 CSS 文件和 JavaScript 文件,这些文件可以通过标签的方式嵌入到 HTML 文件中,也可以作为独立的文件引用。
-
渲染页面:浏览器根据 DOM 树和 CSS 样式表计算出每个元素在页面中的位置和样式,并绘制出页面。JavaScript 代码会被执行,可以对页面进行动态操作。
-
关闭连接:浏览器完成页面渲染后,关闭 TCP 连接。
整个过程中,浏览器会对每个请求进行并行处理,以提高网页加载速度。此外,浏览器还会使用缓存机制,缓存已经加载过的文件,避免重复加载,提高页面加载速度。
---------------------------------------------------------------------------------------------------------------------------------
请详细的讲一下渲染页面的过程,举例说明
页面渲染是浏览器处理网页的最后一步,它的主要任务是将网页内容转化为可见的图像,并展示给用户。页面渲染过程主要包括以下几个步骤:
- 构建文档树
浏览器首先需要将 HTML 文件解析成文档对象模型(DOM)树。DOM 树表示了网页的结构和内容,是网页渲染的基础。在解析 HTML 文件时,浏览器会按照标记的层次结构,逐行解析 HTML 文件,并生成对应的 DOM 节点。例如,在以下 HTML 代码中
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is an example page.</p>
</body>
</html>
- 构建样式规则树
样式规则树(CSS Rule Tree)表示了网页的样式信息。
- 计算布局
布局(Layout)指的是浏览器根据文档树和样式规则树,计算每个元素在页面中的位置和大小。布局是渲染过程中的一个重要环节,因为它会影响到网页的性能和用户体验。
- 绘制页面
绘制(Painting)指的是将每个元素在页面中的内容绘制出来,并按照布局计算出的位置和大小,排列在页面中。绘制过程包括了文字、图像、颜色、边框等多个方面。
---------------------------------------------------------------------------------------------------------------------------------
常见的回流和重绘有哪些?以及如何去解决
回流(reflow)和重绘(repaint)是浏览器在页面渲染时经常遇到的两个问题。它们会影响页面的性能和用户体验,因此需要我们尽可能地减少回流和重绘的次数。
回流指的是在页面渲染时,浏览器需要重新计算元素的位置和大小,从而重新布局页面。常见的引起回流的操作包括:
- 修改元素的位置、大小或内容
- 修改元素的样式
- 修改文档结构
重绘指的是在页面渲染时,浏览器需要重新绘制元素的外观,但不需要重新计算元素的位置和大小。常见的引起重绘的操作包括:
- 修改元素的样式(但不改变布局)
- 滚动页面
- 改变窗口大小
为了减少回流和重绘,可以采取以下措施:
- 使用 CSS3 动画代替 JavaScript 动画,因为 CSS3 动画不会引起回流和重绘
- 避免频繁修改元素的样式,可以将多次修改合并成一次,或者通过修改类名一次性修改样式
- 使用 CSS3 transform 替代 position、top、left 等属性进行位置调整,因为 transform 不会引起回流
- 使用 requestAnimationFrame 来优化 JavaScript 动画,它能够将多个动画帧合并成一帧,从而减少重绘次数
- 避免在 DOM 树中插入大量节点,可以先将这些节点拼接成一个字符串,然后通过 innerHTML 插入 DOM 树中
- 使用虚拟列表等技术来优化大量列表数据的渲染,避免频繁回流和重绘
总之,要减少回流和重绘,需要尽可能地减少对页面布局和样式的修改,并优化 JavaScript 动画和 DOM 操作的执行方式。
---------------------------------------------------------------------------------------------------------------------------------
前端的性能优化有哪些,请详细并举例说明?
前端性能优化可以分为多个方面,包括减少页面加载时间、提升页面渲染速度、减小页面体积等等。下面我将分别详细介绍这些方面的优化策略,并给出相应的例子。
减少页面加载时间
-
使用CDN:将静态资源(如样式表、脚本等)存储在CDN上,可以让用户从离用户更近的服务器上下载资源,加快加载速度。
-
压缩资源:压缩JavaScript、CSS和HTML等文件,减小文件大小,加快下载速度。可以使用一些工具,如Webpack、Gulp等自动化构建工具。
-
延迟加载:对于某些不必要立即加载的资源,可以采用延迟加载的方式,如图片懒加载等。
-
避免重定向:当用户访问某个网页时,如果需要重定向到另一个网页,会浪费用户的时间。可以通过检查网页是否有重定向,减少不必要的重定向。
提升页面渲染速度
-
减少DOM操作:DOM操作是比较耗时的,因此减少DOM操作可以提高页面渲染速度。可以使用缓存DOM节点、合并操作等方式减少DOM操作。
-
优化CSS选择器:CSS选择器的复杂度会影响渲染速度。可以优化CSS选择器,减少渲染时间。
-
使用缓存:对于一些常用的数据,可以使用缓存,减少服务器的请求次数,提高页面渲染速度。
减小页面体积
-
压缩图片:对于图片等大的资源,可以使用压缩算法减小文件大小。
-
使用字体图标:使用字体图标可以减少网络请求次数,提高页面加载速度。
-
减少HTTP请求:减少HTTP请求可以减少资源下载次数,提高页面加载速度。可以将多个CSS或JavaScript文件合并为一个文件,减少HTTP请求。
总的来说,前端性能优化需要综合考虑多个方面。只有在减少页面加载时间、提升页面渲染速度、减小页面体积等多个方面都做到了优化,才能真正提高前端性能。
---------------------------------------------------------------------------------------------------------------------------------
为什么使用CDN可以加快页面加载速度?
使用 CDN(Content Delivery Network)可以加快页面加载速度的原因有以下几个:
-
减少距离:CDN 会将网站的静态资源(如图片、视频、脚本、样式等)存储在多个地理位置分散的服务器上,使得用户可以从离自己最近的服务器获取这些资源,从而减少了数据传输的距离,提高了访问速度。
-
分摊负载:CDN 通过将网站的访问流量分散到多个服务器上,有效地分摊了服务器的负载,减少了单个服务器的压力,提高了整体的响应速度。
-
缓存优化:CDN 可以根据用户的访问情况,在服务器上缓存静态资源,并使用各种技术手段(如缓存控制、压缩、图片优化等)来优化这些资源的传输,从而提高访问速度。
总之,使用 CDN 可以让用户更快地获取网站的静态资源,减少了数据传输的距离和负载,提高了访问速度,给用户带来更好的体验
---------------------------------------------------------------------------------------------------------------------------------
如何实现图片的懒加载?
图片懒加载可以提高页面的加载速度,使得用户可以更快地浏览页面,同时也能减轻服务器的负担。以下是一些实现图片懒加载的方法:
-
使用Intersection Observer API:Intersection Observer API 可以监听元素是否进入视窗,可以将图片的src属性设置为一个占位符,当图片进入视窗时再将src属性替换为真实的图片链接。
-
使用自定义的 JavaScript:通过监听页面滚动事件和计算元素相对于视窗的位置,可以判断元素是否进入视窗。同样也可以将图片的src属性设置为占位符,当图片进入视窗时再将src属性替换为真实的图片链接。
-
使用第三方库:如Lazyload、Lozad.js等,这些库提供了易于使用的API,可以快速地实现图片懒加载功能。
需要注意的是,在实现图片懒加载时,应该将图片的真实地址保存在data-属性中,避免搜索引擎爬虫无法获取图片的信息。同时,在网络环境比较好的情况下,可能会出现图片加载太快,导致懒加载效果不明显的情况,因此应该根据实际情况来决定是否使用图片懒加载。
---------------------------------------------------------------------------------------------------------------------------------
如何实现图片的预加载?
图片预加载是指在页面正式加载之前,预先加载需要显示的图片资源,以提高用户体验,避免用户等待过程中看到空白的页面或者加载不完整的图片的情况。下面是一个基本的图片预加载实现步骤:
- 创建一个存放图片对象的数组
在 JavaScript 中创建一个空数组,用于存储预加载的图片对象。
let imageObjects = [];
- 构造 Image 对象并设置 src 属性
使用 JavaScript 中的 Image 对象构造函数,创建一个图片对象,然后将需要预加载的图片 URL 赋值给它的 src 属性。这将启动浏览器下载该图片资源。
let imageObject = new Image();
imageObject.src = 'https://example.com/images/image1.jpg';
- 将图片对象添加到数组中
将每个 Image 对象添加到之前创建的数组中。
imageObjects.push(imageObject);
- 等待所有图片加载完成
通过为每个 Image 对象设置 onload 事件处理程序,在所有图片加载完成后执行回调函数。
let count = 0;
for (let i = 0; i < imageObjects.length; i++) {
imageObjects[i].onload = function() {
count++;
if (count == imageObjects.length) {
// 所有图片加载完成
console.log('All images are loaded.');
}
}
}
以上是一个简单的图片预加载实现步骤,下面解释一下它的原理:
当浏览器解析 JavaScript 代码时,会依次执行每一行代码,通过创建 Image 对象并将 URL 赋值给它的 src 属性,浏览器开始下载图片资源。由于 JavaScript 是单线程执行的,当下载图片时,JavaScript 将等待下载完成,然后再执行下一行代码。因此,通过将所有图片对象存储在数组中,并为每个图片对象设置 onload 事件处理程序,当所有图片加载完成时,将执行回调函数。
值得注意的是,由于图片预加载会提前下载图片资源,因此可能会对页面的性能产生一定的影响。因此,应该仔细考虑需要预加载的图片数量,并权衡其对性能的影响。
---------------------------------------------------------------------------------------------------------------------------------
请详细举例说明什么时候执行图片预加载的代码?
图片预加载的代码应该在页面加载过程中尽早执行,以便在用户访问页面时尽可能快地呈现图片。以下是一些常见的情况,可以在这些情况下执行图片预加载的代码:
--------------------------------------------------------------------------------------------------------------------------------
如何避免重定向
重定向是指浏览器从一个URL地址跳转到另一个URL地址的过程。有时候,由于不同的原因(如网站架构调整、URL地址变更等),我们需要进行重定向操作,但重定向操作可能会降低网站的性能和用户体验。因此,我们需要尽可能地避免重定向。以下是一些常见的方法来避免重定向:
-
在设计网站架构时,尽可能减少URL地址的变更:在网站设计和开发过程中,我们应该尽可能地规划好网站的URL结构,避免频繁更改URL地址,以减少重定向操作的发生。
-
使用301重定向:如果网站URL地址必须发生变更,我们可以使用301永久重定向。这种重定向方式会告诉搜索引擎,原始URL地址已经永久移动到了新的URL地址,搜索引擎会自动将原始URL地址的权重转移到新的URL地址上,不会降低网站的SEO排名。
-
使用相对路径:在页面中引用其他页面或资源文件时,我们应该使用相对路径,避免使用绝对路径和完整URL地址。这样可以避免因为URL地址的变更而导致的重定向操作。
-
使用缓存:对于需要频繁访问的页面或资源文件,我们可以使用缓存机制,将它们保存在用户浏览器中。这样可以避免用户每次访问页面时都需要重新加载资源文件,减少重定向操作。
-
避免重复的重定向:有时候我们可能会出现重复的重定向,例如将一个页面重定向到另一个页面,而另一个页面又重定向到第三个页面。这样的重定向链会增加页面的加载时间,降低用户体验。因此,我们应该尽可能地避免这种情况的发生,或者使用301重定向将多个重定向操作合并为一个。
总之,避免重定向是提高网站性能和用户体验的重要步骤。我们应该尽可能地遵循上述方法来避免重定向操作的发生。
--------------------------------------------------------------------------------------------------------------------------------
如何优化CSS选择器,请举例说明
优化CSS选择器可以提高页面性能和用户体验。以下是一些优化CSS选择器的方法,并附带示例说明:
- 使用类选择器和ID选择器而不是标签选择器:类选择器和ID选择器比标签选择器更具体,因此匹配元素的速度更快。
例如,使用类选择器 .header
代替标签选择器 header
,可以提高选择器匹配速度:
- 避免使用通配符选择器:通配符选择器可以匹配页面上的任何元素,因此会导致浏览器对整个页面进行搜索和匹配,降低页面性能。
例如,避免使用通配符选择器 *
:
- 避免使用嵌套过深的选择器:嵌套过深的选择器需要更多的计算和匹配,因此会降低页面加载速度。
例如,避免使用过深的选择器:
- 避免使用复杂的属性选择器和伪类选择器:复杂的属性选择器和伪类选择器需要更多的计算和匹配,因此会降低页面加载速度。
例如,避免使用复杂的属性选择器:
总之,优化CSS选择器可以提高页面性能和用户体验。我们应该尽可能地使用简单、具体的选择器,避免使用复杂的选择器
--------------------------------------------------------------------------------------------------------------------------------
为什么使用字体图标可以减少网络请求次数
使用字体图标可以减少网络请求次数的原因是,字体图标实际上是使用 CSS 技术将向量图形转换为字体格式。这意味着只需要下载一种字体文件,而不是多个图像文件。相比之下,使用图像格式的图标需要每个图标都进行一次 HTTP 请求,这会增加页面加载时间和带宽消耗。
此外,字体图标可以更好地缩放和调整颜色,而不会失去图像的清晰度。这使得它们比基于图像的图标更加灵活,并且可以轻松地自定义。另外,由于字体图标只需要一次请求,所以它们可以更好地缓存和优化,这可以进一步提高页面性能和用户体验。
综上所述,使用字体图标可以减少网络请求次数,加快页面加载速度,并提高页面性能和用户体验。
--------------------------------------------------------------------------------------------------------------------------------
H5页面如何进行首屏优化
H5页面的首屏优化是指在页面首次加载时,尽可能快地呈现出用户所需要的内容,提高用户的体验。以下是一些常见的H5页面首屏优化方法:
-
合理使用CSS和JavaScript:CSS和JavaScript文件的加载会影响页面的加载速度。可以通过压缩CSS和JavaScript文件、使用CDN加速等方式减少文件大小和加载时间。
-
优化图片:图片是影响页面加载速度的主要因素之一。可以通过压缩图片、使用响应式图片、懒加载等方式来减少图片对页面加载速度的影响。
-
优化字体:字体文件也会影响页面加载速度,可以使用Web字体、系统默认字体等方式减少字体文件的加载时间。
-
减少HTTP请求:减少HTTP请求可以加快页面加载速度,可以通过合并CSS和JavaScript文件、使用CSS Sprites等方式来减少HTTP请求。
-
使用预加载技术:可以在页面加载时预加载一些资源,如图片、CSS和JavaScript文件,以提高页面加载速度。
-
合理设置缓存:合理设置缓存可以减少页面加载时间,可以通过设置Expires和Cache-Control头来控制缓存。
-
使用服务器端渲染:服务器端渲染可以减少页面加载时间,提高用户体验。可以使用一些框架和工具来实现服务器端渲染,如Next.js、Nuxt.js等。
-
去除不必要的元素:去除不必要的元素可以减少页面加载时间,提高用户体验。可以通过压缩HTML文件、去除注释、去除不必要的标签等方式来减少HTML文件的大小和加载时间。
通过以上优化方法,可以有效地提高H5页面的加载速度和用户体验。
--------------------------------------------------------------------------------------------------------------------------------
webpack常见的性能优化方式有哪些?
Webpack是一个强大的JavaScript模块打包器,它的性能对于大型项目是至关重要的。以下是一些Webpack常见的性能优化方式:
- 缩小处理范围
只处理必要的文件,避免不必要的资源浪费,可以使用exclude和include选项指定哪些文件需要处理。例如:
这样就可以避免将node_modules中的文件加入打包范围。
- 使用Code Splitting
Code Splitting是Webpack的一个强大功能,它可以将应用程序拆分成几个小块,只加载当前需要的模块。可以使用动态导入语法(Dynamic Imports)或者SplitChunksPlugin来实现。
- 使用缓存
使用缓存可以避免重复的工作,例如缓存loader的结果。可以使用cache-loader来实现。
- 使用DllPlugin和externals选项
DllPlugin可以提前编译一些不经常变化的库,例如React和React-DOM,从而避免每次打包都要重新编译它们。使用externals选项可以从打包后的代码中排除不需要的库。
- 压缩打包文件
压缩打包文件可以减小文件大小,从而提高应用程序的加载速度。可以使用UglifyJSPlugin和OptimizeCSSAssetsPlugin来压缩JavaScript和CSS。
--------------------------------------------------------------------------------------------------------------------------------
webpack的gzip压缩主要是压缩什么的?
Webpack的gzip压缩主要是压缩打包后的静态资源文件,例如JavaScript、CSS、图片等。在Webpack的构建过程中,会通过各种插件和工具将多个文件打包成一个或多个文件,这些文件包含了应用程序所需的所有代码和资源。
在这些打包后的文件中,JavaScript和CSS代码通常是最大的部分,因此最容易受益于gzip压缩。gzip压缩是一种广泛使用的数据压缩算法,它可以通过消除重复的数据和使用更短的编码来减小文件的大小。由于JavaScript和CSS文件通常包含大量的重复代码,gzip压缩可以有效地减小它们的大小,从而加快网站的加载速度并降低带宽消耗。
因此,Webpack的gzip压缩通常被用于优化网站的性能,以提高用户体验并降低网站的运行成本。
---------------------------------------------------------------------------------------------------------------------------------