深入了解加快网站加载时间的 JavaScript 优化技术

news2024/11/27 14:35:59

目录

01、最小化文件大小

01)、JavaScript 代码示例:缩小前后

02、文件压缩

01)、Gzip 和 Brotli 压缩方法

02)、压缩的服务器端配置

03、捆绑以减少网络请求

01)、捆绑说明

02)、捆绑工具

03)、JavaScript 代码示例:捆绑多个文件

04、为图像和图标使用 Sprite

01)、图像精灵的解释

02)、创建图像精灵

03)、CSS 代码示例:使用图像精灵

05、延迟加载资源

01)、JavaScript 代码示例:实现延迟加载

06、利用缓存

01)、浏览器缓存

02)、缓存控制和 ETag 标头

03)、在服务器端配置缓存

07、利用异步加载

01)、JavaScript 文件的异步加载

02)、使用 Async 和 Defer 属性

03)、JavaScript 代码示例:异步和延迟用法

08、采用最佳实践来缩短加载时间并改进用户体验

01)、代码拆分

02)、JavaScript 代码示例:实现代码拆分

03)、使用内容分发网络 (CDN)

04)、优化 DOM 操作和事件处理

05)、JavaScript 代码示例:高效的 DOM 操作

06)、浏览器开发者工具

07)、在线工具

总结


        在当今快节奏的数字世界中,网站性能在决定任何在线企业的成功方面起着至关重要的作用。

        一个快速、响应迅速且用户友好的网站不仅可以吸引和留住访问者,还有助于提高搜索引擎排名、提高转化率和改善用户体验 (UX)。

        作为软件工程师或 Web 开发人员,必须在项目中优先考虑性能优化技术。

        在本文中,我将分享通过各种方法来优化 JavaScript 代码,包括最小化文件大小、减少网络请求、利用缓存和异步加载,以及采用最佳实践来确保更快的加载时间和改进的用户体验。

01、最小化文件大小

        影响网站加载时间的关键因素之一是提供给用户的文件大小。

        较大的文件需要更多时间来下载,并可能导致你的网站加载缓慢,从而导致用户体验欠佳。JavaScript 文件也不例外,优化它们的大小是提高网站性能的基本步骤。

        缩小是在不影响其功能的情况下删除不必要的字符(例如空格、注释和换行符)并缩短 JavaScript 代码中的变量名称的过程。这导致文件大小显着减小,进而导致更快的加载时间和更高的性能。

01)、JavaScript 代码示例:缩小前后

让我们看一个简单的例子来理解缩小对文件大小的影响:

缩小前:

// Function to calculate the sum of two numbers
function addNumbers(num1, num2) {
    return num1 + num2;
}

// Use the function to calculate the sum of 3 and 5
const sum = addNumbers(3, 5);

// Log the result to the console
console.log("The sum is:", sum);

缩小后:

function addNumbers(n,e){return n+e}const sum=addNumbers(3,5);console.log("The sum is:",sum);

        如你所见,代码的缩小版本明显更小,删除了不必要的字符并缩短了变量名。这会导致更小的文件大小和更快的加载时间,而不会影响代码的功能。

02、文件压缩

        压缩是另一种用于减小文件大小的技术,可以缩短网站加载时间。

        它的工作原理是应用算法来压缩文件中的数据,使文件更小而不失去其功能。当浏览器请求压缩文件时,它会即时解压缩,以便正确呈现和执行内容。

        有两种广泛使用的 JavaScript 文件压缩算法:Gzip 和 Brotli。

        Gzip 长期以来一直是事实上的标准,但是由 Google 开发的更新的压缩算法 Brotli 因其优越的压缩比和速度而变得越来越流行。

01)、Gzip 和 Brotli 压缩方法

        Gzip:Gzip 是一种广泛采用的压缩算法,可以显着减小 JavaScript 文件的大小。Gzip 使用 Deflate 算法,该算法结合了 LZ77 和霍夫曼编码以高效地压缩数据。

