Yocto理论篇 | Yocto共享状态缓存

Yocto - 变量介绍:BASE_WORKDIR、WORKDIR和D 例如,假设源代码目录的顶级文件夹名为 poky,默认编译目录为 poky/build,目标系统为 qemux86-poky-linux。在 Yocto 中,${WORKDIR} 是一个环境变量,表示特定配方在联编过程中的工作目录。默认情况下,TMPDIR 变量指向构建目录中的 tmp。该目录位于 TMPDIR 目录结构中,与正在构建的配方和构建配方的系统相关。这种情况下的一个使用示例是将 TMPDIR 设置为不使用 NFS 的本地磁盘,同时让构建目录使用 NFS。指向所有配方的工作目录根目录。 阅读详情

一般OpenEmbedded构建系统从头开始构建一切,除非BitBake 可以确定部件不需要重新构建。从根本上说,从头构建是有吸引力的,因为它意味着所有部件都是全新构建的,不存在可能导致问题的过时数据。当开发人员遇到问题时,他们通常会默认从头开始构建,这样他们从一开始就有一个已知的状态。

从零开始构建镜像对这个过程来说既是一个优点,也是一个缺点。如前一段所述,从头开始构建可以确保一切都是最新的,并且从已知的状态开始。然而,从头开始建设也需要更长的时间,因为它通常意味着重建不一定需要重建的东西。

Yocto Project实现了支持增量构建的共享状态代码。共享状态代码的实现回答了以下问题,这些问题是开放式增量构建支持系统中的基本障碍:

  • 系统的哪些部分发生了变化,哪些部分没有发生变化?
  • 如何删除和替换已更改的软件?
  • 不需要从头开始重建的预构建组件在可用时如何使用?

对于第一个问题,构建系统通过创建任务输入的校验和(或签名)来检测给定任务的“inputs”中的更改。如果校验和发生变化,系统假设输入已更改,需要重新运行任务。对于第二个问题,共享状态(sstate)代码跟踪哪些任务向构建过程添加了哪些输出。这意味着可以删除、升级或以其他方式操作给定任务的输出。第三个问题的部分解决方案解决了第二个问题,假设构建系统可以从远程位置获取sstate对象,并在认为它们是有效的情况下安装它们。

注意:

  • 构建系统不会将PR 信息作为共享状态包的一部分进行维护。因此,存在影响维护共享状态提要的考虑因素。
  • 生成系统中支持增量生成的代码不是简单的代码。

下面将详细介绍整个增量构建体系结构、校验和(签名)以及共享状态。

1 总体架构

在确定需要构建系统的哪些部分时,BitBake是基于每个任务而不是按配方工作的。您可能会想知道为什么使用每个任务比每个配方优先级更高。为了帮助解释,考虑启用IPK打包后端,然后切换到DEB。在这种情况下,do_install 和do_package 任务输出仍然有效。但是,使用按配方的方法,构建将不包括.deb文件。因此,您必须使整个构建无效并重新运行它。重新运行所有内容并不是最好的解决方案。而且,在这种情况下,核心是必须“taught”很多关于具体任务的知识。这种方法不能很好地扩展,并且不允许用户在不接触打包的登台核心的情况下轻松地在层中添加新任务或作为外部配方。


2 校验和(签名)

共享状态代码使用校验和(任务输入的唯一签名)来确定任务是否需要再次运行。因为任务输入的更改会触发重新运行,因此流程需要检测给定任务的所有输入。对于shell任务,这是相当容易的,因为构建过程为每个任务生成一个“run”shell脚本,并且可以创建一个校验和,可以很好地了解任务的数据何时更改。

使问题复杂化的是,有些东西不应该包括在校验和中。首先,有一个给定任务的实际特定构建路径—WORKDIR。工作目录是否更改并不重要,因为它不应影响目标包的输出。此外,构建过程的目标是使本机包或跨包可重定位。

注意:本机包和交叉包都在构建主机上运行。但是,跨包为目标体系结构生成输出。因此校验和需要排除WORKDIR。排除工作目录的简单方法是将WORKDIR设置为某个固定值,并为“run”脚本创建校验和。另一个问题来自“run”脚本,这些脚本包含可能被调用或可能未被调用的函数。增量构建解决方案包含用于计算shell函数之间依赖关系的代码。这段代码用于将“run”脚本缩减到最小值集,从而缓解了这个问题,并使“run”脚本更具可读性。

