当前位置: 首页 > news >正文

移动端H5缓存问题

移动端页面缓存问题是指页面的静态资源(如图片、JS 和 CSS 文件)在浏览器中被缓存后,用户在下次访问时可以直接从本地获取缓存数据,而不需要每次都从服务器重新获取,不过这样可能会导致页面不能正确地更新或者加载最新的内容。为了解决这个问题,我们可以采用一些缓存控制策略来解决。

一、缓存的基本原理

1. 什么是浏览器缓存

浏览器缓存是指当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。

浏览器缓存分为:

  • 协议缓存:也叫浏览器缓存、网页缓存,通过协议头里的 Cache-Control、Last-Modified、Expires、Etag等控制文件缓存;
  • 应用缓存:缓存HTML5程序,让Web应用程序可以离线运行;
  • 移动端APP中的内嵌HTML5缓存:也可以理解为 webview 中的 缓存;

协议缓存和 webview中缓存的场景出现的比较多,本文中只聊这两种缓存。

2. 缓存行为分析

首先,我们需要了解 WebView 和浏览器是如何缓存资源的。浏览器和 WebView 会缓存网络请求的资源,以提高页面加载速度,并减少网络流量。这种缓存机制对于一些资源是有益的,比如图片、样式文件、JavaScript 文件等,它们往往没有频繁变化,缓存可以节省加载时间和带宽。

然而,WebView 和浏览器也有缓存 HTML 文件的行为,尤其是当 URL 不发生变化时。此时,即使前端代码已经更新,浏览器或 WebView 可能会加载缓存中的旧版 HTML 和 JavaScript 资源,导致页面展示的内容不是最新的。

3. 浏览器缓存的流程

  1. 首次请求:浏览器发起 HTTP 请求并从服务器获取资源(HTML、CSS、JS、图片等),服务器响应时会带上相关的缓存头(如 Cache-Control)。
  2. 缓存保存:浏览器根据响应头部信息将资源缓存到本地存储(如内存缓存或硬盘缓存)。
  3. 后续请求:当用户再次访问相同资源时,浏览器会检查缓存是否有效,如果缓存未过期或未被清除,则直接使用缓存中的资源。如果资源过期,浏览器会向服务器发起验证请求,服务器通过 ETag 或 Last-Modified 确认资源是否变化,如果没有变化,浏览器将继续使用缓存的副本。

4. 哪些资源会出现缓存

一是静态资源(js、css、image),二是 HTML 本身,都可能会被缓存。

  1. 如果资源已被缓存且没有过期,资源的 URL 没有发生变化,浏览器会先加载缓存的资源。如 html 中引用 a.js, 用户刷新页面时,a.js 会从浏览器缓存中获取,而不是从服务器中获取
  2. 如果 js、css、img 静态资源做了版本号处理,但 HTML 本身没有重新请求,也是会导致渲染原来的HTML页面
  3. 需要我们自动检测更新,并自动更新的场景(这个比较适用于场景2 和 场景3。因为场景1通常情况下我们不考虑):
    • 场景1:用户开启着的浏览器,未刷新过页面;
    • 场景2:我们提供给任意第三方的嵌入式 js 文件,如 webapp.js,第三方未知,且我们也无法修改第三方的 html 代码;
    • 场景3:移动端 APP 嵌入到一级 NavBar 中的 H5 页面,为了用户体验设计,切换菜单时,并不销毁 webview,所以现象就是不杀掉 APP,H5页面不会刷新。

二、HTTP 协议缓存

1. HTTP 缓存的基本概念

HTTP 协议缓存机制是指通过 HTTP 协议头里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段来控制资源缓存的机制。