图片

        Brotli:Brotli 是 Google 开发的一种较新的压缩算法,提供比 Gzip 更好的压缩率。Brotli 结合使用 LZ77、霍夫曼编码和一种新颖的上下文建模技术来实现更高的压缩率。

图片

        在大多数情况下,Brotli 在压缩比和速度方面都优于 Gzip,这使其成为现代 Web 应用程序的一个有吸引力的选择。

02)、压缩的服务器端配置

        要提供压缩的 JavaScript 文件,你需要将服务器配置为使用 Gzip 或 Brotli 压缩文件,然后再将它们发送到客户端。

        具体配置步骤因您的服务器类型(例如 Apache、Nginx 或 Node.js)而异。以下是如何在流行的服务器类型上启用压缩的简要概述:

  • ·Apache:为 Gzip 压缩启用 mod_deflate 模块或为 Brotli 压缩启用 mod_brotli 模块,并在 .htaccess 文件或虚拟主机配置中配置适当的设置。

  • ·Nginx:在 Nginx 配置文件中使用 gzip 或 brotli 指令启用压缩并指定设置。

  • ·Node.js:对于基于 Node.js 的服务器,您可以将中间件(例如用于 Gzip 的压缩或用于 Brotli 的 shrink-ray-current)与 Express 或类似的 Web 框架结合使用。

        请务必注意,某些浏览器可能不支持 Brotli 压缩,因此,最好将你的服务器配置为在不支持 Brotli 时回退到 Gzip。

        这确保了所有浏览器的最佳兼容性和性能。

03、捆绑以减少网络请求

        减少网络请求的数量对于提高网站性能至关重要,因为每个请求都会增加延迟并消耗带宽。

图片

01)、捆绑说明

        捆绑是将多个 JavaScript 文件组合成一个文件的过程。这减少了浏览器需要发出的 HTTP 请求的数量,从而加快了加载过程。捆绑可以显着提高网站性能,尤其是对于具有大量较小 JavaScript 文件的网站。

02)、捆绑工具

有几种流行的工具可用于捆绑 JavaScript 文件,每种工具都有其独特的特性和优势。

以下是一些广泛使用的捆绑工具:

  • ·Webpack:Webpack 是一个功能强大且灵活的模块捆绑器,它不仅可以捆绑 JavaScript 文件,还可以处理样式表和图像等其他资产。它具有强大的插件生态系统,允许你根据需要扩展其功能。

  • ·Rollup:Rollup 是另一个流行的 JavaScript 模块打包器,专注于简单性和性能。它特别适合捆绑库,可以输出多种格式,包括 CommonJS、AMD 和 ES 模块。

03)、JavaScript 代码示例:捆绑多个文件

        为了演示捆绑过程,我们假设你有三个独立的 JavaScript 文件:

// main.js
import { greet } from './greeting.js';
import { calculate } from './math.js';

console.log(greet('John'));
console.log(calculate(5, 3));

​​​

// greeting.js
export function greet(name) {
  return `Hello, ${name}!`;
}
​​​​​​
// math.js
export function calculate(x, y) {
  return x * y;
}

        使用 Webpack 或 Rollup 等捆绑工具,你可以将这些文件组合成一个捆绑文件。输出可能看起来像这样:​​​​​​​

(function () {
  'use strict';

  function greet(name) {
    return `Hello, ${name}!`;
  }

  function calculate(x, y) {
    return x * y;
  }

  console.log(greet('John'));
  console.log(calculate(5, 3));
})();

        如你所见,捆绑文件将原始文件中的所有必要代码包含在一个独立的单元中,从而减少了加载脚本所需的网络请求数。

        通过最小化请求数量,你可以减少浏览器下载和处理必要资源所需的时间,从而缩短加载时间并提供更灵敏的用户体验。

04、为图像和图标使用 Sprite

        利用图像精灵是另一种减少网络请求和提高网站性能的技术。

        精灵本质上是一个包含多个较小图像(例如图标或 UI 元素)的图像文件。