到目前为止,shell脚本的解决方案已经存在。Python任务呢?即使这些任务比较困难,也可以采用同样的方法。这个过程需要弄清楚Python函数访问的变量以及它调用的函数。同样,增量构建解决方案包含的代码首先确定变量和函数的依赖关系,然后为用作任务输入的数据创建校验和。

像WORKDIR 的例子一样,存在依赖关系应该被忽略的情况。对于这些情况,可以使用如下行指示生成过程忽略依赖项:

PACKAGE_ARCHS[vardepsexclude] = "MACHINE"           

此示例确保PACKAGE_ARCHS 变量不依赖于MACHINE的值,即使它引用了MACHINE的值。

同样,在某些情况下,您需要添加BitBake无法找到的依赖项。您可以使用以下行来完成此操作:

PACKAGE_ARCHS[vardeps] = "MACHINE"

这个例子显式地添加MACHINE 变量作为PACKAGE_ARCHS的依赖项。

作为一个例子,考虑一个内嵌Python的例子,BitBake无法找出依赖关系。在调试模式下运行(即使用-DDD)时,BitBake会在发现无法确定依赖关系的内容时生成输出。

到目前为止,仅讨论对任务的直接投入。基于直接输入的信息在代码中称为“basehash”。但是,任务的间接输入问题仍然存在——已经构建并存在于Build Directory中的项目。特定任务的校验和(或签名)需要添加特定任务所依赖的所有任务的哈希值。选择要添加的依赖项是一个策略决策。然而,其效果是生成一个主校验和,它结合了basehash和任务依赖项的散列。

在代码级别上,存在多种方法可以影响basehash和依赖任务哈希。在BitBake配置文件中,可以为BitBake提供一些额外的信息,以帮助它构造basehash。下面的语句有效地生成了一个全局变量依赖排除列表(即变量从未包含在任何校验和中):

BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH DL_DIR \
     SSTATE_DIR THISDIR FILESEXTRAPATHS FILE_DIRNAME HOME LOGNAME SHELL TERM \
     USER FILESPATH STAGING_DIR_HOST STAGING_DIR_TARGET COREBASE PRSERV_HOST \
     PRSERV_DUMPDIR PRSERV_DUMPFILE PRSERV_LOCKDOWN PARALLEL_MAKE \
     CCACHE_DIR EXTERNAL_TOOLCHAIN CCACHE CCACHE_DISABLE LICENSE_PATH SDKPKGSUFFIX"

前面的例子排除了WORKDIR ,因为该变量实际上是作为TMPDIR中的路径构造的,TMPDIR位于白名单中。

决定通过依赖链包含哪些依赖任务哈希的规则更为复杂,通常使用Python函数来完成。meta/lib/oe/sstatesig.py显示了两个示例,并说明了如何在需要时将自己的策略插入到系统中。这个文件定义了OE-Core使用的两个基本签名生成器:“OEBasic”和“OEBasicHash”。默认情况下,BitBake中启用了一个虚拟的“noop”签名处理程序。这意味着行为与以前的版本没有变化。默认情况下,OE-Core通过中的此设置使用“OEBasicHash”签名处理程序bitbake.conf文件:

BB_SIGNATURE_HANDLER ?= "OEBasicHash" 

“OEBasicHash” BB_SIGNATURE_HANDLER 与 “OEBasic” 版本相同,但将任务哈希添加到stamp文件中。这将导致更改任务哈希的任何元数据更改,从而自动导致任务再次运行。这就消除了对PR 值的需要,对元数据的更改会自动在构建中产生涟漪。

还值得注意的是,这些签名生成器的最终结果是使一些依赖项和哈希信息可用于构建。这些信息包括:

  • BB_BASEHASH_task-taskname:配方中每个任务的基本哈希。
  • BB_BASEHASH_filename:taskname:每个依赖任务的基哈希。
  • BBHASHDEPS_filename:taskname:每个任务的任务相关性。
  • BB_TASKHASH:当前正在运行的任务的哈希值。

3 共享状态

解决前面讨论的共享状态和半个状态的校验和问题。问题的另一半是能够在构建期间使用校验和信息,以及能够重用或重建特定组件。