HTTP 协议提供了几个重要的参数,用来控制缓存的行为:

  • Cache-Control:最常用的缓存控制头部。通过设置不同的值来告诉浏览器是否缓存资源,以及缓存多长时间。例如:
    • Cache-Control: no-cache:每次请求都需要检查资源是否更新(强制验证缓存)。
    • Cache-Control: no-store:禁止缓存,浏览器每次都从服务器加载资源。
    • Cache-Control: max-age=:指定缓存的最大有效期(单位为秒),过期后需要重新从服务器获取资源。
    • Cache-Control: public:资源可以被任何缓存(如浏览器或代理服务器)缓存。
      ○Cache-Control: private:资源只能被浏览器缓存,不能被共享缓存(如 CDN 或代理服务器)缓存。
  • Expires:指定资源过期的日期和时间,表示资源在此时间之后不再有效,需重新获取。与 Cache-Control 配合使用时,Cache-Control 优先级更高。
  • ETag 和 Last-Modified:用于浏览器和服务器之间的资源验证。如果资源没有变化,浏览器可以使用缓存的副本;如果变化了,服务器会返回新的版本。

2. HTTP 缓存工作流程

  1. 浏览器请求资源:当浏览器向服务器请求资源时,服务器可以通过 Cache-Control 和 Expires 等头部告诉浏览器资源是否可以缓存,缓存多久,是否需要重新验证等。
  2. 浏览器缓存资源:如果服务器允许缓存资源,浏览器会把资源存储到本地缓存中,并标记资源的 Last-Modified 时间和 ETag(如果有)。
  3. 浏览器重新请求资源:当浏览器下次请求相同的资源时,它会根据缓存策略进行处理:
    • 如果缓存没有过期,浏览器会直接从缓存中读取资源,避免网络请求。
    • 如果缓存过期,浏览器会重新请求资源,并通过 If-Modified-Since 或 If-None-Match 头向服务器询问资源是否有变化。
  4. 服务器响应:服务器根据缓存验证结果决定是否返回新的资源。如果资源没有变化,服务器会返回 304 Not Modified 状态,告诉浏览器继续使用缓存。如果资源已修改,服务器会返回新的资源。

3. HTTP 缓存的类型

  1. 强缓存(强制缓存):

    强缓存通过 Cache-Control 和 Expires 控制,浏览器在缓存有效期内直接使用缓存,不会发起请求。示例:Cache-Control: max-age=3600 表示资源可以缓存 1 小时。

  2. 协商缓存(验证缓存):

    协商缓存依赖于 Last-Modified 和 ETag 头部,浏览器每次请求时会带上缓存的时间或标识符,服务器验证资源是否发生变化。

    • 如果没有变化,服务器返回 304 Not Modified,浏览器继续使用缓存。
    • 如果资源变化,服务器返回新的资源。

4. HTTP 缓存的优化策略

  • 使用合理的缓存过期时间:根据资源的更新频率设置合理的缓存时间,例如图片和 CSS 可以设置较长的缓存时间,而 API 请求可以设置较短的缓存时间。
  • 版本控制:通过在资源的 URL 中添加版本号或时间戳,使浏览器识别到资源变化并重新加载。
  • 利用 CDN(内容分发网络):CDN 可以将资源缓存到不同地域的服务器上,减少请求的延迟并提高资源的加载速度。
  • 清除过期缓存:通过服务器配置和客户端的缓存管理,定期清除过期的缓存,避免浪费存储空间和导致不一致的资源问题。

三、WebView缓存

1. 缓存概述

WebView 是一种嵌入式浏览器控件,让 Web 应用嵌入到原生 App 中,通过它可以在原生应用中加载和展示网页。由于 WebView 像一个浏览器一样呈现网页,因此它也有自己的缓存机制,用于存储网页内容、资源(如图片、CSS、JavaScript 等)以及请求的响应,以提高页面加载速度,减少网络请求。

然而,WebView 的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在 H5 发版后,iOS 端用户可能仍然加载到缓存的旧页面,造成了不一致的体验。

2. 缓存的工作原理

  1. 资源加载
  • 当一个网页在 WebView 中加载时,它会检查是否已经缓存了该网页的资源。
  • 如果缓存中有相关资源,WebView 会从缓存中加载,而不是从网络请求。
  • 如果缓存没有资源,WebView 会向服务器发起请求并缓存返回的资源。
  1. 缓存控制
  • WebView 会根据 HTTP 请求中的 Cache-Control、Expires 和 ETag 等头部信息来决定缓存的策略。
  • 如果网页资源的缓存已过期或服务器要求不缓存资源,WebView 会重新请求资源。
  1. WebView 预加载缓存
  • WebView 也可以支持 预加载缓存,即在后台提前加载并缓存网页资源,当用户需要时,页面可以更快速地加载。
  1. 存储位置
  • WebView 会将缓存文件存储在设备的文件系统中。缓存存储的位置因平台而异,在 Android 中,通常缓存文件存储在应用的私有目录或 WebView 的默认目录中,在 iOS 中,则存储在沙盒内。