01)、图像精灵的解释

        图像精灵是一个大图像,包含多个以网格状图案排列的小图像。在 CSS 或 JavaScript 代码中,可以通过指定图像的位置和尺寸来引用精灵中的各个图像。

        此方法允许仅通过单个 HTTP 请求加载许多图像,从而减少延迟并缩短加载时间。

图片

02)、创建图像精灵

要创建图像精灵,可以使用各种工具,例如:

  • ·Sprite 生成器工具:SpritePad 或 Stitches 等在线工具允许您上传多张图像并自动生成一个 sprite,以及相应的 CSS 代码。

  • ·图像编辑软件:Adobe Photoshop 或 GIMP 等程序可用于通过在新文件中排列较小的图像并将结果导出为单个图像来手动创建精灵。

03)、CSS 代码示例:使用图像精灵

        假设您有一个名为“icons.png”的精灵图像,其中包含多个图标,你可以使用以下 CSS 代码将各个图标显示为不同元素的背景图像:​​​​​​​

.icon {
  width: 32px;
  height: 32px;
  background-image: url('icons.png');
}
​​​​​​​
.icon-search {
  background-position: 0 0;
}

.icon-settings {
  background-position: -32px 0;
}

.icon-user {
  background-position: -64px 0;
}

        每个图标类指定相应图标在 sprite 中的位置,无需额外的 HTTP 请求即可显示所需的图像。

        通过将这些较小的图像组合成一个文件,浏览器只需要请求一个图像,减少了 HTTP 请求的数量。

05、延迟加载资源

        延迟加载是一种将非关键资源的加载推迟到实际需要时才加载的技术。

        这意味着你无需预先加载所有资源,而只需加载即时视图所需的资源,而其余的则在它们变得相关时获取。延迟加载可以大大缩短网站的初始加载时间和感知性能,尤其是在处理图像或冗长脚本等大型资产时。

01)、JavaScript 代码示例:实现延迟加载

        为了说明延迟加载,让我们使用仅当图像在视口中可见时才加载图像的示例。这可以使用 IntersectionObserver API 来实现。

这是一个简单的实现:

        首先,向你的图像元素添加一个 src 属性,其中包含实际的图像源:

<img src="path/to/image.jpg" class="lazy-load" alt="An example image">

        然后,创建一个脚本来设置 IntersectionObserver 以在图像进入视口时加载图像:​​​​​​​

document.addEventListener('DOMContentLoaded', function () {
  const lazyImages = [].slice.call(document.querySelectorAll('.lazy-load'));

  if ('IntersectionObserver' in window) {
    const lazyImageObserver = new IntersectionObserver(function (entries, observer) {
      entries.forEach(function (entry) {
        if (entry.isIntersecting) {
          const lazyImage = entry.target;
          lazyImage.src = lazyImage.dataset.src;
          lazyImage.classList.remove('lazy-load');
          lazyImageObserver.unobserve(lazyImage);
        }
      });
    });

    lazyImages.forEach(function (lazyImage) {
      lazyImageObserver.observe(lazyImage);
    });
  }
});

        在此示例中,IntersectionObserver 监视 .lazy-load 图像是否进入视口。检测到图像时,会将其 dataset-src 属性分配给 src 属性,从而触发实际的图像下载。加载图像后,将删除延迟加载类,并且不会观察到图像。

        使用这种简单的延迟加载技术,你可以确保只加载当前查看的图像,减少网络请求的数量并缩短网站的初始加载时间。

        注意:将此代码提取到名为 useLazyImageObserver 的自定义组件中可能是个好主意。然后,您可以使用像 Bit 这样的开源工具链通过简单的 npm i @bit/your-username/use-location 在所有项目中发布、版本化和重用它。在这里了解更多。

06、利用缓存

        网站性能是提供出色用户体验的关键因素。

        提高性能的一项基本技术是缓存,它允许浏览器存储网站资源的副本,例如,图像、样式表和脚本。这减少了重复下载的需要并加快了加载时间。在本节中,我们将探讨缓存的概念以及如何利用它来提高网站的性能。

