Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
CSS如何优化首屏加载速度?关键CSS提取技巧_创想鸟

CSS如何优化首屏加载速度?关键CSS提取技巧

关键css(critical css)是指渲染首屏内容所需的最小css样式,它能通过内联到html的中消除渲染阻塞,使浏览器立即绘制页面首屏内容;2. 提取关键css推荐使用自动化工具(如critical、penthouse、critters),因其高效、可维护,避免手动提取的高成本和易出错问题;3. 剩余非关键css应通过异步方式加载,常用策略包括media=”print” hack结合javascript、rel=”preload”配合onload事件或动态创建标签,以确保不影响首屏渲染性能;4. 实施时需注意避免fouc、合理设置缓存策略,并优先使用rel=”preload”等现代标准方法,从而全面提升首屏加载速度和用户体验。

CSS如何优化首屏加载速度?关键CSS提取技巧

CSS首屏加载速度的优化,核心在于关键CSS(Critical CSS)的提取与内联。这能确保用户在第一时间看到页面内容,大幅提升感知性能和用户体验,避免白屏等待。

解决方案

要优化CSS的首屏加载速度,最有效的方法就是将渲染首屏内容所需的关键CSS直接嵌入到HTML文档的


标签中。这样,浏览器在解析HTML时就能立即获取并应用这些样式,无需等待外部CSS文件的下载和解析,从而消除渲染阻塞。对于不影响首屏展示的剩余CSS,则采用异步加载策略,确保它们不会阻碍页面的初始渲染。这就像是给浏览器一个“急用包”,让它先画出最重要的部分,其他细节可以稍后慢慢完善。

什么是关键CSS(Critical CSS),它为何如此重要?

说实话,关键CSS这个概念,初听可能有点抽象,但它其实非常直观。它指的是用户在浏览器中首次加载页面时,不滚动屏幕就能看到的所有内容(也就是“首屏”或“Above-the-Fold”区域)所必需的全部CSS样式。想象一下,你打开一个网站,最先映入眼帘的导航栏、主标题、首张图片,它们的布局、颜色、字体,都是由这部分关键CSS来决定的。

立即学习“前端免费学习笔记(深入)”;

那它为什么如此重要呢?原因很简单,但影响深远。传统的网页加载模式是,浏览器在解析HTML遇到


时,会暂停渲染,直到这个CSS文件被完全下载、解析并应用。这被称为“渲染阻塞”。如果你的CSS文件很大,或者网络状况不佳,用户就会面对一个长时间的白屏。这体验简直是灾难性的。

而关键CSS的作用,就是打破这种阻塞。通过把首屏最核心的样式直接写到HTML里,浏览器就能立刻渲染出页面的“骨架”和“第一印象”。这对于用户来说,意味着页面几乎是瞬间加载的,大大提升了首次内容绘制(FCP)和最大内容绘制(LCP)这两个关键性能指标。我个人觉得,这不仅仅是技术优化,更是对用户耐心的一种尊重。毕竟,谁都不喜欢对着空白屏幕发呆,对吧?

如何识别和提取关键CSS?手动与自动化方法对比

识别和提取关键CSS,这活儿说起来容易,做起来有时候还挺麻烦的。基本上,你可以选择手动操作,也可以借助一些自动化工具。

Replit Ghostwrite Replit Ghostwrite

一种基于 ML 的工具,可提供代码完成、生成、转换和编辑器内搜索功能。

Replit Ghostwrite 93 查看详情 Replit Ghostwrite

手动方法:这通常是我在理解原理或者调试小项目时会用的。你打开浏览器的开发者工具,切换到“元素”面板,然后逐个点击首屏区域的元素,在“样式”面板里查看它们所应用的CSS规则。然后,把这些规则一点点复制粘贴出来,汇总成一个独立的CSS块。

优点: 对CSS的依赖关系有最清晰的认识,完全掌控。缺点: 极度耗时、容易出错,特别是对于复杂的页面布局和响应式设计,几乎不可能手动覆盖所有情况。一旦页面改动,你还得重新来一遍,维护起来简直是噩梦。我常常看到一些团队尝试手动提取,最后都因为维护成本太高而放弃了。

自动化方法:这才是生产环境下的主流选择,也是我强烈推荐的方式。市面上有很多工具和库可以帮助你自动化这个过程。它们通常会模拟一个浏览器环境,加载你的页面,然后分析首屏所需的CSS。