四、解决方案

如果希望在每次部署新版本时浏览器能强制重新加载新的 HTML 文件,而不是使用缓存中的旧版本,可以通过以下几种方式来确保 HTML 文件能够及时更新:

1. HTTP 配置

1.1 使用 Cache-Control

你可以在服务器端控制缓存策略,确保浏览器不会缓存资源。

  • Cache-Control: no-cache:告诉浏览器每次请求时都需要验证资源是否已更新。如果资源改变,浏览器将重新加载;否则,使用缓存。
  • Cache-Control: no-store:告诉浏览器完全不缓存任何资源,每次请求时都从服务器获取。
  • Cache-Control: max-age=0:设置缓存过期时间为 0,实际上也会强制每次请求都从服务器获取资源。

1.2 使用 Expires: 0

Expires 头部可以设置资源的过期时间,0 或过去的时间可以确保资源被认为是过期的,浏览器每次都会从服务器拉取资源
Expires: 0

1.3 动态 URL 参数

通过在每个请求的 URL 上添加一个动态的查询参数,可以防止浏览器缓存资源。常见做法是添加一个时间戳或版本号。例如:

<script src="script.js?v=20250114"></script>

你可以使用当前时间戳或版本号作为查询参数,每次请求时都保证 URL 是唯一的,浏览器会认为这是新的请求,从服务器重新加载资源。
例如,生成 URL 的方式:

const url = "script.js?v=" + new Date().getTime();

1.4 使用 no-cache meta 标签(适用于 HTML 页面)

虽然 meta 标签不能完全替代 HTTP 头部,但你也可以通过在 HTML 中添加 no-cache 的 meta 标签来尽量避免缓存。

<meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

2. Nginx配置

通过修改 Nginx 配置文件来设置 HTTP 头部,可以防止浏览器缓存 HTML 文件。以下是一个常见的配置示例:

2.1 禁止缓存文件

缓存HTM文件
在 Nginx 配置文件中,可以为 HTML 文件配置 Cache-Control、Pragma 和 Expires 头部来禁用缓存:

