nx.dev 文档站架构解析Canary 预览、版本化快照与构建时 Banner 机制【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nxnx-dev/nx-dev/是 Nx 官方文档站点 nx.dev 的 Next.js 应用仓库目录负责承载网站页面与一组配套库libs。本文基于仓库中的 nx-dev/nx-dev/README.md从「Canary 文档预览」「版本化文档快照」「站点浮层 Banner 配置」三条主线结合 scripts/create-versioned-docs.mts 等源码完整还原这套文档站点的构建、发布与内容管理机制。读完本文你将理解 Nx 如何用 Netlify 分支部署为每个大版本保留历史文档、如何用孤儿分支固化静态快照以及如何通过环境变量在构建期注入由 Framer CMS 驱动的公告 Banner。目录结构与应用定位从仓库根目录看nx-dev/是一个由 Nx 管理的工作区目录其中包含多个nx/nx-dev-*工作区库如data-access-documents、feature-ai、ui-common等而nx-dev/nx-dev/是唯一的 Next.js 应用即 nx.dev 网站的载体。该应用的依赖在 nx-dev/nx-dev/package.json 中定义基于next14.2.35、react18.3.1内容渲染使用markdoc/markdoc并引用supabase/supabase-js、openai、ai等运行时依赖同时通过workspace:*协议链接各内部库。构建目标定义在 nx-dev/nx-dev/project.jsonnext:build— 执行 Next.js 构建输出到nx-dev/nx-dev/.next其 inputs 中包含NEXT_PUBLIC_NO_INDEX等环境变量sitemap— 依赖next:build用next-sitemap --config ./next-sitemap.config.js生成 sitemap 并调用scripts/patch-sitemap-index.mjs修补索引copy-redirects— 将nx-dev/nx-dev/_redirects拷贝到.next/_redirectsbuild/deploy-build— 聚合以上目标的顶层构建入口其中deploy-build是 Netlify 在 UI 中配置的部署命令npx nx run nx-dev:deploy-build:netlify --skip-nx-cache所对应的目标。注意README 明确指出主文档站目前已迁移到astro-docs/Astro Starlightnx-dev/nx-dev这份 Next.js 应用仅作为旧大版本Nx 18–20的版本化快照构建来源待这些版本退役后将停止版本化。权威的版本化工作流说明见 astro-docs/README.md。Canary 文档跟随 master 的实时预览canary.nx.dev是 Netlify 针对canary孤儿分支orphan branch的一次分支部署branch deploy用于预览尚未发布的文档内容。其工作方式极具巧思该分支的netlify.toml将/docs/*路径代理到https://master--nx-docs.netlify.app/docs/:splat因此文档内容实时来自 master 分支的 astro-docs 部署而非文档路径则一律 301 跳转到/docs/getting-started/intro。由于该分支不执行任何构建canary分支本身无需随 master 更新——master 的部署一旦完成canary 站点随之自动获得最新内容。从实现角度看这本质上是把「预览站点」与「内容构建」解耦内容由 master 的持续部署产出canary 只做一层代理与重定向壳避免了为预览环境重复构建的成本。版本化文档为大版本固化静态快照当新的 Nx 大版本发布或即将发布时需要为上一大版本保留一份可访问的历史文档统一托管在{major}.nx.dev例如22.nx.dev。README 描述的整体方案是在孤儿分支上存放预构建的静态站点快照并通过 Netlify 分支部署上线。创建快照的命令与流程从仓库根目录执行 scripts/create-versioned-docs.mts# Nx 21构建 astro-docsAstro/Starlight 站点 node ./scripts/create-versioned-docs.mts 22 # Nx 18–20构建本 Next.js 应用并静态导出—— 遗留路径 node ./scripts/create-versioned-docs.mts 20 # 退役一个旧版本站点跳过构建将所有路径 301 到 nx.dev/docs node ./scripts/create-versioned-docs.mts 16 --redirect-to-prod脚本的核心执行序列与 scripts/create-versioned-docs.mts 源码一致定位最新稳定标签git fetch --tags --force origin后用findLatestStableTag解析形如22.*且不含连字符排除预发布的标签按语义化版本号排序取最大者如22.6.4若该大版本不存在任何稳定标签则回退到当前分支构建检出并构建git checkout到该标签执行pnpm install --frozen-lockfile再按版本分支走buildAndStageAstrov21pnpm nx build astro-docs --force或buildAndStageNextjsv18–20静态导出两条路径创建孤儿分支git checkout --orphan {major}-tmp后清空工作树仅将「预构建静态站点 最小脚手架」提交进分支最终git branch -M {major}重命名返回原分支git clean -fd清理孤儿分支遗留文件后git checkout回到最初分支。分支上保留的最小脚手架孤儿分支刻意保持极简只包含五类文件目的是让 Netlify UI 配置的构建命令「瞬间成功」见writeSharedScaffolding实现根package.json名为nx/nx-docs-versioned的私有包仅声明devDependencies: { nx: 当前版本 }保证 Netlify 安装依赖成功根nx.json空对象配置pnpm-lock.yaml由脚本用pnpm install --lockfile-only --no-frozen-lockfile现场生成根netlify.toml覆盖 Netlify UI 构建设置——构建命令为npx nx run nx-dev:deploy-build:netlify --skip-nx-cachepublish目录固定为nx-dev/nx-dev/.next必须与 UI 中配置的发布目录一致并通过NETLIFY_NEXT_PLUGIN_SKIP true禁用自动安装的netlify/plugin-nextjs从而让 Netlify 以纯静态文件方式提供服务不触发任何重建一个名为nx-dev的 no-op 项目位于nx-dev/nx-dev/project.json其deploy-build目标被覆盖为command: echo Pre-built static site使上述 Netlify 构建命令立即返回成功。归档文档的搜索引擎屏蔽版本化文档是历史归档不能与 nx.dev 主站竞争搜索结果。脚本通过两道防线实现noindex构建期环境变量NEXT_PUBLIC_NO_INDEX true与NX_DOCS_NO_INDEX true让每个页面在构建时输出meta namerobots contentnoindex构建后兜底normalizeRobotsMeta遍历发布目录所有.html强制改写/注入noindexmeta覆盖个别 frontmatter 固定了index, follow的页面以及无 head 的静态产物ensureNoindexHeader则向netlify.toml的[[headers]]块追加X-Robots-Tag: noindex该响应头对非 HTML 资源同样生效且页面内 JS 无法覆盖。分支的推送与部署快照分支创建完成后强制推送即可上线git push -f origin 22--force标志用于覆盖已存在的本地/远端{major}分支若分支已存在而未加--force脚本会直接报错退出。版本化站点通过主nx-devNetlify 站点的分支部署提供服务域名管理在 SquarespaceNetlify每个{major}分支作为分支部署发布。分支根部的netlify.toml覆盖 UI 构建设置直接服务预构建静态文件不重建、不加载netlify/plugin-nextjs。需要先把该分支加入站点的分支部署白名单allowlist再将{major}.nx.dev作为指向该分支部署的域名别名domain aliasSquarespacenx.dev的 DNS 在 Squarespace 管理为{major}添加一条指向 Netlify 分支部署主机名的 CNAME 记录即可。主站 nx-dev/nx-dev/netlify.toml 中还保留了对旧版本子域名的批量 308 重定向如16.nx.dev、17.nx.dev重定向到nx.dev/:splat19.nx.dev、20.nx.dev重定向到v19.nx.dev、v20.nx.dev等确保历史链接不失效。退役旧版本--redirect-to-prod--redirect-to-prod模式跳过全部构建stageRedirectToProd实现脚本仍生成与 UI 一致的发布目录nx-dev/nx-dev/.next在其中放置一个带noindex、canonical和 JS 跳转的index.html并在netlify.toml中用[[redirects]] from /* to https://nx.dev/docs status 301 force true把所有路径强制 301 到主文档站首页。当某个旧版本不再维护、原路径也无法一一对应时就用这种方式优雅下线而非继续维护其文档。浮层 Banner构建时从 Framer CMS 拉取公告文档站点顶部/角落的浮动 Banner 用于推广活动与网络研讨会。README 明确指出它在构建期从 Framer CMS 页面抓取并本地落盘而非运行时请求。配置方式设置环境变量NEXT_PUBLIC_BANNER_URL指向一个渲染 Banner JSON 的 Framer 页面NEXT_PUBLIC_BANNER_URLhttps://your-framer-site.framer.app/api/banners/main该 Framer 页面应将 JSON 包裹在pre标签内返回形如{ title: Event Title, description: Event description, primaryCtaUrl: https://..., primaryCtaText: Learn More, secondaryCtaUrl: , secondaryCtaText: , enabled: true, activeUntil: 2025-12-31T00:00:00.000Z }字段 SchemaFieldTypeRequiredDescriptiontitlestringYesBanner headlinedescriptionstringYesBanner body textprimaryCtaUrlstringYesPrimary button URLprimaryCtaTextstringYesPrimary button textsecondaryCtaUrlstringNoSecondary button URLsecondaryCtaTextstringNoSecondary button textenabledbooleanYesShow/hide the banneractiveUntilISO 8601NoAuto-hide after this date运行行为Banner 在prebuild-banner目标执行期间被拉取保存为lib/banner.json集合数组形式由于是构建期抓取更新 Banner 必须重新构建/重新部署用户可手动关闭 Banner关闭状态存入localStorage当enabled为false或activeUntil已过时Banner 不展示未设置NEXT_PUBLIC_BANNER_URL时生成空集合Banner 自然不出现。从源码看前端渲染由 nx-dev/ui-common/src/index.ts 导出的AnnouncementBanner组件nx-dev/ui-common/src/lib/announcement-banner.tsx承担nx-dev/ui-common/src/lib/webinar-notifier.tsx 中则能看到banner-${id}-dismissed这样的 localStorage 存储键以及过期判断逻辑与 README 描述的行为一一对应。另外nx-dev/nx-dev/eslint.config.mjs 将lib/banner.json列入 ignore说明该生成文件被当作构建产物对待不应提交入库。与 astro-docs 的关系与迁移现状需要特别说明的是nx.dev 主站内容体系正处于迁移期。README 中明确「The primary docs site now lives inastro-docs/」——当前主力文档站由 astro-docsAstro Starlight Markdoc承载nx-dev/nx-dev这份 Next.js 应用只被构建为旧大版本Nx 18–20的版本化快照相关逻辑在 scripts/create-versioned-docs.mts 中标记了 TODO待 v21 成为唯一维护对象后将被整体删除。两个站点在架构上仍共享同一套理念版本化快照机制对 astro-docs 同样适用v21 走buildAndStageAstroBanner 配置也在 astro-docs/README.md 中有对应版本环境变量名为BANNER_URL落盘位置为src/content/banner.json通过 Astro content collection 的file()loader 加载并做 schema 校验。如果你在阅读旧文档站相关代码时遇到与 astro-docs 重叠的概念版本化、Banner建议以 astro-docs 目录下的实现为准。【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考