sstate 类是如何“capture”给定任务的快照的相对通用的实现。其思想是构建过程不关心任务输出的来源。输出可以是新生成的,也可以从某个地方下载和解包。换句话说,构建过程不需要担心它的起源。

存在两种类型的输出。一种是在WORKDIR中创建一个目录。一个很好的例子是do_install 或do_package的输出。另一种类型的输出发生在将一组数据合并到共享目录树(如sysroot)中时。

Yocto项目团队试图将实现的细节隐藏在sstate类中。从用户的角度来看,将共享状态包装添加到任务中非常简单,这是一个取自deploy 类的do_deploy 示例:

DEPLOYDIR = "${WORKDIR}/deploy-${PN}"
SSTATETASKS += "do_deploy"
do_deploy[sstate-inputdirs] = "${DEPLOYDIR}"
do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}"

python do_deploy_setscene () {
    sstate_setscene(d)
}
addtask do_deploy_setscene
do_deploy[dirs] = "${DEPLOYDIR} ${B}"
do_deploy[stamp-extra-info] = "${MACHINE_ARCH}"       

下表说明了前面的示例:

  • 在SSTATETASKS 中添加“do_deploy”会在do_deploy 任务之前和之后添加一些必需的sstate相关处理(在sstate 类中实现)。
  • do_deploy[sstate-inputdirs] = "${DEPLOYDIR}"声明当正常运行时(即不使用sstate缓存时),do_deploy将其输出放在${DEPLOYDIR}中。此输出将成为共享状态缓存的输入。
  • do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}"这一行将共享状态缓存的内容复制到${DEPLOY_DIR_IMAGE}。

注意:如果do_deploy不在共享状态缓存中,或者如果它的输入校验和(签名)与缓存输出时不同,那么任务将运行以填充共享状态缓存,然后共享状态缓存的内容将复制到${DEPLOY_DIR_IMAGE}。如果do_deploy在共享状态缓存中,并且其签名指示缓存的输出仍然有效(即如果没有相关的任务输入发生更改),则共享状态缓存的内容将直接由do_deploy_setscene 任务复制到${DEPLOY_DIR_IMAGE},而跳过do_deploy 任务。

  • 以下任务定义是使先前设置生效所需的粘合逻辑:
python do_deploy_setscene () {
     sstate_setscene(d)
}
addtask do_deploy_setscene           

sstate_setscene()将上述标志作为输入,并通过共享状态缓存加速do_deploy 任务(如果可能)。如果任务被加速,sstate_setscene()将返回True。否则,它将返回False,并运行正常的do_deploy 任务。

  • do_deploy[dirs] = "${DEPLOYDIR} ${B}"这一行在do_deploy 任务运行之前创建${DEPLOYDIR}和${B},并且还将do_deploy 的当前工作目录设置为${B}。

注意:在sstate-inputdirs和sstate-outputdirs相同的情况下,可以使用sstate-plaindirs。例如,要保留do_package 任务的${PKGD}和${PKGDEST}输出,请使用以下命令:

  • do_deploy[stamp-extra-info] = "${MACHINE_ARCH}"这一行将额外的元数据附加到stamp 文件中。在这种情况下,元数据使任务特定于机器的体系结构。
  • sstate-inputdirs和sstate-outputdirs也可以用于多个目录。例如,以下命令将PKGDESTWORK 和SHLIBWORK 声明为共享状态输入目录(填充共享状态缓存),将PKGDATA_DIR 和SHLIBSDIR 声明为相应的共享状态输出目录:
do_package[sstate-inputdirs] = "${PKGDESTWORK} ${SHLIBSWORKDIR}"
do_package[sstate-outputdirs] = "${PKGDATA_DIR} ${SHLIBSDIR}"         
  • 这些方法还包括在操作共享状态目录结构时获取锁文件的能力,以防文件的添加或删除是敏感的:
do_package[sstate-lockfile] = "${PACKAGELOCK}"

在后台,共享状态代码通过在SSTATE_DIR 和SSTATE_MIRRORS 中查找共享状态文件来工作。下面是一个例子:

SSTATE_MIRRORS ?= "\
file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \
file://.* file:///some/local/dir/sstate/PATH"

