新闻详情

新闻详情

首页 / 资讯中心 / 详情

gatsby-source-wordpress 插件架构深度解析:从 WPGraphQL 远程 Schema 摄取到节点获取的完整数据管线

发布时间:2026/9/21 2:34:07来源:尧图网络
gatsby-source-wordpress 插件架构深度解析:从 WPGraphQL 远程 Schema 摄取到节点获取的完整数据管线
前端静态站点Web框架【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址https://gitcode.com/gh_mirrors/ga/gatsby点击查看免费下载导读gatsby-source-wordpress^4.0.0是 Gatsby 官方基于WPGraphQL的 WordPress 数据源插件它不再像 v3 那样调用 WordPress REST API而是通过 GraphQL introspection 远程摄取 WPGraphQL Schema、自动生成查询、定制 Gatsby Schema、并以游标分页方式抓取节点与媒体文件。本文以仓库中 ARCHITECTURE.md 为骨架结合插件源码位于 packages/gatsby-source-wordpress/src逐层拆解其数据管线、缓存策略、Preview 机制与开发体验设计读完你将理解这个 Gatsby 生态中体量最大的源插件之一是如何组织代码、处理增量更新与应对大型站点抓取可靠性问题的。历史背景从 REST API 到 WPGraphQL 的重写gatsby-source-wordpress^3.0.0使用 WordPress REST API 获取数据而^4.0.0改用WPGraphQL两者是完全没有共享代码的两个插件。v4 的早期工作最初在独立的 [gatsby-source-wordpress-experimental] 仓库中进行之后才合并进 Gatsby monorepo。这个插件还催生了 [Gatsby GraphQL Toolkit]——一个用于创建 GraphQL API 源插件的工具库。不过由于插件诞生时 toolkit 尚不存在且插件具备 toolkit 目前不具备的特性因此插件并未迁移到 toolkit 上作者在文档中坦言迁移收益小、成本可能高达数月。另一个值得注意的历史决策是语言选择插件最初用 JS 编写后部分移植到 TS因此源码中 JS/TS 文件混杂。当时 Gatsby 核心团队约定核心用 TS、插件用 JS 以降低社区贡献门槛但这个插件最终成为 Gatsby 插件中最大的代码库之一作者后来认为它100% 需要 TS。从仓库看src/steps下确实是.js与.ts并存的状态例如 src/steps/source-nodes/index.ts 是 TS而 src/steps/source-nodes/fetch-nodes/fetch-nodes.js 是 JS。入口与步骤组织gatsby-node.ts与src/steps插件 99.999% 的逻辑都从gatsby-node.ts进入gatsby-browser.ts只导入 1 个 CSS 文件。仓库根目录的 gatsby-node.js 只是一个转发表层module.exports require(./dist/gatsby-node)真正的实现编译到dist目录。所有业务步骤step各自独立成文件统一放在src/steps目录并通过 src/steps/index.ts 统一导出。从中可以看到插件挂载的 Gatsby Node API 全貌setGatsbyApiToState/ensurePluginRequirementsAreMet/ingestRemoteSchema/createSchemaCustomization/sourceNodes/setErrorMap等主流程步骤startPollingForContentUpdates开发模式内容轮询见 content-update-interval.jscheckIfSchemaHasChanged远程 Schema MD5 对比见 diff-schemas.jsPreview 相关onCreatePageRespondToPreviewStatusQuery、onCreatepageSavePreviewNodeIdToPageDependency、onPreExtractQueriesInvokeLeftoverPreviewCallbackspluginOptionsSchemaJoi 定义的插件选项校验与文档生成setRequestHeaders、addRemoteFileAllowedUrl、imageRoutes、hideAuthPluginOptions/restoreAuthPluginOptionsBasic Auth 相关等辅助步骤。步骤编排机制多个步骤通过runSteps顺序执行。以远程 Schema 摄取为例src/steps/ingest-remote-schema/index.js 展示了完整的流水线checkIfSchemaHasChanged → introspectAndStoreRemoteSchema → identifyAndStoreIngestableFieldsAndTypes → [buildNodeQueries, buildNonNodeQueries] → [cacheFetchedTypes, writeQueriesToDisk]其中buildNodeQueries与buildNonNodeQueries并行、cacheFetchedTypes与writeQueriesToDisk并行说明查询构建阶段允许分支并发。查询生成 / 远程 Schema 摄取在从 WPGraphQL 抓取任何数据之前插件必须先知道该问 WPGraphQL 要什么。做法是向 WPGraphQL 发起一次introspection 查询见introspect-remote-schema.js拿到远程 Schema 的完整描述使用自定义查询构建器build-queries-from-introspection位于 src/steps/ingest-remote-schema根据 introspection 响应生成节点列表查询这些查询存储在本地供后续sourceNodes阶段使用。这段逻辑在 Gatsby Node APIcreateSchemaCustomization阶段运行与 Schema 定制共用同一次 introspection 结果。查询生成的几个工程细节Good to know文档明确列出了设计上的权衡这些在代码结构上也能印证只抓缺失数据因为插件知道哪些会变成未来的 Gatsby 节点节点之间的连接connection只抓取id避免冗余自动 fragment 化当某个带 selection set 的字段被查询超过 1 次时自动生成 fragment 以控制查询体积双向连接造成过度抓取目前User.posts[].id与Post.author.id两侧都会抓取作者认为未来应允许某些字段完全由 Gatsby 侧解析既然有了Post.author.id就无需User.posts[].id全量抓取是开发模式的必要代价插件不知道站点最终会用到哪些字段因此抓取全部可用的 WPGraphQL 数据gatsby develop下这是必须的但理论上冷构建和gatsby build的非开发更新可以只抓被查询的字段查询复杂度拆分是未来方向目前内部已支持存储多个查询未来应加入查询复杂度算法或复用 WPGraphQL 的把过大查询自动拆分为多个。Schema 定制查询生成与 Schema 定制共享同一次 introspection 结果。在createSchemaCustomization阶段插件把远程 Schema 转换为符合 Gatsby 节点模型、并受插件选项约束的 WP/Gatsby Schema。核心代码在 src/steps/create-schema-customization其中index.js 遍历introspectionData.__schema.types根据type.kindUNION/INTERFACE/OBJECT/ENUM/SCALAR调用对应的类型构建器transform-fields 目录下的字段转换器field transformer把远程 introspection 字段转为 Gatsby Schema 定制层能理解的 type/field 定义所有 resolver 都在 Gatsby 侧完成——这是对 WPGraphQL 中 resolver 行为的自动复刻且仅针对没有输入参数input args的字段。文档明确指出目前没有大概率永远不会有自动搬运 WPGraphQL 输入参数的机制因此带输入参数的字段会被跳过在非节点 root fields 的处理中也能看到同样策略。Schema 定制与查询生成的交互同时影响这两块逻辑的插件选项集中在插件选项文档的schema一节见 docs/plugin-options.md 的schema部分典型如schema.perPage、schema.requestConcurrency、schema.timeout、schema.typePrefix。已抓取类型即可查询类型Fetched Types are Queryable Types查询生成过程中会记录哪些类型和字段被查询过这份清单随后被用于 Schema 定制任何因插件选项或内部逻辑而未抓取的字段/类型都会从 Gatsby Schema 中被省略。这保证了 Schema 与抓取数据严格一致也解释了为什么两个阶段必须共享同一份 introspection 结果源码中cacheFetchedTypes步骤正是把已抓取类型写入缓存的实现。自动字段前缀Automatic Field Prefixing当 Union 或 Interface 类型的多个成员包含同名字段时查询生成阶段会把这些字段自动加前缀为Typename.fieldNameSchema 定制阶段则配套实现 resolver 逻辑来应对这种重命名。文档强调[Typename].[fieldName]必须总能解析到单一类型把 union/interface 视为单一类型考虑否则大量接口/联合类型会因字段冲突而不可查询。Schema 缓存MD5 差异比对远程 Schema 摄取自带缓存机制见 src/steps/ingest-remote-schema/diff-schemas.js。其核心思路通过一次 GraphQL 请求同时拿到schemaMd5与 WordPressgeneralSettings.url顺带省一次请求把当前远程 Schema 的 MD5 与缓存中上次的 MD5 对比若 MD5 不同schemaWasChanged全部重新生成查询并重新执行 Schema 定制生产环境下这会触发插件重新抓取所有节点因为无法确定新 Schema 是否包含新增或变更的数据开发环境下只更新 Schema 并打印警告——如果 Schema 更新涉及数据变化提示开发者运行gatsby clean。文档给出一组关键性能数字没有这个机制时每次生产数据更新会慢 10–30 秒而开发环境下 Schema 变更若导致全量重抓每次修改 WPGraphQL Schema 都要等 5 分钟以上。diff 逻辑还顺带做了几件防御性工作校验pluginOptions.url与 WP 设置中 URL 的协议是否一致不一致会警告见 diff-schemas.js、在 Schema 变更时重新检查远程插件版本要求、以及处理硬缓存失效。值得注意的细节当缓存中已有 MD5 且本次是刷新非initial-createSchemaCustomization时Schema 变化会触发ensurePluginRequirementsAreMet重新校验 WPGraphQL/WPGatsby 版本兼容性见 diff-schemas.js。节点获取Sourcing Nodes节点抓取使用前面生成的查询通过游标分页cursor pagination从 WPGraphQL 拉取核心实现在 src/steps/source-nodes/fetch-nodes/fetch-nodes.jsfetchWPGQLContentNodes调用paginatedWpNodeFetch以schema.perPage为每页大小循环分页最终汇总allNodesOfContentType。影响抓取行为的插件选项文档明确指出以下选项直接影响节点抓取逻辑对应 src/steps/declare-plugin-options-schema.js 中schema一节的 Joi 定义选项默认值说明type.Type.limit视类型而定限制某类型抓取的节点数量schema.requestConcurrency15节点抓取期间的并发 GraphQL 请求数WP 服务器崩溃时可调低schema.perPage100节点抓取时每页抓取的节点数没有内置重试的游标分页及其原因插件当前没有为节点抓取内置请求重试逻辑这是有意为之的设计取舍游标分页是一条很长的请求链链上任何一次请求失败都会阻断后续所有请求。这带来两个限制单个节点类型内的请求并发被压到 1同一时刻只能有一个分页请求在途无法先把更耗资源的查询放到后面再重试同时继续处理其他查询。文档给出的未来方向是让 WPGatsby 支持一次返回最多 1 万个节点 id 的列表这些请求仍是游标分页拿到全部 id 后再构造按 id 批量取节点的查询从而提升请求并发并干净地重试失败请求如把单次请求的节点列表拆成两份以降低单次资源消耗。被引用的 MediaItem按需抓取 队列尾部重试节点抓取过程中每个节点都会用正则分析出指向MediaItem即 WPGraphQL 的 File 节点的连接 id见 src/steps/source-nodes/fetch-nodes/fetch-referenced-media-items.js。当其他所有节点类型抓取完成后插件拿着这些 id批量抓取 MediaItem——好处是只抓站点真正用到的文件很多 WP 管理员上传的文件数是实际用量的 5–10 倍。由于预先掌握了全部 id这批请求不需要游标分页从而可以运行更精巧的重试逻辑把失败请求追加到请求队列末尾重试而不是原地重试。作者在文档中记录了自己的实验结论把 MediaItem 请求放到队列尾部重试而非立即原地重试在 2 万 节点的大型站点上显著提升了抓取可靠性同时因为并发可以拉高小站点抓取也明显变快。源码中可以看到实现细节mediaFileFetchQueue使用PQueue文件下载并发默认受环境变量GATSBY_CONCURRENT_DOWNLOAD默认 200控制并预留 2 个给节点抓取重试超过 1 次会按timesRetried * 500毫秒暂停且最多重试 2 次见 fetch-referenced-media-items.js。兼容性 API面向 DX 与安全的设计插件依赖 WordPress 侧安装并启用WPGatsby与WPGraphQL两个 PHP 插件且必须版本匹配。由于无法假定远端站点将来会保持正确版本插件引入了远程兼容性 API版本范围定义在 src/supported-remote-plugin-versions.ts当前源码中的支持范围是WPGraphQL 1.1.2 3.0.0、WPGatsby 0.9.0 3.0.0校验逻辑areRemotePluginVersionsSatisfied在 src/steps/check-plugin-requirements.ts 中实现插件把版本范围而非精确版本发给 WPGatsby 暴露的wpGatsbyCompatibilityGraphQL 字段由远端判断自己的 WPGraphQL/WPGatsby 版本是否落在范围内。为什么只发版本范围而不是直接暴露版本号文档给出安全考量黑客可以扫描互联网上安装了存在漏洞版本插件的站点。如果只发送版本范围不含具体补丁版本号黑客无法确定某个有漏洞的版本是否已被修补从而更难精准定位存在漏洞的站点。这是把 DX 校验与安全设计结合的典型例子。状态管理RematchRedux 封装插件使用Rematch一个 Redux 封装库管理全局状态models 定义在 src/models/index.ts同目录下还有gatsby-api.ts、remoteSchema.ts、develop.ts、preview.ts、logger.ts等 model 文件。文档直言如果重新设计会选择状态机库且当前使用的是 Rematch 较老版本新版本 API 变动较大没有升级动力。Gatsby Node API helpers 存放在本地 Redux 而非 Gatsby Redux在每个 Node API 开始时setGatsbyApiToState见 src/steps/set-gatsby-api-to-state.ts会把 Gatsby Node API helpers如actions、cache、reporter、store等存入插件的 Rematch model。这样深层嵌套的函数无需层层传参就能使用 Gatsby 的 actions 与 helpers。比如 src/steps/source-nodes/index.ts 中就是通过getStore().getState().gatsbyApi取出helpers与pluginOptions。缓存体系三个组成部分插件缓存由三部分组成对应 docs/features/caching.md 的详细说明1. 远程 Schema 变化MD5 差异比对即上文所述的 diff-schemas.js生产环境 MD5 变化则全量重抓开发环境只更新 Schema 并警告运行gatsby clean。2. ActionMonitorWPGatsby 变更事件这是增量更新的核心机制冷构建完成后把当前时间戳存入缓存LAST_COMPLETED_SOURCE_TIME见 src/constants后续每次构建插件通过 GraphQL 查询把该时间戳发给 WPGraphQL/WPGatsby/WordPress询问自上次抓取以来发生了什么变化插件拉取一串变更事件actionMonitorActions遍历并处理CREATE / UPDATE / DELETE事件见 src/steps/source-nodes/update-nodes/wp-actions每次更新完成后写入新时间戳供下次查询使用。由于 WordPress 本身不存储这些事件WPGatsby 里存在大量自定义逻辑钩住 WordPress 的各种事件并把数据存入 WP 数据库对应 WPGatsby 仓库src/ActionMonitor目录。Gatsby 侧的增量入口是 fetch-node-updates.jsfetchAndApplyNodeUpdates({ since })调用fetchAndRunWpActions应用变更。3. 硬缓存文件与数据改善本地开发 DXGatsby 会主动清空缓存它不像源插件那样了解单个源的上下文为此插件增加了硬缓存选项把数据缓存在Gatsby 缓存之外避免安装 NPM 包或修改gatsby-config.js/gatsby-node.js导致重新抓取成百上千张图片或节点。相关选项定义在 src/steps/declare-plugin-options-schema.js 中搜索hardCacheMediaFiles和hardCacheData可定位实现develop.hardCacheMediaFiles/production.hardCacheMediaFiles默认false媒体文件硬缓存到项目根目录的./.wordpress-cache/path/to/media/file.jpegdevelop.hardCacheData默认falseWordPress 数据硬缓存到./.wordpress-cache/caches当远程 WPGraphQL Schema 变化或插件选项变化时会自动清空自身。实现上src/utils/cache.ts中Cache类基于cache-managercache-manager-fs-hash缓存目录为.wordpress-cache/caches。文档特别提醒这两个选项是实验性 API不保证数据有效性主要目的是提升本地开发 DX使用时应把.wordpress-cache目录加入.gitignore。Basic AuthBasic Auth 选项服务于服务器级认证而非 WP 级认证。设计原因是Gatsby 数据应视为公开数据任何非公开数据都不应暴露给 Gatsby否则可能通过 GraphQL 查询或运行中 Preview 实例的/__graphql端点意外泄露。该选项的目的是允许你把 WPGraphQL 的/graphql端点锁起来只允许带凭证的请求访问。详见 docs/features/security.md。调试选项插件提供了大量调试选项用于打印处理过程中的各类信息分散在代码库各处。全部调试选项集中收录在插件选项文档的debug一节见 docs/plugin-options.md 中debug部分例如debug.preview、debug.timeBuildSteps、debug.disableCompatibilityCheck等。另外pluginOptions.verbose控制是否输出更详细的日志在 diff-schemas.js 等多处可见其开关作用。插件选项 Schema 与文档生成插件选项 Schema 定义在 src/steps/declare-plugin-options-schema.js该文件故意不用 TS以便在 yarn 脚本中无需转译直接运行。它基于 Gatsby 的Joi插件选项校验体系每个选项都带有description与example元数据。自动化文档生成每次yarn build时同时执行yarn generate-plugin-options-docs该 npm 脚本运行仓库根目录的 generate-plugin-options-docs.js用插件选项 Schema 自动生成 docs/plugin-options.md。这意味着文档与 Schema 单源同步新增选项不会出现文档遗漏。gatsby develop的开发体验特性本地开发时插件会周期性检查 WP 侧的数据或 Schema 事件并自动响应无需重启即可实时更新数据/Schema。核心实现在 src/steps/source-nodes/update-nodes/content-update-interval.jscheckForNodeUpdates先暂停轮询读取上次抓取时间since lastCompletedSourceTime - 500发起一次 GraphQL 请求查询actionMonitorActions若有新事件则通过emitter.emit(WEBHOOK_RECEIVED)触发刷新重新运行 Schema 定制与sourceNodes若无事件则更新LAST_COMPLETED_SOURCE_TIME并恢复轮询轮询间隔由develop.nodeUpdateInterval选项控制默认5000ms见 declare-plugin-options-schema.js。此外ingestRemoteSchema在开发模式下有10 秒节流Date.now() - lastIngestRemoteSchemaTime 10000时直接返回见 src/steps/ingest-remote-schema/index.js防止同时收到大量 webhook 时反复摄取 Schema 造成抖动。WPGatsbyWPGatsbyWordPress 侧插件承担两大职责存储并向 Gatsby 暴露 WP 变更事件供 Gatsby 查询后更新数据/Schema向 WPGraphQL Schema 添加若干附加字段如schemaMd5、wpGatsbyCompatibility兼容性 API 字段这些是源插件运行所必需的。Preview预览机制Preview 逻辑一部分在 WPGatsby一部分在本插件。WPGatsby 拥有自己的 preview loader 逻辑与 WP 端的 Gatsby 进程双向通信插件侧全部 Preview 逻辑位于 src/steps/preview详细说明见其中的 preview.md。核心流程可概括为用户在 WP 后台点击 previewWPGatsby 对每次save_post做按帖去抖同一帖 5 秒内多个 webhook 只发一个并向 Preview 实例 POST 一个 webhook携带JWT 令牌Gatsby 用它查询私有预览修订数据、修订的父级数据库 id、是否为新建草稿、被预览节点类型、修订 id、WP 实例 URL、是否禁用修订、节点修改时间、以及preview: true标记Gatsby 侧收到刷新 webhook 后sourceNodes检测到 preview 标记转而调用sourcePreviews见 src/steps/source-nodes/index.ts通过 WPGraphQL 的asPreviewAPI 抓取预览节点并更新 Gatsby 节点onCreatePage阶段的两个函数协同onCreatepageSavePreviewNodeIdToPageDependency在预览模式下建立节点 id → 页面映射因此文档强调任何希望可预览的页面都必须在pageContext中放入节点 idonCreatePageRespondToPreviewStatusQuery在页面创建完成时把PREVIEW_SUCCESS状态回传给 WPGatsby未能在onCreatePage触发的残留回调在onPreExtractQueries阶段以NO_PAGE_CREATED_FOR_PREVIEWED_NODE状态统一回传runSteps的错误边界则会把出错回调标记为GATSBY_PREVIEW_PROCESS_ERRORPreview 前端在 45 秒超时后显示加载警告并提供 cancel and troubleshoot 调试入口。一个值得称道的性能优化Preview 路径移除了抓取前对本地/远程 Schema 的 diff改为先尝试更新、捕获 GraphQL 错误后再重新 diff Schema——这意味着在 WPGraphQL 中删除字段不会破坏 Preview除非该 Preview 恰好查询了那个字段。同样的思路后来推广到了整个gatsby develop收到 WPGatsby action 后先 diff Schema若不同则重跑createSchemaCustomization因此更新远程 Schema 后无需重启 Preview 或gatsby develop。文件处理MediaItem 与 File 两种节点插件中有两种相关的文件节点类型MediaItem包含媒体文件元信息的 WPGraphQL 节点如mediaDetails、sourceUrl等FileGatsby 的 file 节点类型挂在MediaItem.localFile上。关键设计MediaItem节点只在被其他节点通过 GraphQL connection 引用时才抓取见 fetch-referenced-media-items.js避免抓取管理员上传但从未使用的海量文件本地File节点作为抓取MediaItem节点的副作用产生通过beforeChangeNode插件选项接入WpMediaItem默认选项定义在 src/models/gatsby-api.ts由于预先掌握全部在用的 MediaItem id这些请求无需分页可以任意并发级别并行化并能在请求队列尾部重试失败请求lazyNodes选项某些场景下用户不想抓取所有MediaItem上的File节点此时把type.MediaItem.lazyNodes设为trueFile节点改为在GraphQL resolver 中惰性抓取而非 sourceNodes API 阶段对应 src/models/gatsby-api.ts 的默认选项与 transform-object.js 中的 resolver 实现MediaItem.localFile子选项还支持excludeByMimeTypes按 MIME 类型排除、maxFileSizeBytes默认 15MB15728640字节、requestConcurrency默认 100见 gatsby-api.ts。HTML 处理节点数据中的 HTML 通过正则查找/替换在每个节点的 JSON 字符串化结果上统一处理而非逐字段递归遍历因为复杂数据结构下逐字段遍历的性能代价很大。核心实现在 src/steps/source-nodes/create-nodes/process-node.js该文件还包含 GatsbyImage 占位图 URL 的推导逻辑getPlaceholderUrlFromMediaItemNode。处理的内容包括指向 WP 的锚点链接改为相对链接文件链接CSSbackground-image、指向文件的锚点等转换为静态 Gatsby 文件img标签转换为使用静态文件的 Gatsby 图片支持自定义正则查找/替换任意字符串。处理过程中插件会按需抓取MediaItem节点如果按 URL 能找到和/或File节点按MediaItem.sourceUrl或 HTML 中的 URL 查找。非节点 Root 字段除节点外插件还会抓取能合理抓取的根字段如 ACF options。任何需要输入参数的字段会被自动跳过。这些字段在每次数据更新时都会重新抓取——因为不挂在节点上的数据无法用 WPGatsby 事件描述变更。实现在 src/steps/source-nodes/create-nodes/fetch-and-create-non-node-root-fields.js它用remoteSchema.nonNodeQuery查询 WPGraphQL把结果包装成一个 id 为${pluginOptions.url}--rootfields的单一节点typeName 为schema.typePrefix并通过createNodeWithSideEffects创建。总结从架构上看gatsby-source-wordpress的设计可以用三个关键词概括单次 introspection、双阶段复用同一次远程 Schema introspection 同时服务于查询生成与 Schema 定制并通过已抓取类型才可查询字段自动前缀Schema MD5 diff三者保证两端严格一致分层缓存对抗不确定性Schema MD5 diff 解决Schema 变了没、ActionMonitor 解决数据变了没、硬缓存解决Gatsby 缓存清了没三层机制分别应对生产增量、开发实时性与本地 DX按需抓取 队列重试MediaItem/File 只在被引用时抓取配合队列尾部重试策略解决大型站点2 万 节点的抓取可靠性问题。理解这份架构无论是阅读 src/steps 源码、调试抓取异常还是二次开发自己的 GraphQL 源插件都会事半功倍。赞分享前端静态站点Web框架【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址https://gitcode.com/gh_mirrors/ga/gatsby点击查看免费下载相关推荐使用 gatsby-source-wordpress 从 WordPress 拉取数据完整实战指南使用 gatsby source wordpress 从 WordPress 拉取数据完整实战指南 本篇指南将带你完成 Gatsby 与 WordPress前端静态站点Web框架Gatsby 基于 WPGraphQL 的 WordPress 数据源基准测试站点benchmarks/source-wordpress 全解析Gatsby 基于 WPGraphQL 的 WordPress 数据源基准测试站点benchmarks/source wordpress 全解析 在 Gats前端静态站点Web框架Gatsby 从文件系统获取数据Filesystem Sourcinggatsby-source-filesystem 完整使用指南Gatsby 从文件系统获取数据Filesystem Sourcinggatsby source filesystem 完整使用指南 本指南基于 Gats前端静态站点Web框架上一篇three.js 核心 API 精讲InstancedInterleavedBuffer 实例化交错缓冲区完全指南下一篇5分钟掌握Pose-Search如何用人体姿态实现智能图像搜索创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

