
Gatsby v3.14 发布说明部署中的导航体验修复、GraphQL 聚合查询新能力与 v4 迁移铺垫【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址: https://gitcode.com/gh_mirrors/ga/gatsby本篇文章基于 Gatsby 官方发布说明文档系统梳理gatsby3.14.02021 年 9 月第一期的核心变更自动修复部署过程中因 JS chunk 变更导致的页面导航失败、GraphiQL 新增createPages代码片段生成、group字段新增聚合能力max/min/distinct/sum以及为 Gatsby v4 铺路的 API 弃用与相关插件的改进。读完本文你将理解这些新能力的用法、适用场景并能在源码层面packages/gatsby 目录印证其实现原理。版本背景gatsby3.14.0是Gatsby v3 的最后一个 minor 版本发布于 2021 年 9 月。Gatsby v4 beta 已以nextnpm tag 发布下一个稳定版本为gatsby4.0.0。官方承诺在4.0.0稳定版发布后仍会继续发布3.14.x补丁hotfix至少数周。如果你希望提前体验新特性可以安装gatsbynext。1. 部署过程中的导航体验改进硬刷新兜底1.1 问题场景这是社区长期反馈的一个经典痛点曾是仓库中投票数最高的问题之一。想象如下场景用户加载了一个页面此时站点部署了新版本用户点击gatsby-link尝试导航到另一个页面。结果却是页面毫无反应控制台出现若干 JS 错误。1.2 根本原因Gatsby 采用按路由拆分的 webpack chunk 机制每次构建都会生成带新 hash 的 chunk 文件路径。当用户在旧版本页面停留时浏览器内存中缓存的旧 chunk 路径已经在新部署后失效——浏览器尝试请求旧 chunk 失败导航因此中断。1.3 解决方案该版本在 Gatsby 内部自动处理了这一错误一旦检测到 chunk 加载失败会自动对页面执行硬刷新hard reload让用户拿到最新版本的前端资源。从源码实现看这一兜底逻辑位于 packages/gatsby/cache-dir/navigation.js// Catch unhandled chunk loading errors and force a restart of the app. let nextRoute window.addEventListener(unhandledrejection, event { if (/loading chunk \d* failed./i.test(event.reason)) { if (nextRoute) { window.location.pathname nextRoute } } })实现要点通过window.addEventListener(unhandledrejection, ...)监听未处理的 Promise rejection用正则/loading chunk \d* failed./i匹配 webpack 的 chunk 加载失败错误若此时存在目标路由nextRoute由onPreRouteUpdate在导航前记录则将window.location.pathname直接指向目标路径触发浏览器整页加载。配套的导航逻辑还处理了另一类部署相关问题在 navigation.js 中当加载到的页面资源webpackCompilationHash与当前窗口记录的不一致说明服务器端发生了重新构建同样会触发整页跳转若检测到已激活的 service worker还会先向其发送clearPathResources消息以清理gatsby-plugin-offline的路径资源缓存。1.4 实战建议升级到gatsby3.14.0或任意3.14.x后上述场景无需任何配置即可获得自动硬刷新兜底配合gatsby-plugin-offline时service worker 的缓存清理也已纳入该流程进一步降低旧资源残留概率。2. 新开发者工具2.1 GraphiQL 中生成createPages代码片段开发者通常先在 GraphiQL 中探查数据层再基于初始查询创建页面。例如在 GraphiQL 中执行query MyQuery { allContentfulBlogPosts { nodes { id slug } } }随后在gatsby-node.js里手写createPages逻辑const path require(path) exports.createPages async ({ graphql, actions }) { const { createPage } actions const result await graphql( { allContentfulBlogPosts { nodes { id slug } } } ) const templatePath path.resolve(PATH/TO/TEMPLATE.js) result.data.allContentfulBlogPosts.nodes.forEach(node { createPage({ path: NODE_SLUG, component: templatePath, context: { slug: NODE_SLUG, }, }) }) }手动编写这套样板既繁琐又易错。本版本起你可以直接从 GraphiQL 生成这段代码片段并粘贴到gatsby-node.jsGraphiQL 会依据当前查询自动生成等价的createPages实现包括graphql调用、遍历nodes、createPage的path/component/context结构开发者在粘贴后只需替换模板路径与占位符即可。2.2group新增聚合字段max/min/distinct/sum/group这是本版本对 GraphQL 数据层的重要增强group结果现在支持嵌套的聚合字段max、min、distinct、sum并且可以继续对分组结果再次执行group多层分组。例如{ allMarkdown { group(field: frontmatter___authors___name) { fieldValue group(field: frontmatter___title) { fieldValue max(field: frontmatter___price) } } } }该查询先按作者姓名分组再在每组内按标题二次分组并计算每组的frontmatter___price最大值——聚合字段对分组节点集生效而非原始连接connection。源码级原理聚合与分组的 resolver 实现在 packages/gatsby/src/schema/resolvers.ts 中连接查询入口findManyPaginated会通过getProjectedField探测查询选择集中的group、distinct、max、min、sum字段并透传给底层查询resolvers.ts确保这些聚合字段在分组结果中被正确解析createDistinctResolver遍历分组内节点用Set去重后返回排序后的去重值数组日期值会被规范化为 ISO 字符串resolvers.tscreateMinResolver/createMaxResolver遍历分组内节点取值并比较值会被Number()归一化非数值isNaN被忽略当分组为空或没有有效数值时返回nullresolvers.tscreateSumResolver对有效数值累加求和同样在无可求和值时返回nullresolvers.tscreateGroupResolver按字段值把节点聚合成以字段值为 key 的分组数组字段会拆分为多个分组分组按字段值排序且每组本身就是一个可分页的连接带pageInfo从而支持嵌套group与分页参数resolvers.ts。使用注意事项聚合仅对数值字段max/min/sum有意义非数值字段会被尝试Number()转换后忽略无效值distinct与group同样支持嵌套字段路径如frontmatter___authors___name与日期字段聚合在分组结果上计算因此请先通过group(field: ...)或distinct(field: ...)明确分组维度。3. 为 Gatsby v4 做准备API 弃用与迁移自本版本起用于 schema 自定义的 actions 不应再在sourceNodesAPI 中使用具体包括createTypescreateFieldExtensionaddThirdPartySchema在这些 actions 于sourceNodes中使用即视为弃用并将在 Gatsby v4 中直接失效build 报错。迁移建议将 schema 自定义createTypes、createFieldExtension、addThirdPartySchema迁移到专门的createSchemaCustomizationAPI 中执行在sourceNodes中只保留节点创建createNode、更新createParentChildLink等数据源职责关注仓库内的官方迁移指南 migrating-from-v3-to-v4.md其中列举了其余即将到来的破坏性变更。提示官方同期维护的迁移文档当时标记为 work in progress正式升级前请以 migrating-from-v3-to-v4.md 及你实际使用的插件 README 为准。4.gatsby-source-drupal的多项改进本版本为gatsby-source-drupal源码位于 packages/gatsby-source-drupal在 warm / incremental build增量构建场景下带来了大量修复与增强修复删除节点时引发的 GraphQL schema 错误与崩溃涉及多个 PR如删除节点时的 schema 报错、schema 重建崩溃等确保增量构建中节点删除被正确处理对格式错误的 webhook 给出警告当 webhook 载荷格式不符合预期时不再静默失败而是输出明确警告为全量/增量拉取与 HTTP 请求添加 tracing方便在构建中定位 Drupal 数据拉取的耗时瓶颈。这些改动直接服务于「内容变更 → webhook 触发 → Gatsby 增量构建」的持续集成链路降低了内容站点在频繁发布时的构建稳定性风险。5.gatsby-plugin-netlify迁移到新仓库自本版本起gatsby-plugin-netlify的开发与维护已迁移至 Netlify 官方维护的新仓库后续新版本与源码均在新仓库发布。使用该插件的项目应留意旧版 npm 包名仍可继续使用但新功能与修复将优先在迁移后的版本中提供部署到 Netlify 时建议关注新版插件 README 中的配置说明包括 headers、redirects 等能力的对应改动。6. Notable bugfixes improvements重要修复与改进清单本版本还包含一批影响面较广的修复按包划分如下gatsby核心条件化页面构建conditional page builds与静态查询static queries兼容修复了静态查询在增量/条件构建下 hash 未更新的问题使静态查询结果能随数据变化正确重建减小 page-renderer 体积优化页面渲染器打包产物有助于降低首屏资源体积修复 tracing spans 嵌套 补充 OpenTelemetry 文档完善分布式追踪上下文不再打包 moment locale 文件显著减小打包体积moment 的 locale 文件数量多、体积大新增环境变量用于指定 tracing 配置文件路径可通过环境变量覆盖默认的 tracing 配置为缺失的 activities 补充parentSpan让追踪树结构更完整。gatsby-source-contentful修复 Unable to download asset 错误对资源下载失败增加重试机制避免瞬时网络问题导致构建中断。gatsby-transformer-sqip确保失败的资源下载不会中断构建即使某张图片的下载失败构建也能继续完成而非整体失败。gatsby-plugin-google-tagmanager支持从自托管self-hosted的 tagging server 提供gtm.js新增selfHostedOrigin配置项。源码中该选项由 Joi 校验字符串类型见 gatsby-node.js默认值为https://www.googletagmanager.com且会去除末尾的/gatsby-ssr.js会根据该值生成gtm.js脚本与ns.htmliframe 地址见 gatsby-ssr.js。配置示例// gatsby-config.js module.exports { plugins: [ { resolve: gatsby-plugin-google-tagmanager, options: { id: GTM-XXXXXXX, selfHostedOrigin: https://tag.example.com, // 自托管 tagging server }, }, ], }gatsby-plugin-styled-components支持禁用 vendor prefixes厂商前缀新增disableVendorPrefixes选项。源码中该选项由 Joi 校验为布尔值见 gatsby-node.js并透传给 styled-components 的disableVendorPrefixesprop见 gatsby-browser.js。若你的目标浏览器已无需旧前缀可关闭以获得更干净的产物// gatsby-config.js module.exports { plugins: [ { resolve: gatsby-plugin-styled-components, options: { disableVendorPrefixes: true, }, }, ], }7. 升级建议与版本配套升级方式在项目根目录执行npm install gatsby^3.14.0或使用 yarn随后按上述章节核对gatsby-config.js中的插件配置插件联动若使用了gatsby-plugin-google-tagmanager的自托管能力或gatsby-plugin-styled-components的disableVendorPrefixes请确认插件版本已包含本版本对应功能为 v4 做准备尽早将 schema 自定义 actions 从sourceNodes迁出并审阅 migrating-from-v3-to-v4.md历史版本参考可对比上一版本发布说明 v3.13 Release Notes了解本版本相对上一期的增量变化后续 v4 时代的版本说明见 v4.0 及以后各版本目录。以上内容对应的完整实现均可直接在仓库内验证部署导航兜底逻辑见 packages/gatsby/cache-dir/navigation.js聚合/分组 resolver 见 packages/gatsby/src/schema/resolvers.ts两个插件的选项实现分别见 gatsby-plugin-google-tagmanager 与 gatsby-plugin-styled-components 包。【免费下载链接】gatsbyReact-based framework with performance, scalability, and security built in.项目地址: https://gitcode.com/gh_mirrors/ga/gatsby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考