注意:共享状态目录(SSTATE_DIR)被组织成两个字符的子目录,其中子目录名基于哈希的前两个字符。如果镜像的共享状态目录结构与SSTATE_DIR具有相同的结构,则必须在URI中指定“PATH”以使生成系统能够映射到相应的子目录。共享状态包的有效性可以通过查看文件名来检测,因为文件名包含本节前面描述的任务校验和(或签名)。如果找到有效的共享状态包,生成过程将下载它并使用它来加速任务。构建过程在任务加速阶段使用*_setscene任务。BitBake在主执行代码之前经过这个阶段,并尝试加速它可以找到共享状态包的任何任务。如果任务的共享状态包可用,则使用共享状态包。这意味着任务及其依赖的任何任务都不会执行。

作为一个真实的例子,其目的是在构建基于IPK的映像时,只有do_package_write_ipk 任务才会获取和提取它们的共享状态包。因为没有使用sysroot,所以它永远不会被提取。这也是为什么基于任务的方法比基于配方的方法更受欢迎的另一个原因,后者必须安装每个任务的输出。

00—Yocto环境变量 1、Yocto中的B、S、D变量 S是build目录下源码解压出来的路径 D是do_install task部署路径,也位于build目录下,默认值是{WORKDIR}/image bitbake -e virtual/kernel | grep ^B= B="/home/cambricon/work/yocto/poky/build_cb/tmp/work/cb_default-poky-linux/linux-cb/1.0-r0/linux-cb-1.0/" bitbake -e virtua 阅读详情

相关推荐

Yocto本地缓存加速镜像构建方法详解

通过配置Yocto本地缓存,显著提升镜像构建效率,减少重复下载与编译开销。合理利用yocto的共享缓存机制,可大幅缩短开发周期,尤其适合频繁构建场景。

weixin_32925455的博客 910

利用Yocto构建嵌入式Linux教程

本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 (LTS),图中所有示例为实际测试截图,有问题请给我留言。在Yocto项目中,有一些专业的术语、比喻、专有名词等。这些基本概念是我们学习和使用Yocto构建自己的嵌入式Linux系统的前提。本节主要介绍了一些Yocto的一些专业术语、BitBake、部分元数据。后续章节会对OpenEmbedded系统构建过程进行描述,然后使用bitbake构建一个Yocto版的“hello world”。

usstmiracle的博客 5716

yocto(一)——yocto介绍

简要介绍yocto项目

zz2633105的博客 1万+

bitbake linux-name 执行各个task的过程

以下是在fsl-release-bsp/imx6solo2/tmp/work/imx6solosabresd-poky-linux-gnueabi/linux-imx/4.1.15-r0/temp目录下面的log.task_order文件内容。其实就是bitbake linux-imx的过程 do_fetch (8359): log.do_fetch.8359 do_unpack (8441): log.do_unpack.8441 do_patch (5650): log.do_patch.5650.

kunkliu的博客 1104

Buildroot与Yocto介绍比对

Buildroot 和 Yocto 是嵌入式 Linux 领域最常用的两大系统构建工具,它们在功能定位、使用方法和适用场景上有显著差异。

froxy的专栏 1475

Yocto构建加速秘籍:如何利用镜像与缓存机制缩短90%的构建时间

本文详细介绍了如何通过优化Yocto的镜像服务器配置和缓存机制,显著缩短构建时间。重点讲解了SSTATE_MIRRORS和PREMIRRORS的配置技巧,以及搭建本地缓存服务器和分布式构建农场的实践方法,帮助企业实现高达90%的构建效率提升。

f9g0h的博客 214

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

共享状态缓存是 Yocto 项目提升构建效率的核心机制。通过任务级缓存、校验和管理以及灵活的配置选项,SState 机制为开发者提供了高效且可靠的增量构建能力。然而,为了最大化利用其优势,开发者需要注意构建可复现性、依赖声明以及缓存一致性等问题。通过合理配置和维护共享缓存,不仅能够显著缩短构建时间,还能在多开发者团队中实现高效协作。对于希望优化构建流程的开发者而言,深入理解并善用共享状态缓存无疑是迈向高效开发的重要一步。

Interview_TC的博客 1788

Petalinux离线编译速度提升300%:手把手教你配置本地sstate和下载缓存

