找到
174
篇与
技术教程
相关的结果
-
QQ 邮箱如何获取 SMTP 授权码 + SMTP 使用教程 SMTP(Simple Mail Transfer Protocol)是用于发送电子邮件的协议。QQ 邮箱提供了 SMTP 服务,允许用户通过第三方客户端或应用程序发送邮件。为了确保账户安全,QQ 邮箱要求使用 SMTP 授权码而非邮箱密码进行身份验证。本文将详细介绍如何获取 SMTP 授权码,并提供使用教程。 图片 一、获取 QQ 邮箱 SMTP 授权码 登录 QQ 邮箱 打开浏览器,访问 QQ 邮箱官网:https://mail.qq.com。 输入您的 QQ 邮箱账号和密码,完成登录。 进入邮箱设置 登录后,点击页面右上角的“设置”按钮(齿轮图标)。 在设置菜单中,选择“账户”选项。 开启 SMTP 服务 在“账户”页面中,向下滚动找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务”部分。 找到“IMAP/SMTP 服务”选项,点击右侧的“开启”按钮。 获取授权码 开启 SMTP 服务后,系统会提示您通过手机验证身份。 按照页面提示,使用绑定的手机号发送指定短信内容到指定号码。 发送短信后,点击“我已发送”按钮,系统会生成一个 16 位的 SMTP 授权码。 请务必妥善保存此授权码,因为它只会显示一次。 图片 图片 图片 图片 二、SMTP 授权码的使用教程 获取 SMTP 授权码后,您可以将其用于配置第三方邮件客户端或应用程序(如 Outlook、Thunderbird、Foxmail 等)以发送邮件。以下是具体配置步骤: 1. 配置 Outlook 客户端 打开 Outlook,点击“文件” > “添加账户”。 输入您的 QQ 邮箱地址,选择“手动设置或其他服务器类型”,点击“下一步”。 选择“POP 或 IMAP”,点击“下一步”。 在服务器设置中,填写以下信息: 接收邮件服务器:imap.qq.com,端口:993,加密方式:SSL/TLS。 发送邮件服务器:smtp.qq.com,端口:465,加密方式:SSL/TLS。 在登录信息中,输入您的 QQ 邮箱地址和 SMTP 授权码。 点击“下一步”完成配置。 2. 配置 Thunderbird 客户端 打开 Thunderbird,点击“菜单” > “新建” > “现有邮件账户”。 输入您的 QQ 邮箱地址和 SMTP 授权码,点击“继续”。 Thunderbird 会自动检测服务器设置。如果没有自动检测成功,请手动填写以下信息: 接收邮件服务器:imap.qq.com,端口:993,加密方式:SSL/TLS。 发送邮件服务器:smtp.qq.com,端口:465,加密方式:SSL/TLS。 点击“完成”保存配置。 3. 配置 Foxmail 客户端 打开 Foxmail,点击“工具” > “账户管理”。 点击“新建”按钮,输入您的 QQ 邮箱地址和 SMTP 授权码。 选择“IMAP”或“POP3”作为接收服务器类型。 填写以下服务器信息: 接收邮件服务器:imap.qq.com,端口:993,加密方式:SSL/TLS。 发送邮件服务器:smtp.qq.com,端口:465,加密方式:SSL/TLS。 点击“确定”完成配置。 4. 配置其他应用程序 如果您需要在其他应用程序(如 WordPress、Python 脚本等)中使用 QQ 邮箱的 SMTP 服务,请确保填写以下信息: SMTP 服务器地址:smtp.qq.com 端口:465(SSL/TLS)或 587(STARTTLS) 用户名:您的 QQ 邮箱地址(如123456789@qq.com) 密码:SMTP 授权码 图片 三、注意事项 授权码的安全性 SMTP 授权码是您的邮箱账户的重要凭证,请勿泄露给他人。 如果怀疑授权码泄露,请立即在 QQ 邮箱设置中关闭 SMTP 服务并重新生成授权码。 授权码的有效性 SMTP 授权码长期有效,但如果您关闭了 SMTP 服务或重新生成授权码,旧的授权码将立即失效。 端口和加密方式 确保使用正确的端口和加密方式,否则可能导致无法发送邮件。 推荐使用端口465和SSL/TLS加密方式。 国际邮箱地址 如果您的 QQ 邮箱是国际邮箱(如xxx@foxmail.com),SMTP 服务器地址和配置步骤与普通 QQ 邮箱相同。 四、常见问题解答 为什么无法发送邮件? 检查 SMTP 服务器地址、端口和加密方式是否正确。 确保输入的 SMTP 授权码无误。 确认您的网络环境是否允许访问 QQ 邮箱的 SMTP 服务器。 如何重新生成 SMTP 授权码? 进入 QQ 邮箱的“账户”设置,关闭 SMTP 服务后重新开启,即可生成新的授权码。 SMTP 授权码和邮箱密码有什么区别? SMTP 授权码仅用于第三方客户端或应用程序的邮件发送功能,而邮箱密码用于登录 QQ 邮箱网页版或客户端。 通过以上步骤,您可以轻松获取 QQ 邮箱的 SMTP 授权码,并配置到各种邮件客户端或应用程序中。如果您在配置过程中遇到问题,可以参考 QQ 邮箱的官方帮助文档或联系客服支持。
-
少数人知道的 10 个神奇 CSS 选择器 在 Web 开发中,CSS 扮演着至关重要的角色,但很多开发者并没有真正发掘它的全部潜力! 大多数人熟悉 ID 选择器、类选择器或元素选择器,甚至伪元素的使用也很常见。然而,你知道 CSS 其实还有许多不为人知的强大选择器吗? 今天,就带你揭秘一些鲜有人知但却非常实用的 CSS 选择器,让你在样式控制上更上一层楼! 图片 1. 属性选择器 属性选择器可以根据 HTML 元素的属性来应用样式,而无需额外添加类或 ID。 基础属性选择器 a[href] { color: blue; }这个选择器会为所有包含 href 属性的 <a> 元素添加蓝色字体样式。 指定属性值的选择器 input[type="text"] { border: 1px solid #ccc; }此规则仅作用于 type="text" 的输入框。 匹配部分属性值的选择器 /* 以某个值开头(^=) */ a[href^="https"] { color: green; } /* 以某个值结尾($=) */ a[href$=".pdf"] { color: red; } /* 包含某个值(*=) */ a[href*="example"] { color: orange; }这些选择器可以分别选中以 https 开头的链接、以 .pdf 结尾的链接,以及包含 example 关键字的链接,并应用不同的样式。 2. :nth-child() 选择器 该伪类选择器可以基于元素在其父元素中的位置来应用样式: li:nth-child(odd) { background-color: #f9f9f9; }这将使奇数序号的 <li> 元素具有不同的背景颜色。 3. :not() 选择器 想要排除某些特定元素?:not() 选择器可以帮你实现: button:not(.primary) { background-color: grey; }以上代码会为所有 不 具有 .primary 类的 <button> 按钮应用灰色背景。 4. :focus 选择器 提升用户体验和可访问性的一种方式是给获取焦点的元素添加样式: input:focus { outline: 2px solid blue; }当输入框获得焦点时,会显示一个蓝色的外边框。 5. ::before 和 ::after 伪元素 这两个伪元素可以在某个元素的前后插入内容,无需修改 HTML 结构: h1::before { content: "§ "; color: grey; } p::after { content: " (阅读更多)"; color: blue; }上面的示例会在所有 <h1> 标题前添加灰色的 "§ " 符号,并在每个 <p> 段落后面附加 "(阅读更多)" 的蓝色文本。 6. ::first-line 选择器 想让段落的首行样式有所不同?可以这样做: p::first-line { font-weight: bold; color: red; }这会让段落的首行变成 加粗 且 红色。 7. ::first-letter 选择器 如果你想让段落的首字母更具视觉吸引力,可以使用 ::first-letter: p::first-letter { font-size: 2em; color: green; }这样,所有段落的第一个字母都会被放大,并且颜色变成绿色。 8. :empty 选择器 这个选择器可以选中 没有子元素(包括文本内容)的 HTML 元素: div:empty { border: 1px dashed red; }这样,所有空的 <div> 元素都会带有红色虚线边框。 9. :checked 选择器 专门用于选中 复选框(checkbox) 或 单选按钮(radio) 的样式控制: input[type="checkbox"]:checked + label { font-weight: bold; }当复选框被选中时,相关的 <label> 标签会变成加粗字体。 10. 组合选择器 CSS 选择器可以组合使用,以实现更精准的样式控制。例如: a[href^="https"]:not([href*="example"])::after { content: " (安全)"; color: green; }这个规则会为 以 https 开头且不包含 "example" 关键字 的链接,在其后面添加绿色的 "(安全)" 标识。 结语 希望这篇文章能帮助你更好地理解 CSS 选择器的强大之处。如果你有什么喜欢的 CSS 选择器,欢迎在评论区分享!
-
【尚硅谷】鸿蒙应用开发 - 带源码课件 课程描述 本教程精心设计了一款精致而小巧的实战应用,贯穿整个学习过程,真正做到理论与实践相结合。课程内容从基础到高级,层层递进,全面覆盖鸿蒙应用开发的所有必备技能。通过图解抽象知识、丰富的案例和清晰的讲解,帮助学习者快速掌握鸿蒙应用开发的核心技术。 课程亮点 实战驱动:以实际应用案例为主线,贯穿整个学习过程,让学习更贴近实际开发需求。 内容全面:从基础概念到高级技能,系统化讲解鸿蒙应用开发的方方面面。 图解教学:通过图解方式解析抽象概念,降低学习难度,提升理解效率。 源码提供:附带完整源码课件,方便学习者随时查阅和实践。 课程价格 原价:199 元 免费提供:本资源为免费分享,无需付费即可获取。 资源链接 👉 点击这里获取课程资源 适合人群 对鸿蒙应用开发感兴趣的初学者 希望提升鸿蒙开发技能的中高级开发者 需要系统化学习鸿蒙开发的技术爱好者 学习建议 按照课程顺序逐步学习,打好基础后再深入高级内容。 结合源码课件进行实践,边学边练,巩固知识。 遇到问题时,可以参考图解和案例,快速解决问题。 代码示例 // 示例代码:鸿蒙应用开发中的简单页面跳转 public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); Button button = (Button) findComponentById(ResourceTable.Id_button); button.setClickedListener(component -> { present(new SecondAbilitySlice(), new Intent()); }); }
-
华为工程师带你实战C++:专业深度全面完整 本课程以实战为主,课上全部代码均为边讲边手敲,学完此套课程,可以达到一个 C++中高级开发者的水平。既适合于刚刚入门有一定的语言基础的人,也适合于有一定的开发经验的人。 864e1741579438.jpg图片 课程大纲 第 1 章:C++基础与提高 1-1 C++学习开山篇 1-2 C 到 C++类型安全增强 1-3 Cout 格式输出,函数重载初步 1-4 函数重载原理 1-5 C++运算符重载初步 1-6 C++函数默认参数 1-7 C++引用与提高 第 2 章:C++核心特性 2-1 Day1 回顾 2-2 Day1 回顾 2 2-3 C++中内存管理(NewDelete) 2-4 C++中内存管理 2(NewDelete) 2-5 C++内联函数(inline) 2-6 C++中强制类型转换 Cast 2-7 const 类型的补充 2-8 C++命名空间 2-9 C++命名空间 2 2-10 C++字符串类型 string 第 3 章:C++面向对象编程 3-1 Day2 回顾 3-2 Day2 作业解答 homework 3-3 C++封装特性一 3-4 C++封装特性二 3-5 C++封装特性三 3-6 C++类的构造器 Constructor 3-7 C++类的析构器 Destructor 3-8 构造析构练习(基于系统 string 类构造自己的 String 类) 第 4 章:C++高级特性 4-1 Day3 回顾 4-2 作业(C++链表封装) 4-3 自实现 String 类拷贝构造器 4-4 自实现 String 类赋值运算符重载 4-5 C++返回对象或引用的区别 4-6 String 类自我实现完结篇 4-7 用面向对象的思想实现闹钟 4-8 对象数组 4-9 类成员函数的存储 第 5 章:C++进阶 5-1 Day4 回顾 5-2 C++中 const 关键字修饰类 5-3 C++中 static 关键字修饰类 5-4 C++中 static 关键字修饰类 5-5 指向类成员(数据函数)的指针 5-6 指向类成员的指针练习 5-7 C++友元认识 5-8 实践友元 5-9 C++运算符重载初步 第 6 章:C++高级编程 6-1 Day5 回顾 6-2 单双目运算符重载 6-3 流输入输出运算符重载 6-4 运算符重载实践 6-5 类型转化 Cast 6-6 运算符重载提高篇 6-7 运算符重载提高篇 2 第 7 章:C++继承与多态 7-1 Day6 回顾 7-2 继承的意义,派生类构造 7-3 派生类的构造器 7-4 派生类的赋值重载 7-5 派生类的友元函数 7-6 派生类的析构器 7-7 C++继承一 7-8 C++继承二 7-9 C++多继承 第 8 章:C++多态与设计模式 8-1 Day7 回顾 8-2 C++多继承续 8-3 多态前提赋值兼容 8-4 多态与虚函数 8-5 多态与纯虚函数 8-6 基于多态的设计模式依赖倒置原则 8-7 基于多态的 cocos 游戏入口分析 8-8 基于多态的 cocos 游戏入口分析自实现 第 9 章:C++项目实战 9-1 Day8 回顾 9-2 基于多态的管理系统项目设计 1 9-3 基于多态的管理系统项目实现 2 9-4 多态实现原理深度剖析 9-5 基于多态的管理系统项目设计多态常见问题解答 9-6 运行时类型信息 RTTI(typeid)应用 9-7 运行时类型信息 RTTI(dynamic_cast)应用 9-8 C++模板 第 10 章:C++流与文件操作 10-1 Day9 回顾 10-2 C++流类综述 10-5 C++二进制文件读写 课程资料 Cplusplus 基础与提高.pdf:课程配套教材。 下载链接 百度网盘:隐藏内容,请前往内页查看详情 夸克网盘:隐藏内容,请前往内页查看详情 了解更多技术内容,请访问:6v6 博客
-
TLS 和 SSL 的区别 TLS 和 SSL 的区别 TLS(Transport Layer Security)和 SSL(Secure Sockets Layer)都是用于保护网络通信安全的协议,通常用于加密 Web 流量(如 HTTPS)。TLS 是 SSL 的继任者,目前是标准协议,而 SSL 已经过时。主要区别如下: 图片 1. 起源和历史 SSL(Secure Sockets Layer): 由 Netscape 在 1990 年代初期设计,经历了 SSL 1.0、2.0、3.0 版本 SSL 3.0 存在 POODLE 漏洞,已逐渐被淘汰 TLS(Transport Layer Security): 1999 年发布 TLS 1.0(基于 SSL 3.0),后续版本包括 TLS 1.1、1.2、1.3 TLS 1.3 是最新版本(2018 年发布) 2. 安全性 SSL: 存在已知漏洞(如 POODLE),SSL 3.0 已被视为不安全 TLS: 提供更强加密算法(如 AES、SHA-256),TLS 1.3 简化握手过程并减少攻击面 3. 协议版本 SSL 版本: SSL 1.0(未发布)、SSL 2.0(1995)、SSL 3.0(1996) TLS 版本: TLS 1.0(1999)、TLS 1.1、TLS 1.2(最常用)、TLS 1.3(2018) 4. 握手过程和性能 SSL: 复杂握手过程导致较高延迟 TLS: TLS 1.3 显著减少握手往返次数,提升性能 5. 兼容性 现代浏览器和服务器已不再支持 SSL TLS 1.2/1.3 是当前主流协议 6. 加密算法 SSL:支持 RC4 等不安全算法 TLS:支持更安全的 AES-GCM、ChaCha20 等算法 7. 实际应用 SSL:已完全淘汰 TLS:广泛用于 HTTPS、邮件加密、VPN 等场景 总结对比表 特性SSLTLS全称Secure Sockets LayerTransport Layer Security起源Netscape 1990sSSL 的继任者(1999)推荐版本无TLS 1.2/1.3安全性存在已知漏洞更强加密算法握手性能较慢更快(TLS 1.3 优化握手)当前使用情况已淘汰广泛使用
-
删除 node_modules 目录太慢了?教你快速删除 前言 大家好,我是易航,用最通俗易懂的话讲最难的知识点是我的座右铭,基础是进阶的前提是我的初心~ 在开发过程中,node_modules 文件夹常常会因为存放了大量的依赖包而变得庞大,尤其是在大型项目中。虽然 node_modules 是 Node.js 项目中不可或缺的一部分,但在一些特定的情况下,比如清理无用依赖或是重新安装依赖时,删除 node_modules 文件夹是一个常见的操作。然而,手动删除这么大的文件夹往往是一个耗时且效率低下的过程。对于开发者而言,如何快速有效地删除 node_modules 成为了一个常见的痛点。 这时,rimraf 工具就显得尤为重要,它可以替代rm -rf命令来递归删除文件夹,并且相较于手动删除,它提供了更高效的方式。 一、什么是 rimraf? rimraf 是一个 Node.js 库,用于递归地删除文件和目录,特别适用于删除 node_modules 这样的庞大文件夹。rimraf 在删除文件和文件夹时,采用了优化过的实现,特别能够提高大文件夹删除的效率。 与操作系统自带的 rm -rf 命令相比,rimraf 通过减少系统调用、避免进程挂起等方式,能够加快删除过程,尤其在 Windows 平台上表现尤为突出,因为 Windows 本身对于删除大量文件的支持不如类 Unix 系统。 二、为什么手动删除 node_modules 这么慢? 在大型 Node.js 项目中,node_modules 文件夹可能包含上万个文件和子文件夹。由于 node_modules 文件夹结构的复杂性和深度,手动删除该文件夹需要操作系统一次性处理大量的文件删除操作。在这种情况下,操作系统的文件系统(如 macOS 的 HFS+ 或 Windows 的 NTFS)可能会出现延迟,导致删除过程非常缓慢。 图片 1. 操作系统的文件系统限制 操作系统的文件系统并没有针对大规模删除优化。例如,当你使用文件资源管理器删除文件时,它实际上是逐一标记每个文件为删除状态,并且还会消耗大量的资源来更新文件索引。这对于 node_modules 这种成千上万个文件的文件夹来说,执行起来非常低效。 2. 文件系统缓存和索引 文件操作系统通常会保持一定的缓存和索引记录,以便加速文件的读写和删除过程。然而,当需要删除大量文件时,这些缓存和索引会成为瓶颈,导致删除变得缓慢。 三、如何使用 rimraf 加速删除过程? rimraf 是一个专为递归删除大文件夹设计的工具,它通过优化删除过程中的一些细节,避免了文件系统缓存和索引的限制,使得删除过程更加高效。使用 rimraf 删除 node_modules 的步骤非常简单,以下是详细的操作流程。 1. 安装 rimraf 首先,我们需要在项目中安装 rimraf。可以通过 npm 或 yarn 来安装它。打开你的命令行,进入到你的项目目录下,执行以下命令: npm install rimraf --save-dev或者使用 yarn: yarn add rimraf --dev2. 在命令行中使用 rimraf 安装完成后,你可以在命令行中直接使用 rimraf 来删除 node_modules 文件夹。以下是使用 rimraf 删除 node_modules 的命令: npx rimraf node_modules3. 在 package.json 中配置脚本 为了简化操作,可以将删除命令添加到 package.json 中的 scripts 部分: { "scripts": { "clean": "rimraf node_modules" } }然后运行: npm run clean4. 使用 rimraf 加速其他删除操作 除了删除 node_modules,rimraf 还可以删除其他大文件夹: npx rimraf build四、rimraf 的优势 跨平台兼容:支持 Linux、macOS 和 Windows。 高效删除:针对大规模文件删除优化,速度显著提升。 易于使用:通过命令行或脚本配置即可快速操作。 与包管理工具集成:无缝配合 npm、yarn 使用。 五、总结 rimraf 是一个轻量级、高效且跨平台的工具,特别适合快速删除 node_modules 等大型文件夹。通过优化删除流程,它能显著提升开发效率,尤其是在 Windows 系统上表现突出。如果你还在手动删除 node_modules,不妨尝试使用 rimraf 来简化工作流程。 结语 我是易航,待过多种类型公司的前端开发者,始终坚持用通俗易懂的方式分享技术知识。欢迎关注我的博客「易航博客」获取更多前端干货!
-
安卓高版本无 ROOT 抓包教程 【安卓逆向】无 Root!HTTPS 抓包竟能如此简单?小白也能秒懂 图片 📌 开篇痛点 安卓 7.0 版本(包括)之后,系统不再信任根目录之外的证书。 "想抓包分析 APP 数据,但手机没 Root?HTTPS 加密的包一抓就断网? 别慌!今天教你用『小黄鸟+虚拟机』这对神器,0 门槛破解无 Root 抓包难题!" 🌟 为什么这个方法牛? 无需 Root:解 BL 锁、刷机统统不需要! 安卓全版本通吃:安卓 7.0 以上高版本照样抓! 保姆级教程:跟着做 10 分钟搞定,附避坑指南! 🛠️ 工具准备 小黄鸟 HttpCanary(抓包神器) https://wwb.lanzouf.com/iNZSN026e9qd VMOS 安卓虚拟机(模拟带 Root 的系统环境) https://www.vmos.com/ 工具截图图片 🚀 保姆级操作步骤 第一步:真机安装工具 真机下载安装 小黄鸟 HttpCanary 和 VMOS Pro(虚拟机)。 小黄鸟设置:进入设置 →SSL 证书 → 导出为 System Trusted (.0) 格式,证书会保存在手机 /HttpCanary/cert/ 目录下。 证书导出图片 第二步:虚拟机开“外挂” 启动 VMOS → 新建一个 安卓 7.1 精简版系统(自带 Root 权限)。 导入文件:在虚拟机内用“文件中转站”功能,导入 目标 APP 和 小黄鸟生成的.0 证书。 挂载证书: 用 MT 管理器(需虚拟机内 Root 权限)将证书复制到虚拟机的 /system/etc/security/cacerts/ 目录。 如果提示“只读”,记得在 MT 管理器中 挂载读写权限! 虚拟机操作图片 第三步:抓包实战! 真机启动小黄鸟 → 设置目标应用为 VMOS。 虚拟机内打开目标 APP → 真机小黄鸟自动开始抓包! 抓包成功:所有 HTTPS 流量明文展示,随便看、随便改! 抓包结果图片 ⚠️ 避坑指南 证书复制失败 → 检查虚拟机是否开启 Root 权限,或换用 Root Explorer 操作。 抓不到包 → 确认小黄鸟证书类型是 .0 格式,且 VMOS 网络通畅。 虚拟机卡顿 → 关闭真机后台无关应用,或换用低配版虚拟机系统。 📢 文末 "你学会了吗?赶紧试试看! 评论区 留下你的实战结果,或遇到的坑,博主帮你解答! 转发 给身边的技术宅,一起解锁新姿势!"
-
使用 HTML、CSS 和 JavaScript 构建简易屏幕录像机 欢迎各位参与这个简单易行的屏幕录像项目!我们将仅使用传统的 HTML、CSS 和 JavaScript 共同完成。您可能会疑惑:为何需要这样的工具?答案在于屏幕录制对教程制作、演示汇报、缺陷报告等诸多场景至关重要。无论您是为频道创建分步教学视频,还是向潜在客户展示作品集,这类应用都不可或缺。本文将带您打造一款简约却强大的屏幕录像工具,完全基于 HTML、CSS 和 JavaScript 实现。 工具准备 如先前所述,本项目无需任何第三方库。但若您零编码经验,建议先观看此教程学习代码编辑器基础。 项目目标 本工具支持用户直接通过浏览器录制屏幕画面及完整音频。点击录制按钮后,系统将提示选择录制区域(如 Chrome 标签页),支持多窗口选择或全屏录制。右下角的 "同时共享音频" 选项可自由开关。录制前设有倒计时,最终视频以 WebM 格式下载。 代码轻量无依赖,充分利用浏览器原生 API。让我们深入解析: 架构分解 HTML 构建界面:包含视频预览、录制按钮和下载链接 CSS 样式设计:响应式布局与动感倒计时层 JavaScript 核心功能:屏幕捕捉、视频录制与下载逻辑 现在让我们深入代码实现。 HTML 结构 创建 index.html 文件,编写基础界面代码(有经验者可自定义调整): <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="style.css" /> <script src="script.js" defer></script> <title>在线屏幕录制</title> </head> <body> <div class="countdown" id="countdown"></div> <div class="screen-recorder"> <h1>开启屏幕录制</h1> <video controls preload="none" id="video"></video> <nav> <button type="button" class="btn" id="btn" aria-label="开始录制">录制</button> <a href="#" class="btn" id="link" aria-label="下载录制视频" download="recording.webm">下载视频</a> </nav> </div> </body> </html>video 元素展示录制内容,button 和 a 分别控制录制与下载。 CSS 样式 创建 style.css 美化界面(CSS 新手可参考 W3School 教程): 关键样式说明: 全局重置:统一边距与盒模型 居中布局:使用网格布局实现垂直水平居中 倒计时层:全屏半透明遮罩与大号数字显示 响应式视频:自适应屏幕尺寸 按钮设计:统一风格与悬停效果 移动适配:媒体查询优化小屏体验 * { padding: 0; margin: 0; box-sizing: border-box; } body { width: 100vw; min-height: 100vh; display: grid; place-items: center; background-color: #f4f4f4; } .countdown { visibility: hidden; color: green; font-size: 10rem; font-weight: 900; background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色背景 */ position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000; display: flex; align-items: center; justify-content: center; } .screen-recorder { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2rem; width: 90%; max-width: 1000px; padding: 2rem; background-color: #fff; color: #202020; border-radius: 10px; box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2); } .screen-recorder video { width: 100%; max-width: 782px; aspect-ratio: 16 / 9; max-height: 440px; box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1), -2px -2px 5px rgba(0, 0, 0, 0.1); border-radius: 10px; display: none; } h1 { text-transform: capitalize; font-size: 3rem; font-weight: bold; color: #202020; } .btn { background-color: #428bca; color: #fff; font-weight: 900; padding: 0.75rem 1.5rem; border-radius: 0.5rem; cursor: pointer; text-transform: capitalize; border: 1px solid #428bca; transition: background-color 0.3s ease, color 0.3s ease; } .btn:hover, .btn:focus { background-color: #357ec7; outline: 2px solid #357ec7; outline-offset: 2px; } a { text-decoration: none; margin-inline-start: 20px; display: none; } @media (max-width: 768px) { .screen-recorder video { width: 100%; height: auto; } h1 { font-size: 2.5rem; } .btn { padding: 0.5rem 1rem; font-size: 1rem; } .countdown { font-size: 6rem; } }JavaScript 功能 创建 script.js 实现核心逻辑: 隐藏内容,请前往内页查看详情 功能解析 事件驱动:按钮点击触发录制流程 媒体捕获:使用 getDisplayMedia 获取屏幕流,getUserMedia 获取音频 倒计时机制:Promise 实现 3 秒倒计时 录制控制:MediaRecorder API 处理视频流 下载生成:Blob 对象转换下载链接 常见问题解答 Q: 能否录制系统音频? A: 受浏览器安全策略限制,系统音频录制可能存在限制,建议使用麦克风输入。 Q: 无法录屏的解决办法? A: 确保浏览器支持 getDisplayMedia API,最新版 Chrome/Firefox 均可。 Q: 如何提升音质? A: 代码已启用回声消除与降噪,建议外接优质麦克风。 Q: 支持暂停录制吗? A: 当前版本未实现,可停止后重新开始。 优劣分析 优势局限无依赖轻量级仅支持现代浏览器简单易实现无高级编辑功能音视频同步录制音频设备兼容性问题Webm 格式下载需转换格式兼容播放响应式设计无实时预览功能通过本文,您已掌握构建基础屏幕录像工具的全流程。现在即可动手实践,打造专属的录屏解决方案! 演示站:http://web.bri6.cn/tool/screen-record/ 图片
-
有了 Fiber 之后的 PHP 会发生怎样的变化? PHP 引入 Fiber(纤程)是一个非常重大的特性,它为 PHP 带来了类似协程的并发编程能力,使得 PHP 能够实现 异步非阻塞 编程模式。 Fibers 是基于用户态的轻量级线程,能够有效地管理任务的暂停与恢复,从而使得 PHP 能够处理更加复杂的并发场景。 具体来说,Fiber 让 PHP 在面对 I/O 密集型 或 高并发 的场景时,比传统的同步模式更加高效。 1. Fiber 在 PHP 中的作用 Fiber 允许开发者在 同一线程中 执行多个任务,并可以在任何时候暂停和恢复执行。 这种机制在传统的 PHP 中是不可行的,因为 PHP 是基于 同步 执行的(即每次只能执行一个操作,且操作之间是阻塞的)。使用 Fiber 后,PHP 能够实现类似 协程 或 绿色线程 的行为。 与传统多线程的区别: Fiber 是 用户态协程,不依赖操作系统线程调度,所以它比操作系统级线程更轻量。它通过显式的 yield 和 resume 来控制程序的执行流程。 多线程 是操作系统层面的线程切换,通常需要更多的资源和开销。 2. Fiber 带来的变化 2.1 异步非阻塞编程 在没有 Fiber 之前,PHP 并不擅长处理异步操作,尤其是在处理 I/O 密集型 操作(如数据库查询、文件操作、HTTP 请求等)时,PHP 会在执行这些操作时 阻塞,直到操作完成才会继续执行后续的代码。 通过 Fiber,PHP 可以在一个请求中同时执行多个任务,像 异步编程 模型一样,在执行阻塞操作时挂起当前任务,让出 CPU 资源,从而执行其他任务。 当阻塞操作完成时,Fiber 会恢复原来的任务继续执行。这种模式类似于 Node.js 的 事件循环 和 JavaScript 的 async/await。 2.2 提升并发处理能力 使用 Fiber,PHP 可以在同一进程中实现 多任务并发执行,特别是在处理多个 I/O 操作 时,Fiber 的引入避免了每次等待 I/O 操作完成时的阻塞。这大大提升了高并发场景下的性能。 例如,可以同时发起多个数据库查询、多个 HTTP 请求,所有操作都可以在同一个进程内并行执行,极大地减少了因等待而浪费的时间。 2.3 轻松实现协程 协程 是一种轻量级的线程,它允许函数在执行时暂停并在稍后的某个时间点恢复执行。在 PHP 中,Fiber 让协程变得更加易于实现,减少了依赖外部扩展或框架的复杂性。 2.4 增强的代码可读性和维护性 协程 编程模式通常能显著提高代码的可读性和维护性。通过 yield 和 resume,你可以通过同步的代码逻辑来处理异步任务,避免了回调地狱(callback hell)或复杂的状态机逻辑。 3. 如何使用 Fiber? PHP 8.1 引入了 Fiber 类。通过使用 Fiber,你可以创建协程,暂停和恢复执行。下面是一个简单的示例,展示了如何使用 Fiber 来实现异步任务: <?php $fiber = new Fiber(function (): void { echo "Fiber started\n"; // 模拟异步任务 Fiber::suspend(); // 暂停 Fiber,模拟等待某个异步任务完成 echo "Fiber resumed\n"; }); // 启动 Fiber echo "Main: before fiber\n"; $fiber->start(); // 输出: Fiber started // Fiber 暂停,主线程继续执行 echo "Main: after fiber suspend\n"; // 输出: Main: after fiber suspend // 恢复 Fiber $fiber->resume(); // 输出: Fiber resumed echo "Main: after fiber resumed\n"; // 输出: Main: after fiber resumed在这个例子中: Fiber::suspend():用于暂停当前 Fiber 的执行,返回控制权给调用它的主线程或其他 Fiber。 fiber->resume():恢复 Fiber 的执行,继续执行从 suspend 暂停的地方。 4. Fiber 的应用场景 4.1 异步数据库操作 传统的数据库操作是同步的,当一个查询正在执行时,PHP 会一直等待,直到查询返回结果。 这对于并发高的场景来说,效率低下。使用 Fiber,你可以发起多个数据库查询,并让每个查询在等待过程中挂起,主线程可以继续执行其他任务,直到查询完成。 <?php use Amp\Loop; use Amp\Mysql; Loop::run(function () { $db = yield Mysql\connect('mysql:host=127.0.0.1;dbname=test', 'root', 'password'); // 发起多个查询并等待结果 $result1 = yield $db->query('SELECT * FROM users'); $result2 = yield $db->query('SELECT * FROM orders'); // 处理查询结果 $users = yield $result1->fetchAll(); $orders = yield $result2->fetchAll(); var_dump($users, $orders); });在这个例子中,两个查询通过 Fiber 实现并发执行,而不会阻塞 PHP 程序。 4.2 高并发 HTTP 请求 Fiber 也适用于发起多个 HTTP 请求的并发处理,特别是在进行大规模爬虫或并行数据抓取时,可以大大提升效率。通过 Fiber,多个 HTTP 请求可以同时进行,而不需要等待某一个请求完成后才能开始另一个。 <?php use Amp\Http\Client\HttpClientBuilder; use Amp\Http\Client\Request; use Amp\Loop; Loop::run(function () { $client = HttpClientBuilder::buildDefault(); $request1 = new Request('https://example.com/page1'); $request2 = new Request('https://example.com/page2'); $response1 = yield $client->request($request1); $response2 = yield $client->request($request2); echo yield $response1->getBody(); echo yield $response2->getBody(); });在这个例子中,request 和 response 操作都可以并发执行,提高了 I/O 操作的效率。 4.3 长时间运行的任务 在 CLI 或其他长期运行的 PHP 脚本中,如果有多个任务需要交替执行,Fiber 可以非常方便地切换任务,避免单个任务阻塞整个脚本。例如,可以在处理大批量数据时,利用 Fiber 实现任务的暂停和恢复,避免长时间的阻塞。 5. Fiber 的挑战与限制 尽管 Fiber 为 PHP 带来了异步编程的优势,但它也有一定的局限性和挑战: PHP 传统的同步编程模型不兼容:Fiber 需要开发者适应新的编程模型,可能需要重构现有的同步代码来支持 Fiber。 性能开销:虽然 Fiber 是用户态协程,开销比线程小,但它仍然带来了一定的内存和执行成本,尤其是在需要频繁暂停和恢复任务的场景下。 第三方库支持有限:尽管 Fiber 提供了强大的并发支持,但并不是所有的 PHP 扩展和库都与 Fiber 兼容。例如,某些扩展或库可能依赖于 PHP 的传统同步模型,不支持或难以适配 Fiber。 6. 未来发展 随着 PHP 8.1 引入 Fiber,这一特性将逐步影响整个 PHP 生态系统。 可以预见,在未来,更多的框架、库和工具将开始支持 Fiber,为 PHP 开发者提供更强大的并发编程能力。 此外,结合 Swoole、ReactPHP 等库,Fiber 可能成为构建高性能异步 PHP 应用的核心技术之一。 总结 Fiber 为 PHP 带来了异步编程的能力,特别是在 I/O 密集型任务和高并发场景下,它能够显著提升 PHP 的执行效率。 开发者可以通过 Fiber 实现类似协程的并发任务管理,并通过 yield 和 resume 控制任务的执行流,从而避免传统同步编程模型中的阻塞问题。 然而,Fiber 也需要开发者对新的编程模型进行适应,尤其是在与现有同步代码和第三方库的兼容性上。 随着时间的推移,Fiber 的使用将更加广泛,并且与其他异步框架和工具的集成会进一步提升 PHP 的性能和开发体验。 图片 参考链接: 以上就是本篇分钟的全部内容,希望各位程序员们努力提升个人技术。最后,小编温馨提示:每天阅读 5 分钟,每天学习一点点,每天进步一点点。 图片