01)、浏览器缓存

        浏览器缓存是一种使网络浏览器能够在本地存储网站文件副本的机制。当用户重新访问你的站点时,浏览器可以从缓存中加载这些资源,而不是再次下载它们,从而加快加载时间并减少服务器负载。

        通过配置你的服务器以提供适当的缓存标头,你可以控制缓存哪些资源以及缓存多长时间。

图片

02)、缓存控制和 ETag 标头

        用于控制浏览器缓存的两个重要标头是 Cache-Control 和 ETag。

        Cache-Control 标头允许你设置缓存指令,例如缓存中资源的最长期限或是否应重新验证。

        例如,可以使用 Cache-Control:public, max-age=3600 表示资源可以缓存一小时。

        ETag 标头为特定版本的资源提供唯一标识符(通常是哈希)。当浏览器请求资源时,它会发送缓存中的 ETag 值。如果服务器的 ETag 值与浏览器发送的值匹配,则服务器响应 304 Not Modified 状态,浏览器使用缓存的版本。此机制有助于确保浏览器始终拥有最新版本的资源。

03)、在服务器端配置缓存

        要启用浏览器缓存,你需要将服务器配置为 为你的资源提供适当的标头。此过程因你的服务器软件而异。

        例如,在 Apache 服务器中,您可以使用 .htaccess 文件来设置缓存标头:

        此配置为 CSS、JS、JPG 和 PNG 文件设置 Cache-Control 标头,允许它们缓存 24 小时。

        通过利用浏览器缓存,你可以显着减少用户重新访问您的站点时需要获取的数据量,从而加快加载时间并改善整体用户体验。

07、利用异步加载

        随着网站变得越来越复杂,管理 JavaScript 文件的加载对于性能变得越来越重要。

        默认情况下,浏览器同步加载脚本,阻塞渲染过程,直到脚本完全加载并执行。异步加载允许脚本与其他资源并行加载,防止它们阻塞渲染并改善整体加载时间。

        在本节中,我们将讨论如何利用 JavaScript 文件的异步加载来增强网站的性能。

01)、JavaScript 文件的异步加载

        异步加载允许浏览器下载和执行 JavaScript 文件,而不会阻止页面其余部分的呈现。

        这种方法不仅可以加快网站的初始呈现速度,还可以降低脚本缓慢或无响应导致延迟的风险。

        通过使用 async 和 defer 属性,您可以控制 JavaScript 文件的加载和执行行为。

图片

02)、使用 Async 和 Defer 属性

async 和 defer 属性可以添加到 <script> 标签以启用异步加载:

  • ·async:async 属性告诉浏览器在不阻塞渲染的情况下下载脚本。下载脚本后,浏览器将暂停渲染以执行它。这对于不依赖于其他脚本或完全加载 DOM 的脚本很有用。

  • ·defer:defer 属性指示浏览器在不阻塞渲染的情况下下载脚本,但会延迟执行直到 DOM 被完全解析。这对于依赖于 DOM 或其他脚本的脚本很有用。

重要的是要注意这些属性只能与外部脚本文件一起使用,因为它们对内联脚本没有影响。

03)、JavaScript 代码示例:异步和延迟用法

让我们看一个在 HTML 文件中使用 async 和 defer 属性的例子:​​​​​​​

<!DOCTYPE html>
<html>
<head>
  <!-- Using the defer attribute -->
  <script src="main.js" defer></script>
</head>
<body>
  <!-- Using the async attribute -->
  <script src="analytics.js" async></script>
</body>
</html>

        在此示例中,main.js 加载了 defer 属性,确保它不会阻塞渲染,并在 DOM 完全解析后执行。同时,analytics.js 加载了 async 属性,允许它独立于页面的其余部分下载和执行。

        通过为你的 JavaScript 文件利用异步加载,您可以最大限度地减少渲染阻塞资源并提高您网站的性能和用户体验。

08、采用最佳实践来缩短加载时间并改进用户体验

        网站优化是一个持续的过程,为了最大限度地提高性能,必须跟上最新的最佳实践。