工具举例:

critical

(Node.js库): 这是一个非常流行的工具,你可以通过命令行或者作为构建工具(如Webpack、Gulp)的插件来使用它。它能抓取你的HTML和CSS,然后输出关键CSS。简单命令行示例(概念性):

critical your-page.html --base public/ --css public/style.css --width 1300 --height 900 > public/critical.css

这个命令大致的意思是,根据

your-page.html

和

style.css

,模拟一个1300×900的视口,然后把首屏关键CSS输出到

critical.css

。

penthouse

: 另一个强大的关键CSS生成器,可以作为独立的CLI工具或库使用。

critters

(Webpack插件): 如果你使用Webpack,这个插件可以在构建过程中自动帮你完成关键CSS的内联,非常方便。优点: 效率高、可重复、减少人为错误,特别适合大型项目和持续集成流程。它能处理复杂的CSS规则、媒体查询等。缺点: 配置可能需要一些时间,有时候自动化工具可能会漏掉一些动态加载的或JavaScript控制的样式,需要一些调试和微调。此外,它会增加构建步骤的复杂性。

对我来说,除非是那种一页到底、没有任何交互的极简页面,否则自动化工具是唯一的出路。手动提取虽然能让你理解原理,但在实际项目中,它的成本和风险都太高了。

提取关键CSS后,剩余CSS如何加载才能不影响性能?

提取并内联了关键CSS之后,剩下的那部分庞大的、非首屏必需的CSS文件,我们可不能就这么直接扔到


里去,那又会造成渲染阻塞。我们的目标是让它们在不影响首屏渲染的前提下,尽快地被加载和应用。这里有几种常用的异步加载策略:

使用

media="print"

hack结合JavaScript:这是一个很巧妙且广为流传的方法。浏览器看到

media="print"

属性时,会认为这个CSS文件只用于打印,因此不会阻塞页面的渲染,会以较低的优先级去下载它。下载完成后,我们再通过JavaScript将其

media

属性改为

all

,从而使其生效。


onload="this.media='all'"

:当CSS文件加载完成后,通过JavaScript将其媒体类型改为

all

,使其应用于所有媒体类型。


标签:这是为了那些禁用JavaScript的用户准备的备用方案,确保在JS不可用的情况下,样式也能正常加载(尽管会阻塞渲染)。

使用

rel="preload"

结合

onload

事件:

rel="preload"

是一个更现代、更明确的资源预加载指令。它告诉浏览器“这个资源我很快就会用到,你先去下载它,但不要立即执行它”。对于CSS,我们可以这样用:


as="style"

:明确告诉浏览器预加载的是一个样式表。

onload="this.onload=null;this.rel='stylesheet'"

:当预加载的CSS文件下载完成后,通过JavaScript将

rel

属性从

preload

改为

stylesheet

,从而应用样式。

this.onload=null

是为了避免在某些旧浏览器中重复触发

onload

。这种方法通常被认为是更推荐的,因为它更符合浏览器标准,并且提供了更精细的控制。

通过JavaScript动态创建


标签:你也可以完全通过JavaScript来创建并插入


标签到DOM中。

function loadCSS(href) {  const link = document.createElement('link');  link.rel = 'stylesheet';  link.href = href;  document.head.appendChild(link);}loadCSS('/path/to/non-critical.css');

这种方式的优点是灵活性高,你可以控制何时、何地加载CSS。但缺点是如果JavaScript执行过晚,可能会导致短暂的无样式内容闪烁(Flash Of Unstyled Content, FOUC)。

需要注意的几点:

FOUC(无样式内容闪烁): 这是异步加载CSS时最常见的“副作用”。如果关键CSS提取得不够彻底,或者剩余CSS加载得太慢,用户可能会在短时间内看到页面在没有完整样式的情况下显示,然后突然“变美”。这需要你仔细测试和调整。缓存策略: 确保你的非关键CSS文件设置了合理的缓存策略(如长时间的

Cache-Control

),这样用户第二次访问时就无需再次下载了。HTTP/2 Push的争议: 过去有人提出用HTTP/2 Push来推送CSS,但我个人觉得这在实践中有很多坑。它要求服务器主动推送资源,但浏览器对推送资源的缓存处理并不一致,而且如果浏览器已经有缓存,服务器还强行推送,反而会浪费带宽。所以,我更倾向于客户端的