server {listen 80;server_name yourdomain.com;location / {# 禁止 HTML 缓存add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate';add_header Pragma 'no-cache';add_header Expires '0';# 其他配置root /var/www/html;index index.html;}# 其他 location 配置
}

配置解释:

  • Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate:这个配置确保每次请求都会重新拉取 HTML 文件,且浏览器不会缓存它。
  • Pragma: no-cache:这是为了兼容老旧浏览器,它会告诉浏览器不要缓存资源。
  • Expires: 0:将资源的过期时间设置为 0,使其立即过期,从而避免缓存。

缓存其他静态资源(如 JS、CSS、图片)

如果你希望缓存其他静态资源(如 JavaScript、CSS 和图片),但不缓存 HTML 文件,可以针对这些资源配置不同的缓存策略。例如,你可以设置较长的缓存时间,缓存静态资源:

server {listen 80;server_name yourdomain.com;# 禁止缓存 HTML 文件location / {add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate';add_header Pragma 'no-cache';add_header Expires '0';root /var/www/html;index index.html;}# 缓存 JS, CSS, 图片文件(设置 1 周缓存)location ~* \.(js|css|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf)$ {add_header Cache-Control 'public, max-age=604800';  # 缓存 1 周}
}

配置解释:

  • location ~* .(js|css|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf)$:这行配置用于匹配所有常见的静态资源文件(JavaScript、CSS、图片、字体等)。
  • Cache-Control: public, max-age=604800:这会将静态资源缓存 7 天(604800 秒),从而减少对服务器的请求。

2.2 缓存策略与优化

为了提高 H5 页面的性能和用户体验,开发者可以采取一些缓存优化策略:

  • 合理设置缓存头:通过设置适当的 Cache-Control、Expires、ETag 等 HTTP 头部来控制资源的缓存行为。
  • 版本化静态资源:通过 URL 中添加版本号(如 script.js?v=1.0.0)来避免缓存带来的问题。
  • Service Worker 缓存:利用 Service Worker 来精细控制哪些资源缓存,哪些资源不缓存,并提供离线功能。
    ●懒加载和预加载:将不常用的资源延迟加载,常用资源预加载,提高页面响应速度。

3. 手动清除缓存

如果你的服务器配置无法保证自动清除 HTML 缓存,或者你不希望修改文件名,你还可以在用户访问网页时通过 JavaScript 强制清除浏览器缓存,或者通过 meta 标签来控制缓存。

3.1 HTML 标签

你可以在 index.html 文件的 标签中加入以下 meta 标签来告知浏览器不要缓存页面:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

这会告诉浏览器:

  • Cache-Control: no-cache:每次请求都需要检查服务器上是否有新的内容。
  • no-store:禁止缓存文件,确保每次都从服务器获取。
  • Expires: 0:设置过期时间为 0,表示文件立即过期。

3.2 JavaScript 通过控制缓存

在某些情况下,可以通过 JavaScript 在加载页面时清除缓存或强制加载新的资源。例如,使用 window.location.reload(true) 强制浏览器从服务器加载页面而不是从缓存中加载:

// 动态清除缓存并重新加载页面
window.location.reload(true);

4.动态参数策略

一种常见的解决方案是 给 URL 加上动态参数,如时间戳或随机数。每次加载时,URL 发生变化,即使 URL 模式相同,由于参数不同,浏览器会认为这是一个新的请求,从而绕过缓存,重新加载最新的 HTML 文件和其他资源。

const timestamp = new Date().getTime();
const url = `https://example.com/page?timestamp=${timestamp}`;

每次页面加载时,都会生成一个不同的 URL,从而避免缓存。

相关文章:

移动端H5缓存问题

移动端页面缓存问题是指页面的静态资源&#xff08;如图片、JS 和 CSS 文件&#xff09;在浏览器中被缓存后&#xff0c;用户在下次访问时可以直接从本地获取缓存数据&#xff0c;而不需要每次都从服务器重新获取&#xff0c;不过这样可能会导致页面不能正确地更新或者加载最新…...

11-1.Android 项目结构 - androidTest 包与 test 包(单元测试与仪器化测试)

androidTest 包与 test 包 在 Android 项目中&#xff0c;androidTest 包与 test 包用于存放不同类型的测试代码的 1、测试类型 &#xff08;1&#xff09;androidTest 包 主要用于存放单元测试&#xff08;Unit Tests&#xff09;代码 单元测试是针对应用程序中的独立模块…...

计算机网络(五)——传输层

一、功能 传输层的主要功能是向两台主机进程之间的通信提供通用的数据传输服务。功能包括实现端到端的通信、多路复用和多路分用、差错控制、流量控制等。 复用&#xff1a;多个应用进程可以通过同一个传输层发送数据。 分用&#xff1a;传输层在接收数据后可以将这些数据正确分…...

ZCC9159 -7V 300mA 超低功耗高速 LDO

功能描述 ZCC9195是一款超低功耗并具有快速响应、关断快速放电功能的高速LDO。静态电流低至 0.8uA&#xff0c;输出电流最大为300mA。 ZCC9195具有输出过流保护、输出短路保护、温度保护等功能&#xff0c;确保芯片在异常工作条件 下不会损坏。 ZCC9195只需要1uF的陶瓷电容即…...

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…...

【C语言算法刷题】第7题

题目描述 一个XX产品行销总公司&#xff0c;只有一个boss&#xff0c;其有若干一级分销&#xff0c;一级分销又有若干二级分销&#xff0c;每个分销只有唯一的上级分销。 规定&#xff0c;每个月&#xff0c;下级分销需要将自己的总收入&#xff08;自己的下级上交的&#xf…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型

完整源码项目包获取→点击文章末尾名片&#xff01; 使用HuggingFace开发的Transformers库&#xff0c;使用BERT模型实现中文文本分类&#xff08;二分类或多分类&#xff09; 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

RocketMQ消息发送---源码解析

我们知道rocketMQ的消息发送支持很多特性&#xff0c;如同步发送&#xff0c;异步发送&#xff0c;oneWay发送&#xff0c;也支持超时机制&#xff0c;回调机制&#xff0c;并且能够保证消息的可靠性和消息发送的限流&#xff0c;底层使用netty框架等等&#xff0c;如此多的特性…...

机器学习06-正则化

机器学习06-正则化 文章目录 机器学习06-正则化0-核心逻辑脉络1-参考网址3-大模型训练中的正则化1.正则化的定义与作用2.常见的正则化方法及其应用场景2.1 L1正则化&#xff08;Lasso&#xff09;2.2 L2正则化&#xff08;Ridge&#xff09;2.3 弹性网络正则化&#xff08;Elas…...

如何开放2375和2376端口供Docker daemon监听

Linux (以 Ubuntu 为例) 1. 修改 Docker 配置文件 打开 Docker 的配置文件 /etc/docker/daemon.json。如果该文件不存在&#xff0c;则可以创建一个新的。 bash sudo nano /etc/docker/daemon.json在配置文件中添加以下内容&#xff1a; json {"hosts": ["un…...

Vue.js组件开发-如何实现路由懒加载

在Vue.js应用中&#xff0c;路由懒加载是一种优化性能的技术&#xff0c;它允许在需要时才加载特定的路由组件&#xff0c;而不是在应用启动时加载所有组件。这样可以显著减少初始加载时间&#xff0c;提高用户体验。在Vue Router中&#xff0c;实现路由懒加载非常简单&#xf…...

rclone,云存储备份和迁移的瑞士军刀,千字常文解析,附下载链接和安装操作步骤...

一、什么是rclone&#xff1f; rclone是一个命令行程序&#xff0c;全称&#xff1a;rsync for cloud storage。是用于将文件和目录同步到云存储提供商的工具。因其支持多种云存储服务的备份&#xff0c;如Google Drive、Amazon S3、Dropbox、Backblaze B2、One Drive、Swift、…...

集成学习算法

目录 1.必要的导入 2.Bagging集成 3.基于matplotlib写一个函数对决策边界做可视化 4.总结图中结论 5.扩展说明 1.必要的导入 # To support both python 2 and python 3 from __future__ import division, print_function, unicode_literals# Common imports import numpy as np…...

vue3之pinia学习

最近查看了pinia这个状态管理管理&#xff0c;想跟大家一起学习下&#xff0c;下面是我的个人理解&#xff0c;希望对大家有帮助&#xff0c;我们开始吧&#xff01; 第一步&#xff1a;安装pinia npm install pinia 第二步&#xff1a;创建pinia <script setup langts&…...

Flink (七): DataStream API (四) Watermarks

1. Event Time and Processing Time 1. 1 处理时间&#xff08;Processing time&#xff09; 处理时间是指执行相应操作的机器的系统时间。当流处理程序基于处理时间运行时&#xff0c;所有基于时间的操作&#xff08;如时间窗口&#xff09;将使用执行相应算子的机器的系统时…...

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…...

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量&#xff1a;质量评估与改进策略 引言&#xff1a;数据质量的概念 在大数据时代&#xff0c;数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途&#xff0c;确保数据的准确性、完整性、一致性和及时性是数据质量的…...

GLM: General Language Model Pretraining with Autoregressive Blank Infilling论文解读

论文地址&#xff1a;https://arxiv.org/abs/2103.10360 参考&#xff1a;https://zhuanlan.zhihu.com/p/532851481 GLM混合了自注意力和masked注意力&#xff0c;而且使用了2D位置编码。第一维的含义是在PartA中的位置&#xff0c;如5 5 5。第二维的含义是在Span内部的位置&a…...

总结SpringBoot项目中读取resource目录下的文件多种方法

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…...

云原生第四次作业

下载 [rootopenEuler-1 ~]# wget https://archive.apache.org/dist/httpd/httpd-2.4.46.tar.gz 压缩 配置实验环境 [rootopenEuler-1 httpd-2.4.46]# yum -y install apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-d…...

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…...

设计模式-工厂模式/抽象工厂模式

工厂模式 定义 定义一个创建对象的接口&#xff0c;让子类决定实列化哪一个类&#xff0c;工厂模式使一个类的实例化延迟到其子类&#xff1b; 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中&#xff0c;核心工厂类不在负责产品的创建&#xff0c;而是将具体的创建工作…...

【算法学习】——整数划分问题详解(动态规划)

&#x1f9ee;整数划分问题是一个较为常见的算法题&#xff0c;很多问题从整数划分这里出发&#xff0c;进行包装&#xff0c;形成新的题目&#xff0c;所以完全理解整数划分的解决思路对于之后的进一步学习算法是很有帮助的。 「整数划分」通常使用「动态规划」解决&#xff0…...

【新教程】Ubuntu 24.04 单节点安装slurm

背景 网上教程老旧&#xff0c;不适用。 详细步骤 1、安装slurm sudo apt install slurm-wlm slurm-wlm-doc -y检查是否安装成功&#xff1a; slurmd --version如果得到slurm-wlm 23.11.4&#xff0c;表明安装成功。 2、配置slurm。 使用命令&#xff1a; sudo vi /etc/s…...

window下用vim

Windows 默认不支持 vim 命令&#xff0c;需要手动安装后才能使用。以下是解决方案&#xff1a; 1. 安装 Vim 编辑器 方法 1&#xff1a;通过 Scoop 或 Chocolatey 安装 使用 Scoop&#xff1a; 安装 Scoop&#xff08;如果尚未安装&#xff09;&#xff1a;iwr -useb get.sco…...

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…...

使用PWM生成模式驱动BLDC三相无刷直流电机

引言 在 TI 的无刷直流 (BLDC) DRV8x 产品系列使用的栅极驱动器应用中&#xff0c;通常使用一些控制模式来切换MOSFET 开关的输出栅极。这些控制模式包括&#xff1a;1x、3x、6x 和独立脉宽调制 (PWM) 模式。   不过&#xff0c;DRV8x 产品系列&#xff08;例如 DRV8311&…...

常见的php框架有哪几个?

一直以来&#xff0c;PHP作为一种广泛使用的编程语言&#xff0c;拥有着许多优秀的框架来帮助开发人员快速构建稳定的Web应用程序。本文降为大家介绍几种常见的PHP的主流框架&#xff0c;以及它们相关的特点和使用场景。如有问题&#xff0c;欢迎指正&#xff01; 1.Laravel&a…...

机器学习(2):线性回归Python实现

1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示&#xff1a; y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值)&#xff1b;X1, X2, ... Xn 是自变量&#xff08;特征&#xff09;β0, β1,…...

Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例

文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…...

【Unity-Animator】通过 StateMachineBehaviour 实现回调

StateMachineBehaviour 简介 StateMachineBehaviour是一个基类&#xff0c;所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码&#xff0c;而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑&#xff0c;例…...

并行服务、远程SSH无法下载conda,报错404

原下载代码无效&#xff0c;报错404 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh 使用下面代码下载 wget --user-agent"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12…...

cuquantum 简介

1. 关于 cuquantum 概述 官方文档&#xff1a; https://docs.nvidia.com/cuda/cuquantum/latest/appliance/overview.html#prerequisites NVIDIA 的 cuQuantum 是一个专门用于量子计算的高性能库&#xff0c;旨在加速量子电路的模拟和量子算法的执行。cuQuantum 提供了一系列…...

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…...

【react】使用antd Table渲染数据遇到的报错问题

记录自己在开发过程中遇到的报错问题&#xff1a; 目录 原本写法&#xff1a;错误分析&#xff1a;解决方案&#xff1a; 原本写法&#xff1a; render: (text) > {console.log(text, "111111text");console.log(typeof text, "111111text");return t…...

55_OpenResty开发入门

Nginx编程需要用到Lua语言,因此我们必须先学习Lua的基本语法。Nginx本身也是C语言开发,因此也允许基于Lua做拓展。多级缓存的实现离不开Nginx编程,而Nginx编程又离不开OpenResty。 1.OpenResty概述 OpenResty是一款基于NGINX和LuaJIT的Web平台。通过Lua扩展NGINX实现的可伸…...

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper&#xff1a;HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code&#xff1a;https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;...

全网首发:编译libssh,产生类似undefined reference to `EVP_aes_256_ctr@OPENSSL_1_1_0‘的大量错误

具体错误 前面和后面的&#xff1a; /opt/linux/x86-arm/aarch64-mix210-linux/host_bin/../lib/gcc/aarch64-linux-gnu/7.3.0/../../../../aarch64-linux-gnu/bin/ld: warning: libcrypto.so.1.1, needed by ../lib/libssh.so.4.10.1, not found (try using -rpath or -rpat…...

springboot 集成javaFx 两个面板之间如何进行跳转

1.创建两个面板 可参考博主的 java8 springboot 集成javaFx 实现一个客户端程序 文章来实现 2.完善代码 以下是博主创建的两个模板 博主在这里实现的是登录跳转功能,注意:这里登录按钮的触发实现方式做了以下小小的改动,也可根据自己的习惯来处理 相较第一篇文章,博主在Lo…...

vue-cli项目配置使用unocss

在了解使用了Unocss后&#xff0c;就完全被它迷住了。接手过的所有项目都配置使用了它&#xff0c;包括一些旧项目&#xff0c;也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的&#xff0c;项目是vue2vue-cli构建的&#xff0c;node<20平常开…...

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离&#xff0c;但是有些时候我们还会可以根据应用中的功能…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证5)

用户在前端页面登录成功后会从服务端获取Token&#xff0c;后续调用服务器的服务接口时都得带着Token&#xff0c;否则就会验证失败。之前使用postman测试的时候&#xff0c;获取Token后再调用其它服务都是人工将Token添加到Header中&#xff0c;网页中没法这么做&#xff0c;只…...

【Vue】let、const、var的区别、适用场景

let、const、var&#xff0c;有哪些区别&#xff0c;适用场景 var 特点&#xff1a; var 是 JavaScript 中最传统的变量声明方式。具有函数作用域&#xff0c;即在函数内声明的 var 变量&#xff0c;在整个函数内都可以访问。变量提升&#xff1a;使用 var 声明的变量会被提升…...

【llama_factory】qwen2_vl训练与批量推理

训练llama factory配置文件 文件&#xff1a;examples/train_lora/qwen2vl_lora_sft.yaml ### model model_name_or_path: qwen2_vl/model_72b trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_target: all### dataset dataset: ca…...

计算机视觉与深度学习:使用深度学习训练基于视觉的车辆检测器(MATLAB源码-Faster R-CNN)

在人工智能领域,计算机视觉是一个重要且充满活力的研究方向。它使计算机能够理解和分析图像和视频数据,从而做出有意义的决策。其中,目标检测是计算机视觉中的一项关键技术,它旨在识别并定位图像中的多个目标对象。车辆检测作为目标检测的一个重要应用,在自动驾驶、智能交…...

Python 扫描枪读取发票数据导入Excel

财务需要一个扫描枪扫描发票文件&#xff0c;并将主要信息录入Excel 的功能。 文件中sheet表的列名称&#xff0c;依次为&#xff1a;发票编号、发票编码、日期、金额、工号、扫描日期。 扫描的时候&#xff0c;Excel 文件需要关闭&#xff0c;否则会报错。 import openpyxl …...

SpringMVC复习笔记

文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步&#xff1a;导入依赖第二步&#xff1a;Controller 层开发第三步&#xff1a;SpringMVC 配置类配置核心组件第四步&#xff1a;SpringMVC 环境搭建第五步&#xff1a;部…...

arcgis提取不规则栅格数据的矢量边界

效果 1、准备数据 栅格数据:dem或者dsm 2、栅格重分类 分成两类即可 3、新建线面图层 在目录下选择预先准备好的文件夹,点击右键,选择“新建”→“Shapefile”,新建一个Shapefile文件。 在弹出的“新建Shapefile”对话框内“名称”命名为“折线”,“要素类型”选…...

【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 在当今数字化浪潮汹涌澎湃的时代&#xff0c;零售行业正站在转型升级的十字路口。市场竞争的白热化使得企业必须另辟蹊径&#xff0…...