01)、代码拆分

        代码拆分是一种技术,涉及将 JavaScript 代码分解成更小、更易于管理的块,这些块仅在需要时加载。这减少了需要下载和解析的代码量,从而缩短了初始加载时间并使交互更加流畅。代码拆分对于单页应用程序 (SPA) 和具有复杂功能的大型网站特别有用。

图片

有几个工具可以帮助实现代码拆分,例如 Webpack 和 React.lazy:

  • ·Webpack:这个流行的捆绑器提供对代码拆分的内置支持。使用其动态 import() 函数,您可以按需加载 JavaScript 模块,减少初始加载时间。

  • ·React.lazy:如果您使用的是 React,React.lazy 函数可让您在需要时延迟加载组件,从而进一步优化您的应用程序。

  • ·bit:越来越多的工程团队正在采用微前端作为将大型项目代码拆分为独立组件的一种方式。

02)、JavaScript 代码示例:实现代码拆分

下面是使用 Webpack 和 React 进行代码拆分的示例:​​​​​​​

// Importing the React and React.lazy libraries
import React, { lazy, Suspense } from 'react';

// Loading the component lazily using React.lazy
const MyComponent = lazy(() => import('./MyComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <MyComponent />
      </Suspense>
    </div>
  );
}

export default App;

在此示例中,MyComponent 在需要时延迟加载,防止它阻塞应用程序的初始呈现。

03)、使用内容分发网络 (CDN)

        内容分发网络 (CDN) 是一种通过在全球多个服务器上分发你的内容来提高网站性能的强大方式。

        这确保用户可以从靠近其位置的服务器访问您网站的资源,从而减少延迟并加快加载时间。将你的网站与 CDN 集成可以极大地改善用户体验,尤其是对于地理位置较远的用户。

04)、优化 DOM 操作和事件处理

        高效的 DOM 操作对于提高网站性能至关重要。文档对象模型 (DOM) 表示网页的结构,对其进行操作可能会占用大量资源。通过优化用于 DOM 操作的 JavaScript 代码,您可以最大限度地减少性能影响并创建更流畅的用户体验。

05)、JavaScript 代码示例:高效的 DOM 操作

下面是优化 DOM 操作的示例:​​​​​​​

// Inefficient DOM manipulation
const list = document.querySelector('#list');

for (let i = 0; i < 1000; i++) {
  const item = document.createElement('li');
  item.textContent = `Item ${i}`;
  list.appendChild(item);
}

// Efficient DOM manipulation
const list = document.querySelector('#list');
const fragment = document.createDocumentFragment();

for (let i = 0; i < 1000; i++) {
  const item = document.createElement('li');
  item.textContent = `Item ${i}`;
  fragment.appendChild(item);
}

list.appendChild(fragment);

        在高效示例中,我们使用 DocumentFragment 来批处理 DOM 操作,减少回流和重绘的次数,并提高性能。

06)、浏览器开发者工具

        大多数现代浏览器都带有内置的开发人员工具,可以帮助你监控和优化网站的性能。

        例如,Chrome DevTools 和 Firefox Developer Tools 提供性能分析、网络监控和 JavaScript 调试等功能。通过使用这些工具,你可以确定代码中的瓶颈和需要改进的地方。

07)、在线工具

还有一些在线工具可以帮助你分析和优化你的网站性能。一些受欢迎的选项包括:

  • ·Google PageSpeed Insights:此工具分析您的网站并提供改进其性能的建议。它考虑了服务器响应时间、图像优化和 JavaScript 加载技术等因素。

  • ·WebPageTest:WebPageTest 是一款综合性能测试工具,可提供有关网站加载时间、呈现等的详细信息。您还可以将您网站的性能与其他网站进行比较,或者从不同的位置和设备运行测试。

        通过了解最新的最佳实践并监控你网站的性能指标,可以确保你的网站保持快速、高效和用户友好。

总结

        在今天的文章中,我分享了几种 JavaScript 优化技术,以帮助你提高网站的性能和用户体验。从最小化文件大小和减少网络请求到利用缓存和异步加载,这些方法都可以对你网站的加载时间产生重大影响。

        我希望你能发现本指南内容丰富且有用。同时,也欢迎你在留言区中分享你关于 JavaScript 优化的想法、经验和问题。让我们互相学习,共同学习,共同不断提高我们网站的性能!

        最后,感谢你的阅读,编程愉快!

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

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