聚焦具身智能教育,华清远见发布三款硬件新品与课程体系2.0 2026/9/21 3:22:14

聚焦具身智能教育,华清远见发布三款硬件新品与课程体系2.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
STM32结构体封装原理与GPIO初始化设计解析 2026/9/21 3:22:14

STM32结构体封装原理与GPIO初始化设计解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
linsa 开源路线图前瞻:如何第一时间关注并参与这个即将开源的私有云项目 2026/9/21 3:22:14

linsa 开源路线图前瞻:如何第一时间关注并参与这个即将开源的私有云项目

linsa 开源路线图前瞻:如何第一时间关注并参与这个即将开源的私有云项目 【免费下载链接】linsa Work. Save. Share. Privately. 项目地址: https://gitcode.com/gh_mirrors/le/linsa linsa 是一个即将开源的私有云存储项目,核心卖点是端到端加密…

阅读更多 →
Voyager 入門ガイド:Gemini にタイムライン・フォルダ・プロンプト管理を組み込む 5 分間セットアップ 2026/9/21 3:22:14

Voyager 入門ガイド:Gemini にタイムライン・フォルダ・プロンプト管理を組み込む 5 分間セットアップ

AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用…

阅读更多 →
DDR5内存SPD Hub深度解析:JESD300-5A规范与SPD5118/5108实战指南 2026/9/21 3:22:14

DDR5内存SPD Hub深度解析:JESD300-5A规范与SPD5118/5108实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
嵌入式下载故障排查:ST-LINK与GD32 Programmer典型问题解决 2026/9/21 3:19:14

嵌入式下载故障排查:ST-LINK与GD32 Programmer典型问题解决

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