本文详细介绍了如何通过配置本地下载缓存(DL_DIR)和共享状态缓存(SSTATE_DIR)来大幅提升Petalinux的离线编译效率。文章手把手指导读者搭建本地化构建环境,实现编译速度数倍增长,尤其适用于无外网环境或需要频繁迭代的开发团队,有效解决网络依赖导致的编译瓶颈。

day7的博客 1096

Yocto项目-全面的工具链能力

工具链(Toolchain)是嵌入式开发的核心,它由一组工具组成,用于将源代码编译、链接并生成目标硬件可运行的二进制文件。编译器:如GCC或Clang,用于将高层次编程语言代码转化为目标机器代码。链接器:负责将多个编译的对象文件链接成一个可执行文件。调试器:如GDB,用于排查和修复代码中的问题。标准库:如glibc或musl,提供常用的基础函数支持。工具支持:包括binutils(如as和ld),用于处理二进制文件。

Interview_TC的博客 1561

[Yocto] 直接向deploy/images目录部署binary

最近用yocto的时候碰到一个问题,有一些IP的FW binary是从别的地方直接拿来的,没有source code,有一个需求就是需要把它用wks script的方式把它们打包到最后的image里,这篇文章就是来谈谈这个问题。

wangyijieonline的博客 1039

Yocto系列讲解[理论篇]21 - yocto项目的概念(1)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录

fulinux的博客 4645

Yocto构建中的依赖解析与智能缓存:加速Linux镜像生成的工程实践

本文深入探讨Yocto构建系统中的依赖解析机制与智能缓存策略,分享如何通过优化下载缓存、共享状态缓存和分布式构建来加速Linux镜像生成。针对网络不稳定和大型项目构建效率问题,提供了容器化环境和混合云部署的工程实践解决方案,显著提升嵌入式系统开发效率。

w1x2y3的博客 173

yocto理论篇-local.conf学习

在Yocto项目中,local.conf 文件是构建配置中的一个关键组成部分,它位于构建环境目录下的 conf/ 子目录中。这个文件主要用于包含用户的自定义配置,允许用户覆盖或扩展构建系统的默认行为而无需直接修改Yocto框架的核心配置文件。覆盖默认的构建变量:例如,你可以在这里设置目标系统的架构 (MACHINE) 或者发行版 (DISTRO)。指定构建的输出位置:例如,通过设置 DL_DIR、SSTATE_DIR、TMPDIR 等变量来指定下载目录、状态缓存目录、临时文件目录等。

甜航一直在的博客 759

4.Yocto项目概念