preload

指令,让浏览器自己决定何时去取。

总的来说,选择哪种异步加载方式,取决于你的项目需求、对浏览器兼容性的要求以及你对FOUC的容忍度。但无论如何,将CSS分为关键和非关键两部分,并分别处理,是优化首屏加载速度的必由之路。

以上就是CSS如何优化首屏加载速度?关键CSS提取技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1091942.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Office各版本卸载清理指南
上一篇 2025年12月2日 10:42:04
学会sql能找什么工作 sql技能就业方向解析
下一篇 2025年12月2日 10:42:08

相关推荐

  • x浏览器下载速度慢怎么提升_x浏览器多线程下载速度提升技巧

    x浏览器下载速度慢怎么提升_x浏览器多线程下载速度提升技巧x浏览器下载速度慢怎么提升_x浏览器多线程下载速度提升技巧x浏览器下载速度慢怎么提升_x浏览器多线程下载速度提升技巧x浏览器下载速度慢怎么提升_x浏览器多线程下载速度提升技巧

    1、通过启用并行下载和云加速引擎,2、清理缓存与优化DNS设置,可显著提升x浏览器下载速度。 如果您在使用x浏览器下载文件时遇到速度缓慢的问题,这可能是由于浏览器设置、网络环境或服务器连接等因素导致的。通过调整相关配置和优化网络条件,可以有效改善下载体验。 本文运行环境:小米14 Pro,Andro…

    2026年9月26日 • 用户投稿
    000
  • 夸克怎么把网页添加到桌面_夸克网页快捷方式创建方法

    夸克怎么把网页添加到桌面_夸克网页快捷方式创建方法夸克怎么把网页添加到桌面_夸克网页快捷方式创建方法夸克怎么把网页添加到桌面_夸克网页快捷方式创建方法夸克怎么把网页添加到桌面_夸克网页快捷方式创建方法

    通过夸克浏览器可将常用网页添加到iPhone桌面,实现一键访问。首先在夸克中打开目标页面,点击底部更多选项(三个点),选择“添加到桌面”并确认,系统自动创建快捷方式;若无法直接添加,可点击分享图标,在分享列表中选择“添加到主屏幕”,按提示完成命名与放置;对于需自定义的用户,可在创建过程中修改默认标题…

    2026年9月26日 • 用户投稿
    000
  • 服务发现组件 Eureka 和 Nacos 有什么区别?

    服务发现组件 Eureka 和 Nacos 有什么区别?服务发现组件 Eureka 和 Nacos 有什么区别?服务发现组件 Eureka 和 Nacos 有什么区别?服务发现组件 Eureka 和 Nacos 有什么区别?

    Eureka 侧重服务注册与发现,适合简单场景;Nacos 功能更全,支持配置管理、动态更新与高扩展性,适用于复杂微服务架构。选择需根据技术栈、项目规模及未来扩展需求权衡,Nacos 在大型项目中更具优势。 Eureka 和 Nacos 都是服务发现组件,核心作用都是让服务能够被其他服务找到并调用。…

    2026年9月26日 • 用户投稿
    000
  • 剪映创作者交流会:全面引入AI能力,打造一站式创作工具

    剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具剪映创作者交流会:全面引入AI能力,打造一站式创作工具

    日前,剪映在2025创作者交流大会上以“all in ai,all in one,创作,无限新可能”为主题,全面展示了其在ai领域的最新进展,并与众多内容创作者深入探讨了人工智能如何重构视频创作流程、降低技术门槛,激发更广泛的创意潜能。 剪映产品负责人在会上表示,剪映的愿景是成为每一位创作者的“全能…

    2026年9月26日 • 用户投稿
    900
  • Gemini生成内容能导出吗 Gemini结果保存与导出技巧分享

    Gemini生成内容能导出吗 Gemini结果保存与导出技巧分享Gemini生成内容能导出吗 Gemini结果保存与导出技巧分享Gemini生成内容能导出吗 Gemini结果保存与导出技巧分享Gemini生成内容能导出吗 Gemini结果保存与导出技巧分享

    关于Gemini生成内容能否导出或保存的问题,答案是肯定的。Gemini作为一款强大的AI工具,其生成的结果通常可以通过多种方式进行保存和导出,以便您后续查阅、编辑或分享。本文旨在分享一些实用的技巧,帮助您轻松保存Gemini的输出内容。我们将分步骤讲解如何通过几种主要方式实现这一目标,方便您学习和…

    2026年9月26日 • 用户投稿
    000
  • pr如何把文字置于背景图片下方

    pr如何把文字置于背景图片下方pr如何把文字置于背景图片下方pr如何把文字置于背景图片下方pr如何把文字置于背景图片下方

    在使用premiere pro(pr)进行视频编辑时,将文字放在背景图片下方是一个常见的需求。以下为你详细介绍操作方法。 首先,在pr中导入背景图片和准备添加的文字素材。将背景图片拖入时间轴的视频轨道。 接下来添加文字。点击“字幕”工具,在节目监视器中创建文字。你可以设置文字的字体、大小、颜色等属性…

    2026年9月26日 • 用户投稿
    100
  • uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置

    uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置uc浏览器怎么设置成单窗口模式_UC浏览器多窗口与单窗口切换设置

    首先在UC浏览器设置中将新页面打开方式改为“当前窗口打开”,然后关闭分屏与多任务窗口功能,最后手动合并现有标签页,实现单窗口浏览。 如果您在使用UC浏览器时希望减少窗口切换的麻烦,提升浏览效率,可以通过设置将浏览器调整为单窗口模式。该模式下所有网页将在同一窗口中打开,避免产生多个标签页或窗口干扰操作…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置

    sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置sublime怎么搭建go语言开发环境_sublime Go语言开发环境配置

    首先安装Go环境并配置GOPATH、GOROOT和PATH,验证go version和go env;接着安装Sublime Text及其包管理工具Package Control;然后通过Ctrl+Shift+P安装GoSublime、GoFmt和SideBarGo插件;再进入GoSublime Pr…

    2026年9月26日 • 用户投稿
    200
  • windows怎么查看cpu核心数和线程数 windows查看cpu核心与线程数教程

    windows怎么查看cpu核心数和线程数 windows查看cpu核心与线程数教程windows怎么查看cpu核心数和线程数 windows查看cpu核心与线程数教程windows怎么查看cpu核心数和线程数 windows查看cpu核心与线程数教程windows怎么查看cpu核心数和线程数 windows查看cpu核心与线程数教程

    首先通过任务管理器查看CPU核心数和线程数,依次使用系统信息工具、PowerShell命令及命令提示符查询,四种方法均可准确获取联想小新Pro 16在Windows 11系统下的处理器核心与线程信息。 如果您需要了解计算机的处理器性能或进行系统优化,查看CPU的核心数和线程数是基础操作。掌握这些信息…

    2026年9月26日 • 用户投稿
    100
  • 实现搜索结果按字母排序:PHP结合Ajax的专业教程

    本文档旨在提供一种使用PHP和Ajax对通过POST方法获取的搜索结果进行A-Z排序的解决方案。我们将创建一个表单,保存POST数据,并利用PHP函数对医生列表进行排序,最终通过Ajax实现无需刷新页面的排序功能。 1. 修改 search.php 文件 首先,我们需要在 search.php 文件…

    2026年9月26日
    000
  • realmeNarzo手机微信收款语音播报如何设置?配置语音提示教程

    答案:确保微信收款语音提醒开启,并检查Realme Narzo的媒体音量、通知权限、电池优化及勿扰模式。具体操作为:开启微信“收款到账语音播报”功能,调高播报音量;确认手机媒体音量未静音;在系统设置中允许微信通知并启用“支付通知”声音;将微信加入电池优化白名单,禁止后台限制;关闭勿扰模式。若仍无效,…

    2026年9月26日
    100
  • 网易云音乐网页版在线播放网址 网易云音乐网页版官网登录入口

    网易云音乐网页版官网登录入口为https://music.163.com/,支持在线播放、MV搜索、歌单管理、电台收听及内容收藏分享等功能,界面简洁,适配多设备,涵盖新碟、榜单、独立音乐人及场景化音频内容。 网易云音乐网页版在线播放网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来网易云…

    2026年9月26日
    000
  • 悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程

    悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程悟空浏览器怎么把网页保存为图片_悟空浏览器将整个网页另存为图片教程

    使用悟空浏览器可将网页保存为图片:1. 通过菜单选择“长截屏”自动拼接完整页面;2. 利用分享功能调用系统截图工具生成图片;3. 将网页另存为HTML后借助第三方工具转换为图像格式。 如果您在浏览网页时希望将整个页面保存为图片以便分享或存档,但不确定如何操作,可以通过悟空浏览器的内置功能实现。以下是…

    2026年9月26日 • 用户投稿
    100
  • 操作指南:如何将抖音订单导入拼多多店铺

    操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺操作指南:如何将抖音订单导入拼多多店铺

    为何要将抖音订单同步至拼多多店铺 作为国内领先的社交电商平台,拼多多拥有庞大的用户流量,与抖音的广泛受众高度契合。将抖音平台的订单数据导入拼多多店铺,已成为电商运营者提升效率的重要手段。此举不仅有助于增强店铺在多平台的曝光度,还能实现订单的集中化管理,提升整体运营效率。 具体操作步骤:从抖音导入订单…

    2026年9月26日 • 用户投稿
    000
  • 游戏模式优化:Windows11后台进程管理实测

    游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测游戏模式优化:Windows11后台进程管理实测

    通过windows 11的游戏模式可以优化游戏性能,具体方法包括:1. 启用游戏模式自动调整系统资源;2. 通过后台进程管理限制资源消耗;3. 手动关闭不必要的后台进程;4. 确保驱动程序更新并注意游戏模式对其他应用的影响。 游戏模式优化可以通过调整Windows 11的后台进程管理来实现,这可以显…

    2026年9月26日 • 用户投稿
    200
  • CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别CountDownLatch, CyclicBarrier, Semaphore 的使用场景与区别

    CountDownLatch用于主线程等待其他线程完成操作,CyclicBarrier用于多线程相互等待至屏障点后集体执行,Semaphore用于控制并发访问资源的线程数量。 CountDownLatch, CyclicBarrier, Semaphore 都是并发编程中用于线程同步的工具,但它们的…

    2026年9月26日 • 用户投稿
    500
  • sublime如何创建自己的代码片段_sublime自定义代码片段教程

    sublime如何创建自己的代码片段_sublime自定义代码片段教程sublime如何创建自己的代码片段_sublime自定义代码片段教程sublime如何创建自己的代码片段_sublime自定义代码片段教程sublime如何创建自己的代码片段_sublime自定义代码片段教程

    在Sublime Text中创建自定义代码片段可提升编码效率。1. 通过Tools → Developer → New Snippet…打开模板;2. 编辑content、tabTrigger、scope和description字段,如设置html5触发HTML5结构;3. 保存为.ht…

    2026年9月26日 • 用户投稿
    000
  • DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试DDR5内存超频指南:芝奇幻锋戟6400MHz稳定性测试

    ddr5内存可以超频到6400mhz,但需要仔细调整和测试以确保稳定性。1.选择适合超频的ddr5内存条时,优先考虑芝奇幻锋戟系列,选择标有“oc”标签且规格接近目标频率的产品。2.在bios中将频率设为6400mhz,从宽松时序如cl36-36-36-76开始调整,并设定电压在1.25v到1.35…

    2026年9月26日 • 用户投稿
    000
  • 基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案基于Quarkus的云原生Java开发:启动时间低于0.5秒的实践方案

    Quarkus通过GraalVM Native Image预编译实现启动时间低于0.5秒,需配置pom.xml插件、优化依赖、使用Quarkus CLI并监控调优。 Quarkus通过预编译和GraalVM Native Image等技术,让Java应用在云原生环境中拥有极低的启动时间和内存占用。本…

    2026年9月26日 • 用户投稿
    500
  • 如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程

    如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程如何用WPS转换PDF为Word_WPS PDF转Word格式转换操作教程

    使用WPS在线工具可直接上传PDF并转为Word,适合临时处理;2. WPS桌面版支持批量高精度转换,操作简便;3. 手机端WPS应用实现移动端快速转换与分享;4. 已打开PDF时可通过内置插件一键转为Word,提升效率。 如果您需要将PDF文件转换为可编辑的Word文档,WPS提供了便捷的转换功能…

    2026年9月26日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信