JS进阶01-异步编程、跨域、懒加载
目录
一、异步编程
1.1.异步编程的基本概念与重要性
1.2.事件循环(Event Loop)机制
1.3.JavaScript异步编程的常见方式及详解
示例
1.4.异步编程的最佳实践
二、跨域
2.1.什么是跨域
2.2.怎么解决跨域
1. JSONP(JSON with Padding)
2. CORS(Cross-Origin Resource Sharing)
3. 反向代理/Nginx反向代理
4. WebSocket
5. postMessage
6. Node.js中间件代理
三、懒加载
1. 懒加载原理
2. 懒加载思路及实现
3. 图片的懒加载
案例
一、异步编程
1.1.异步编程的基本概念与重要性
异步编程是一种编程方式,它允许程序在等待某些操作(如网络请求、文件读取、定时器等)完成的同时,继续执行其他任务。这种编程方式可以显著提高程序的执行效率,特别是在处理I/O密集型任务时表现出色。
在JavaScript中,由于它是单线程语言,即同一时间只能执行一个任务,因此异步编程显得尤为重要。如果使用同步编程模型来处理需要大量时间的任务,会阻塞整个线程,导致页面或程序卡顿。而异步编程则可以让程序在执行这些长时间任务时,继续执行其他代码,从而优化用户体验。
1.2.事件循环(Event Loop)机制
1.事件循环(Event Loop):
JavaScript的执行环境是单线程的,这意味着它同一时间只能执行一个任务。
事件循环是JavaScript实现异步编程的核心机制。它包含一个执行栈(Call Stack)和一个或多个任务队列(Task Queue)。
执行栈用于执行同步代码,而任务队列则用于存放异步任务的回调函数。
当执行栈为空时,事件循环会从任务队列中取出任务并执行。
2.任务类型:
宏任务(Macro Task):如setTimeout、setInterval、I/O操作等。
微任务(Micro Task):如Promise的回调、process.nextTick等。
微任务的优先级高于宏任务。在每一次事件循环中,执行栈中的任务执行完毕后,会先检查微任务队列,执行所有微任务,再执行下一个宏任务。
1.3.JavaScript异步编程的常见方式及详解
1、回调函数(Callback Functions)
回调函数是最早的异步处理方式。它通过将一个函数作为参数传递给另一个函数,在异步任务完成后调用该函数来处理结果。
回调函数的优点是简单易懂,但在处理多个异步任务时,会导致回调函数嵌套过多,形成“回调地狱”,使代码难以维护和理解。
2、Promise对象
Promise是ES6引入的一种异步编程解决方案,它是一个表示未来某个事件(通常是一个异步操作)的结果的对象。
Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。状态一旦改变就不能再变。
Promise对象提供了then()和catch()方法来处理异步操作的结果和异常。then()方法用于处理成功的情况,catch()方法用于处理失败的情况。
Promise支持链式调用,可以避免回调地狱,使代码更加简洁易读。
Promise.all()和Promise.race()是Promise对象的两个静态方法。
Promise.all()接受一个包含多个Promise的数组,并返回一个新的Promise。当所有Promise都完成时,这个Promise才会完成;如果其中有一个Promise失败,Promise.all()会立即失败。
Promise.race()则只要数组中的任意一个Promise完成或失败,就会立即完成或失败。
有关promise的更详细讲解在ES6基础知识
https://blog.csdn.net/m0_64455070/article/details/143714359
3、async/await
async/await是基于Promise的语法糖,是ES2017引入的用于处理异步代码的方式。
async用来声明一个异步函数,该函数会隐式地返回一个Promise。
await只能在async函数内部使用,用于等待一个Promise的完成。它返回的是Promise成功的结果值,如果Promise失败,则抛出异常。
async/await使得异步代码看起来像是同步的,提高了代码的可读性和可维护性。它避免了回调地狱,并且错误处理更加方便。
有关async/await更详细讲解在本文作者的ES6基础知识
https://blog.csdn.net/m0_64455070/article/details/143714359
示例
以下是一个使用async/await实现异步网络请求的示例代码:
async function fetchData(url) {try {const response = await fetch(url); // 等待fetch函数的Promise完成if (!response.ok) {throw new Error('Network response was not ok');}const data = await response.json(); // 等待响应的JSON数据解析完成return data;} catch (error) {console.error('Fetch error:', error);throw error; // 将错误抛出给调用者处理}
}// 使用 async/await 处理异步请求结果
(async () => {try {const data = await fetchData('https://api.example.com/data');console.log('Request succeeded:', data);} catch (error) {console.error('Request failed:', error);}
})();
在这个示例中,fetchData函数是一个异步函数,它使用await关键字等待fetch函数的Promise完成,并获取响应的JSON数据。然后,我们使用一个立即执行的异步函数来调用fetchData函数,并处理异步请求的结果。如果请求失败,则捕获异常并打印错误信息。
1.4.异步编程的最佳实践
避免回调地狱:使用Promise或async/await来避免回调地狱,使代码更加简洁易读。
错误处理:在异步代码中添加适当的错误处理逻辑,以确保程序的健壮性。
代码可读性:使用有意义的函数名和变量名,以及适当的注释来提高代码的可读性。
性能优化:避免不必要的异步操作,以减少资源消耗和提高程序性能。
二、跨域
2.1.什么是跨域
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。在Web开发中,由于同源策略(Same-Origin Policy)的限制,浏览器默认不允许跨域请求。如果尝试进行跨域请求,浏览器会抛出安全错误。
什么是同源策略?
同源策略是一种安全功能,它要求协议、域名和端口三者必须相同,才允许访问资源。
2.2.怎么解决跨域
1. JSONP(JSON with Padding)
原理:
JSONP是一种通过<script>标签实现跨域请求的技术。由于<script>标签不受同源策略的限制,可以加载其他域的JavaScript文件。
优点:
兼容性好,可以解决主流浏览器的跨域问题
缺点:
仅支持GET请求。
不安全,可能遭受XSS攻击。
实现步骤
JSONP的工作流程如下:
前端:动态创建一个
<script>标签,并设置其src属性为跨域的URL,同时在URL中传入一个回调函数名(如callback=myFunction)。后端:服务器接收到请求后,将返回的数据作为回调函数的参数,并包装成JavaScript代码返回(如
myFunction({"key":"value"}))。前端:当浏览器加载这段JavaScript代码时,会自动调用回调函数
myFunction,从而实现跨域数据传输。
但JSONP只能发送GET请求,且存在安全风险,容易受到XSS攻击。
2. CORS(Cross-Origin Resource Sharing)
原理
CORS是一种由服务器设置响应头来允许跨域请求的机制。服务器通过设置特定的HTTP响应头,如Access-Control-Allow-Origin,来指定哪些域名或IP地址可以跨域访问资源。
优点
灵活,可以细粒度地控制哪些源可以访问资源。
前端无需配置,只需后端设置响应头。
缺点
需要服务器支持
实现步骤
前端:无需特殊配置,只需发送跨域请求即可。
后端:服务器需要在响应头中设置Access-Control-Allow-Origin等CORS相关的头部字段。
CORS支持所有类型的HTTP请求,且安全性较高,是跨域请求的推荐解决方案。但需要注意的是,CORS需要服务器和浏览器同时支持才能实现。
3. 反向代理/Nginx反向代理
原理
反向代理是一种在服务器端设置代理服务器,将前端的跨域请求转发到目标服务器,并将目标服务器的响应返回给前端的技术。Nginx是一种常见的反向代理服务器。
优点
解决跨域问题:通过反向代理,前端可以与目标服务器进行跨域通信,而无需修改前端代码。
安全性:反向代理可以作为一道安全屏障,隐藏目标服务器的真实地址,防止直接攻击。
负载均衡:在大型应用中,反向代理可以将请求分发到多个目标服务器,实现负载均衡,提高系统的可用性和性能。
缓存:反向代理可以缓存目标服务器的响应,减少对目标服务器的请求次数,提高响应速度。
缺点
配置复杂性:反向代理需要服务器端的配置和管理,这可能需要一定的技术知识和经验。
单点故障:如果反向代理服务器出现故障,整个系统可能会受到影响,导致服务中断。
性能瓶颈:虽然反向代理可以提高性能,但在高并发场景下,它也可能成为性能瓶颈。
实现步骤
前端:无需特殊配置,只需发送请求到反向代理服务器即可。
后端:需要在服务器端(如Nginx)配置反向代理规则,将请求转发到目标服务器。
通过反向代理,前端可以认为是在与同源服务器通信,从而绕过浏览器的同源策略限制。但需要注意的是,反向代理需要服务器端的配置和管理。
4. WebSocket
原理
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。它默认支持跨域请求,可以在客户端和服务器之间建立持久的连接,并通过该连接进行实时数据传输。
优点
支持全双工通信,实时性好。
不受同源策略限制。
缺点
需要服务器支持WebSocket协议。
可能存在性能问题,如页面建立多个WebSocket连接。
实现步骤
前端:使用WebSocket API(如new WebSocket('ws://example.com/socket'))建立连接。
后端:服务器需要支持WebSocket协议,并处理连接和数据传输。
WebSocket适用于需要实时通信或双向通信的场景,如聊天室、实时数据监控等。
5. postMessage
原理
postMessage是HTML5中提供的一个API,用于在不同窗口、标签页或iframe之间进行跨域通信。
优点
安全,可以通过origin参数控制消息的来源。
支持复杂的通信场景,如跨域iframe之间的通信。
缺点
需要双方配合实现。
实现步骤
前端:使用window.postMessage方法发送消息到目标窗口或iframe。
接收端:目标窗口或iframe需要监听message事件,并处理接收到的消息。
postMessage适用于不同窗口之间的通信,如父子窗口、跨域iframe等。但需要在接收端进行安全验证以防止恶意攻击。
6. Node.js中间件代理
原理
当前端发送跨域请求到Node.js服务器时,Node.js服务器使用中间件拦截并处理这些请求。中间件可以检查请求的头信息、参数等,并根据配置将请求转发到目标服务器。目标服务器处理请求后,将响应返回给Node.js服务器,Node.js服务器再将响应转发给前端。通过这种方式,Node.js服务器作为中间层,实现了跨域通信。常见的中间件有cors、http-proxy-middleware等。
优点
灵活性:Node.js中间件代理可以灵活地处理跨域请求,并与其他Node.js应用集成。
易于配置:与Nginx等反向代理服务器相比,Node.js中间件代理的配置通常更加简单和直观。
可扩展性:Node.js中间件代理可以轻松地与其他中间件和路由集成,实现更复杂的功能。
缺点
性能:与Nginx等高性能反向代理服务器相比,Node.js中间件代理的性能可能稍逊一筹。
资源消耗:Node.js中间件代理需要额外的资源来运行和处理请求,这可能会增加服务器的负载。
维护成本:与Nginx等成熟的反向代理服务器相比,Node.js中间件代理可能需要更多的维护和支持
实现步骤
前端:发送请求到Node.js服务器。
后端:Node.js服务器使用中间件拦截并处理跨域请求,将请求转发到目标服务器,并将响应返回给前端。
Node.js中间件代理需要服务器端的配置和管理,但可以灵活地处理跨域请求,并与其他Node.js应用集成。
三、懒加载
1. 懒加载原理
懒加载,即按需加载或延迟加载,是指当页面或应用中的某些资源(如图片、视频、数据等)在需要时才进行加载,而不是在页面初始化时一次性加载所有资源。这种技术的核心原理是减少初始加载时间和网络流量,提高页面响应速度和用户体验。
懒加载的原理主要基于以下几点:
按需加载:只加载用户当前需要或即将需要的资源,避免加载无用资源。
异步加载:将资源的加载推迟到用户需要使用时再进行,不阻塞用户界面的渲染。
动态加载:根据用户的行为和需求,动态地生成和加载页面内容或资源。
2. 懒加载思路及实现
- 确定需要懒加载的资源:根据页面或应用的需求,确定哪些资源可以或应该进行懒加载。
- 设置占位符:在资源实际加载之前,使用占位符(如低分辨率图片、默认图标等)来占据资源的位置。
- 监听用户行为:通过事件监听(如滚动事件、点击事件等)来检测用户何时需要加载资源。
- 加载资源:当用户需要资源时,触发加载逻辑,从服务器获取资源并替换占位符。
懒加载的实现方式有多种,包括但不限于:
- 图片懒加载:通过监听滚动事件和判断图片是否进入可视区域来实现图片的延迟加载。
- 视频懒加载:在视频播放器进入用户视野或用户点击播放按钮时才开始加载视频内容。
- 数据懒加载:在用户滚动到页面底部或进行分页操作时,加载更多的数据。
3. 图片的懒加载
图片的懒加载是懒加载技术中最常见的应用之一。
步骤:
在HTML中为需要懒加载的图片设置占位符,并使用自定义属性(如data-src)存储真实图片的路径。
在JavaScript中监听滚动事件,判断图片是否进入可视区域。
当图片进入可视区域时,将占位符替换为真实图片
// 获取页面中的所有懒加载图片
var imgs = document.querySelectorAll('img[data-src]');// 监听滚动事件
window.addEventListener('scroll', function() {// 遍历所有懒加载图片imgs.forEach(function(img) {// 判断图片是否进入可视区域if (isImageInViewport(img)) {// 替换占位符为真实图片img.src = img.getAttribute('data-src');// 移除data-src属性,避免重复加载img.removeAttribute('data-src');}});
});// 判断图片是否进入可视区域的函数
function isImageInViewport(img) {var rect = img.getBoundingClientRect();var inViewport = (rect.top >= 0 &&rect.left >= 0 &&rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&rect.right <= (window.innerWidth || document.documentElement.clientWidth));return inViewport;
}
现代浏览器支持:
现代浏览器(如Chrome、Firefox、Safari等)通常支持图片的懒加载属性。可以在<img>标签中使用loading="lazy"属性来告诉浏览器延迟加载图片,直到它们出现在视口中。
例如:<img src="placeholder.jpg" data-src="real-image.jpg" loading="lazy" alt="Description">
案例
1. 图片懒加载(使用JavaScript和Intersection Observer API)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Image Lazy Load Example</title>
<style>.lazy-load {opacity: 0;transition: opacity 0.3s;}.lazy-load.loaded {opacity: 1;}
</style>
</head>
<body><!-- 图片列表,使用 data-src 属性存储真实图片 URL -->
<img class="lazy-load" data-src="image1.jpg" alt="Image 1">
<img class="lazy-load" data-src="image2.jpg" alt="Image 2">
<img class="lazy-load" data-src="image3.jpg" alt="Image 3">
<!-- ...更多图片... --><script>// 获取所有需要懒加载的图片const lazyImages = document.querySelectorAll('.lazy-load');// 创建 Intersection Observer 实例const observer = new IntersectionObserver((entries) => {entries.forEach(entry => {if (entry.isIntersecting) {// 当图片进入可视区域时,加载图片const img = entry.target;img.src = img.dataset.src;img.classList.add('loaded');// 停止观察这个图片observer.unobserve(img);}});});// 开始观察每个图片lazyImages.forEach(img => {observer.observe(img);});
</script></body>
</html>
2. 视频懒加载(使用JavaScript和事件监听)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Video Lazy Load Example</title>
</head>
<body><!-- 视频列表,使用 data-src 属性存储视频 URL -->
<div class="video-container"><video class="lazy-load" controls><source data-src="video1.mp4" type="video/mp4">Your browser does not support the video tag.</video>
</div>
<div class="video-container"><video class="lazy-load" controls><source data-src="video2.mp4" type="video/mp4">Your browser does not support the video tag.</video>
</div>
<!-- ...更多视频... --><script>// 获取所有需要懒加载的视频const lazyVideos = document.querySelectorAll('.lazy-load video');// 为每个视频容器添加点击事件监听器lazyVideos.forEach(videoContainer => {const video = videoContainer.querySelector('video');const source = video.querySelector('source');videoContainer.addEventListener('click', () => {// 当视频容器被点击时,加载视频video.src = source.dataset.src;video.load(); // 触发浏览器加载视频资源// 移除 data-src 属性,避免重复加载source.removeAttribute('data-src');// 移除点击事件监听器,避免重复操作videoContainer.removeEventListener('click', arguments.callee);});});
</script></body>
</html>
3. 数据懒加载(使用JavaScript和滚动事件监听)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Data Lazy Load Example</title>
<style>#content {max-height: 400px;overflow-y: auto;}.item {padding: 10px;border-bottom: 1px solid #ccc;}
</style>
</head>
<body><div id="content"><!-- 初始内容 --><div class="item">Item 1</div><div class="item">Item 2</div><!-- ...更多初始内容... --><!-- 占位符,用于加载更多内容 --><div id="load-more">Load More</div>
</div><script>let currentPage = 1; // 当前页码// 为“加载更多”按钮添加点击事件监听器document.getElementById('load-more').addEventListener('click', () => {loadMoreData(currentPage);currentPage++; // 更新页码});// 滚动事件监听器,当用户滚动到底部时自动加载更多数据window.addEventListener('scroll', () => {const content = document.getElementById('content');const loadMore = document.getElementById('load-more');const bottomOfWindow = window.scrollY + window.innerHeight === document.body.offsetHeight;const bottomOfContent = content.scrollTop + content.clientHeight >= content.scrollHeight - 10; // 减去10是为了避免因为滚动条或内容高度计算误差导致的重复加载if (bottomOfWindow || bottomOfContent) {loadMoreData(currentPage);currentPage++; // 更新页码// 可以选择隐藏或禁用“加载更多”按钮,直到新数据加载完成loadMore.style.display = 'none';}});// 模拟加载更多数据的函数function loadMoreData(page) {setTimeout(() => {const content = document.getElementById('content');const loadMore = document.getElementById('load-more');// 清除之前的占位符(如果存在)if (loadMore.style.display === 'none') {loadMore.style.display = 'block';}// 创建新的内容项并添加到页面中for (let i = 0; i < 5; i++) {const newItem = document.createElement('div');newItem.className = 'item';newItem.textContent = `Item ${(page - 1) * 5 + i + 3}`; // 假设每页加载5个项,从Item 3开始content.appendChild(newItem);}}, 1000); // 模拟网络延迟,设置为1秒}
</script></body>
</html>
相关文章:
JS进阶01-异步编程、跨域、懒加载
目录 一、异步编程 1.1.异步编程的基本概念与重要性 1.2.事件循环(Event Loop)机制 1.3.JavaScript异步编程的常见方式及详解 示例 1.4.异步编程的最佳实践 二、跨域 2.1.什么是跨域 2.2.怎么解决跨域 1. JSONP(JSON with Padding&…...
2012年 数模美赛 C题 犯罪克星
一、问题重述 银河犯罪建模中心(ICM)正在调查一个犯罪阴谋。调查人员已经识别出一些阴谋成员,但希望在逮捕之前确定其他成员和领导人。所有嫌疑人和可能的同谋者都受雇于同一家公司,并在一个大的综合办公室里工作。该公司正在开发…...
社区团购中 2+1 链动模式商城小程序的创新融合与发展策略研究
摘要:本文聚焦于社区团购这一新兴零售模式的发展态势,深入探讨 21 链动模式商城小程序与之融合的创新机制与应用策略。通过剖析社区团购的运营模式、优势特点以及发展现状,结合 21 链动模式商城小程序的功能特性,研究二者协同作用…...
【Go底层】time包Ticker定时器原理
目录 1、背景2、go版本3、源码解释【1】Ticker结构【2】NewTicker函数解释 4、代码示例5、总结 1、背景 说到定时器我们一般想到的库是cron,但是对于一些简单的定时任务场景,标准库time包下提供的定时器就足够我们使用,本篇文章我们就来研究…...
RoBERTa- 稳健优化的 BERT 预训练模型详解
一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...
【C++】continue语句、goto语句
1、continue 语句 作用:在循环语句中,跳过本次循环中余下尚未执行的语句。继续下一次循环。 注意:continue只能用于循环中。 示例: 代码: //continue的用法 #include<iostream> using namespace std; int ma…...
postgresql与pgvector安装与使用
环境变量修改 打开 .bashrc 文件进行编辑: vim ~/.bashrc在文件的末尾添加上面的环境变量配置 # 添加 PostgreSQL 可执行文件路径到系统 PATH export PATH/home/....../pg/postgresql-12.4/bin:$PATH# 设置 PostgreSQL 数据目录 export PGDATA/home/....../pg/pos…...
开箱即用,阿里开源!专业AI 聊天界面工具包:Ant Design X
Ant Design X是一个基于Ant Design体系的创新解决方案,为构建高效的AI交互界面提供了便利和支持。从精细的原子组件到快速集成的模型服务,Ant Design X让开发者能轻松应对各种需求。本文将结合实际场景,展示Ant Design X的功能与使用方法。 为…...
详解版本控制工作原理及优势,常见的版本控制系统对比(HelixCore、Git、SVN等)
什么是版本控制软件?从基础层面来说,版本控制(也可称版本管理)就是随时间跟踪和管理文件变更的过程,而版本控制软件有助于实现这一过程的自动化。但这仅仅是其功能及其重要性的开端。 什么是版本控制? 版本…...
Vue2 vs Vue3:核心原理与性能优化详解
Vue2 vs Vue3:核心原理与性能优化详解 Vue.js 是目前主流的前端框架之一,随着 Vue3 的发布,框架内部的实现和使用方式都发生了显著变化。本文将从 Vue2 和 Vue3 的核心实现原理出发,详细解析两者的区别,并分析 Vue3…...
Qt+GDAL属性计算软件开发记录
一.GDAL添加字段 void MainWindow::addField(QString fieldName){OGRFieldDefn * fieldDefn new OGRFieldDefn(fieldName.toStdString().c_str(), OFTInteger);ly->CreateField(fieldDefn);srand((int)time(NULL));while (true){OGRFeature * feature ly->GetNextFeat…...
在超表面中琼斯矩阵的使用
琼斯矩阵(Jones Matrix) 是一种线性代数方法,用于描述光的偏振状态和偏振变化,是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用,尤其是在设计和调控光与物质相互作用时,例如偏振控制、相位调制…...
在macOS上从源码部署RAGFlow-0.14.1
一、macOS配置 1. macOS配置 我使用MacBook Pro,chip 是 Apple M3 Pro,Memory是18GB,macOS是 Sonoma 14.6.1。 2.安装Docker和Docker compose 官方要求 Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1,我的版本如下&#x…...
2-2-18-9 QNX系统架构之文件系统(二)
阅读前言 本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个…...
【经管数据】上市公司企业审计报告时滞数据、 年报披露时滞数据(2001-2022年)
测算方式:参考C刊《审计研究》窦笑晨(2022)老师的研究,从审计报告约定披露日期到审计报告实际披露日期之间的时间间隔。有关审计报告时滞的度量,现有研究大多采用资产负债表日与审计报告实际披露日期之间的间隔天数进行…...
debian ubuntu armbian部署asp.net core 项目 开机自启动
我本地的环境是 rk3399机器,安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库,但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…...
无人机地面遥控遥测技术与算法概述!
一、地面系统遥控检测核心技术 卫星遥测技术: 定义:卫星遥测技术是实现卫星与地面之间遥测数据传输的关键环节。 功能:传输卫星的状态信息、传感器采集的环境参数等。 关键技术: 调制解调技术:用于将数字遥测数据…...
游戏引擎学习第30天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中,重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾:在第30天,回顾了前一天的工作,并提到今天的任务是继续从第29天的代码开始,…...
Django drf 快速使用
1. 安装: pip install djangorestframework 2. 添加rest_framework到您的INSTALLED_APPS设置。 settings.pyINSTALLED_APPS [...rest_framework, ] 3. 定义模型 models.pyfrom django.db import modelsclass BookModel(models.Model):name models.CharField(max_length64)…...
机器学习介绍与实战:案例解析与未来展望
一、机器学习概述 1. 什么是机器学习? 机器学习(Machine Learning, ML)是一种通过数据训练模型,使计算机能够自动从经验中学习的技术。它旨在让计算机在没有显式编程的情况下,能够从数据中提取模式、进行预测或决策。…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