本章为Yocto项目概念提供了解释,这些概念超越了"如何"信息和参考(或查找)材料的表面。解释了组件、开放式构建系统工作流程、交叉开发工具链、共享状态缓存等概念。 4.1约克托项目组件 BitBake任务执行器以及各种类型的配置文件组成了开放式核心 (OE-Core)。本节通过描述这些组件的使用及其交互方式来概述这些组件。 BitBake 处理数据文件的解析和执行。数据本身是多种类型的: 食谱:提供有关特定软件的详细信息。 类数据:摘要常见构建信息(例如,如何构建 Linux 内核

Jarvis的博客 1981

开关电源设计实战:如何用AP值快速选型磁芯(附计算公式推导)

本文为开关电源工程师提供了基于AP值的磁芯快速选型实战指南。文章深入解析了AP值作为磁芯‘功率吞吐量’指标的核心物理意义,并通过详细的公式推导和24W反激电源设计实例,手把手演示如何利用AP值计算公式,结合电流密度、窗口利用率等关键参数,从众多磁芯型号中高效筛选出合适型号,同时强调了选型后的关键校验步骤与常见误区。

weixin_29234239的博客 871

从零到一:手把手部署用友T3标准版11.2及SQL Server 2008R2环境

本文详细介绍了从零开始部署用友T3标准版11.2及SQL Server 2008R2环境的完整流程,包括环境准备、SQL Server安装、环境检测与修复、T3标准版安装实战以及初始化配置与测试。通过手把手的步骤指导和常见问题解决方案,帮助用户顺利完成部署,确保系统稳定运行。

weixin_28339967的博客 452

bitbake有哪些缓存机制

bitbake主要使用三种缓存机制:下载缓存(DL_DIR)、编译缓存(TMPDIR)、共享状态缓存(SSTATE_DIR)

fan21522152的专栏 726

52、基于格的具有解密密钥暴露抗性的可撤销(分层)身份基加密方案

本文提出了首个基于格的具有解密密钥暴露抗性(DKER)的可撤销分层身份基加密(RHIBE)方案。通过引入分层密文、分层解密密钥和级别转换密钥等创新工具,克服了格结构与传统密钥重新随机化属性不匹配的难题。该方案不仅支持可扩展的密钥撤销机制,还具备密钥委托功能,为后量子密码学领域的发展提供了新的思路和方法。

efc12345678的博客 123

yocto-第1篇-开始qemux86-64虚拟机的构建

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 目标理想:构建一个特殊的yocto poky项目ubun...

kunkliu的博客 1512

Avalonia 超级详细学习指南

什么是 Avalonia?Avalonia 是一个开源的、跨平台的 GUI 框架,允许开发者使用 XAML 和 C# 构建现代化、高性能的桌面应用程序。与其他框架相比,Avalonia 具有强大的跨平台能力和灵活的界面设计。} }()Avalonia 的特点和优势跨平台性:Avalonia 可以在 Windows、Linux、macOS 等多个平台上运行,开发者可以编写一套代码,然后在不同的操作系统上运行相同的应用程序。

仰望星空的博客 1万+

Python 爬虫实战:爬取国家统计局公开数据

国家统计局作为权威的宏观经济数据发布机构,汇聚了人口、GDP、就业、产业经济等多维度的核心统计数据,是开展经济研究、政策分析、行业洞察的重要数据支撑。相较于商业数据平台,国家统计局的公开数据具备权威性、全面性和时效性等特点,但部分数据分散在不同栏目且缺乏结构化下载渠道。本文基于 Python 爬虫技术,系统讲解国家统计局公开数据的爬取方法,重点解决静态表格解析、分页数据抓取、数据结构化转换等问题,同时严格遵循政府网站数据使用规范,为科研、教学等场景提供合规的数据获取方案。本文以国家统计局官网(

2503_91057718的博客 1817

一些常见的Yocto配置选项

BB_NUMBER_THREADS:同时工作的最大任务数 BB_GENERATE_MIRROR_TARBALLS:在DL_DIR中产生源代码控制库(比如 GIT),包含元数据的tarball PARALLEL_MAKE:每个任务使用的线程数 INHERIT += “rm_work” 删除临时工作空间 DL_DIR:存放下载后的数据 SSTATE_DIR:存放共享状态缓存 ...

jumpingpig的博客 2773

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

Yocto Project Overview and Concepts Manual

目录表。

一个嵌入式软件工程师的博客 218

基于STM32、HAL库的WF162A 11BA T&R气压传感器 驱动程序设计

/ 转换为7位地址。* @param temperature: 存储读取到的温度值(°C)* @param temperature: 存储读取到的温度值(°C)* @param pressure: 存储读取到的压力值(bar)* @param pressure: 存储读取到的压力值(bar)* @param range: 压力范围(bar)

corlin6688的博客 361

vue3 - 详细实现视频/图片/图文“响应式瀑布流“列表布局示例代码,手机移动端H5或PC端电脑网页根据屏幕宽度自适应响应式瀑布流效果,支持数据列表动态懒加载,仿小红书图文视频div容器的瀑布流方案

vue3,nuxt3,瀑布流,响应式,图片瀑布流,视频瀑布流,图文瀑布流,手机移动端,H5瀑布流,电脑PC网站,手机电脑都能用的瀑布流布局,屏幕自适应,最好用的瀑布流组件插件,滚动分页加载瀑布流列表,瀑布流效果,自适应瀑布流布局详细教程,动态加载数据,懒加载,小红书,图文列表,视频列表,列表容器高度不一致怎么排列,整个屏幕全是宽高不固定的div容器列表怎么办,移动端和pc端双端实现瀑布流,vue3实现图片瀑布流布局以及响应式,滚动条触底懒加载,组件插件,vue3瀑布流 电脑手机都能用,解决卡顿不流畅,对不齐

✅ 精选推荐文章 4340
上一篇: Yocto理论篇 | Yocto交叉开发工具链生成
下一篇: Yocto理论篇 | Yocto自动添加运行时依赖项
嵌入式逍遥
嵌入式逍遥 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄9年 7万+粉丝 237原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值