相关文章

OWASP常见Web安全漏洞

OWASP&常见Web安全漏洞 一、OWASP介绍二、OWASPTOP10与常见漏洞讲解2.1、OWASP Top10 2013 VS 20172.2、OWASP Top10 20212.3、A1&#xff1a;2017 注入2.3.1、SQL注入攻击2.3.2、命令注入攻击 2.4、A2&#xff1a;2017失效的身份认证&#xff08;业务逻辑漏洞&#xff09;…

Linux——动静态库的制作和使用超详细(实操+代码+原理介绍)

动静态库的制作和使用 1️⃣.动静态库介绍&#x1f3c0;静态库⚽️动态库&#x1f3c8;区别&#x1f3d0;使用动态库的优点包括&#xff1a;&#x1f3c9; 使用静态库的优点包括&#xff1a; 2️⃣静态库的制作&#x1f34a;Q:库文件能不能有main()函数&#xff1f;&#x1f34…

clickhouse基础数据类型 语法及使用可视化数据库工具 DBeaver

新建一个名为 test 的数据库&#xff1a;右击数据库点击新增&#xff0c;然后创建一张 test &#xff0c;utf8mb4 字符的&#xff0c;点击确定 在 test 数据库下新建一张数据表&#xff0c;如下所示&#xff1a;右击表&#xff0c;然后点击新建表 鼠标放列上面&#xff0c;右键…

b站视频播放三倍速

目录 一、操作 一、操作 document.querySelector(video).playbackRate 31、F12或者在当前界面鼠标右击选择检查 打开开发者工具平台 2、在console界面执行document.querySelector(video).playbackRate 3 document.querySelector(video).playbackRate 3

vector模拟实现

目录 vector相关接口实现 使用memcpy拷贝问题 迭代器失效 引起失效的操作 指定位置元素的删除操作 ​编辑引起底层空间改变的操作 vector相关接口实现 template<typename T> class vector { public:typedef T* iterator;typedef const T* const_iterator; public:…

基于MSP432P401R跟随小车(一)【2022年电赛】

文章目录 一、赛前准备1. 硬件清单2. 工程环境 二、赛题思考三、软件设计1. 路程、时间、速度计算2. 距离测量3. 双机通信4. 红外循迹 四、技术交流 一、赛前准备 1. 硬件清单 主控板&#xff1a; MSP432P401R测距模块&#xff1a; GY56数据显示&#xff1a; OLED电机&#x…

MinUv2靶场详解

MinUv2靶场详解 这个靶场我学到了.bash_history文件&#xff0c;每个用户都有一个名为 .bash_history 的文件&#xff0c;它位于用户的主目录中&#xff0c;默认有500行最近执行的命令。 这个靶场我用vmware是不能打开的&#xff0c;用virtualBox就可以&#xff0c;并且打开时…

MySQL索引、事务

目录 索引 作用 查看索引 创建索引 删除索引 索引背后的数据结构 B树 B树 事务 事务的本质 事务的特性 并发执行事务产生的问题 脏读问题 不可重复读 幻读 MySQL中隔离级别 read uncommitted readcommitted repeatable read serializable 索引 索引的本质…

SolidUI AI生成可视化,0.1.0版本模块划分以及源码讲解

1.背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…

【Java虚拟机学习1】JVM运行时数据区

JVM运行时数据区 一、前言 我们知道Java程序是运行在JVM&#xff08;Java虚拟机&#xff09;上的&#xff0c;Java程序运行时会占用一定的内存&#xff0c;在虚拟机自动管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现…

指针进阶详解(下)

指针进阶详解&#xff08;下&#xff09; 前言1. 函数指针1.1 两端有趣代码 2. 函数指针数组2.1 函数指针数组的用途之一&#xff1a;转移表 3. 指向函数指针数组的指针4. 回调函数5. 结尾 前言 在指针进阶详解&#xff08;上&#xff09;中&#xff0c;我们已经介绍了部分指针…

基于数据安全的风险评估(三):风险分析与评估

完成了资产识别、脆弱性识别及威胁识别后&#xff0c;我们可以采用适当的方法和工具确定威胁利用脆弱性导致安全事件发生的可能性。综合安全事件作用资产价值及脆弱性的严重程度&#xff0c;判断事件造成的损失及对组织的影响&#xff0c;即安全风险。 一 风险计算形式及关键环…

HTTP协议对比HTTPS协议

HTTP协议对比HTTPS协议 1. HTTP协议1.1 概述1.2 HTTP协议格式1.3 HTTP协议支持的方法1.3.1 GET方法1.3.2 POST方法1.3.3 其他HTTP方法1.3.4 GET对比POST 1.4 请求报文1.4.1 Content-Type&#xff1a;请求体中数据格式1.4.2 Cookie&#xff1a;浏览器缓存 1.5 响应报文1.5.1 状态…

LED驱动(原始架构优化:分层/分离)——STM32MP157

文章目录 优化思想&#xff1a;分层Demo的LED驱动程序led_opr.hboard_demo.cleddrv.cledtest.cMakefile编译测试 STM32MP157的LED驱动程序board_stm32mp157.cleddrv.cled_opr.hMakefiel编译测试 优化思想&#xff1a;分离Demo的LED驱动程序led_resource.hboard_A_led.cchip_dem…

MacOS系统(M1/M2)安装AI绘画StableDiffusion保姆级教程

TOC 安装完成后&#xff0c;推荐阅读这篇教程&#xff1a;AI绘画&#xff1a;Stable Diffusion 终极炼丹宝典&#xff1a;从入门到精通 实操环境&#xff1a; macOS 13 Arm64&#xff08;建议12以上的系统使用&#xff09; Apple M1 先来看几个样例&#xff1a; AI绘画S…

goland自定义代码模版

在 GoLand 中我们既可以修改已有代码模版&#xff0c;也可以新建属于我们自己的代码模版&#xff0c;按需配置。 一、修改已有代码模版 现在代码编辑页输入你想更改的代码模版&#xff0c;然后点击右下角的小灯泡按钮&#xff0c;接着选中编辑活动模版设置即可。 二、新建…

[机缘参悟-99] :关于局部最优与全局最优解的人生感悟

在没有获取全局信息之前&#xff0c;要获得全局最优解几乎是不可能的&#xff0c;最多是概率大一点而已&#xff0c;大多数时候&#xff0c;由于时空资源的限制&#xff0c;获得往往是局部最优解&#xff0c;局部最优解&#xff0c;放在全局&#xff0c;往往并非全局最优&#…

数学专题训练3 数论1

1. Problem - 27E - Codeforces 给定 n ( 1 ≤ n ≤ 1000 ) n(1 \le n \le 1000) n(1≤n≤1000)​​​&#xff0c;找到因子个数恰好为 n n n​​​ 个的最小正整数. 保证答案不大于 1 e 18 1e18 1e18. 和 反素数 的思路是一样的&#xff0c;深搜 这个是枚举当前数字可以…

Shiro反序列化漏洞(CVE-2016-4437)+docker靶场+工具利用

一、Shiro反序列化漏洞-CVE-2016-4437原理 将java对象转换为字节序列&#xff08;json/xml&#xff09;的过程叫序列化&#xff0c;将字节序列&#xff08;json/xml&#xff09;恢复为java对象的过程称为反序列化。 Shiro框架提供了“记住我”的功能&#xff0c;用户登陆成功…

JPA 概述及常用注解详解、SpringDataJpa 使用指南

JPA&#xff08;Java Persistence API&#xff09;是 Java 标准中的一套ORM规范&#xff08;提供了一些编程的 API 接口&#xff0c;具体实现由 ORM 厂商实现&#xff0c;如Hiernate、TopLink 、Eclipselink等都是 JPA 的具体实现&#xff09;&#xff0c;借助 JPA 技术可以通过…