ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

解析 `@tinacms/metrics` 变更日志:TinaCMS 遥测包从 CJS 到 ESM 的演化与工程治理实践

解析 `@tinacms/metrics` 变更日志:TinaCMS 遥测包从 CJS 到 ESM 的演化与工程治理实践 解析tinacms/metrics变更日志TinaCMS 遥测包从 CJS 到 ESM 的演化与工程治理实践【免费下载链接】tinacmsTinaCMS is the leading open-source headless CMS that supports Markdown and Visual Editing. Your content is stored in your own GitHub repo ❤️项目地址: https://gitcode.com/GitHub_Trending/ti/tinacms本文基于仓库中packages/tinacms/metrics/CHANGELOG.md展开逐条解析tinacms/metrics包从 0.0.2 到 2.1.3 的完整版本演进并结合其源码与相关模块深入讲解遥测上报原理、ESM 迁移、依赖治理以及多仓库生成文件路由等工程细节。导读tinacms/metrics是 TinaCMS 仓库GitHub_Trending/ti/tinacms中负责开源遥测Open Source Telemetry的独立 npm 包它为tinacms/cli等工具提供“匿名、可关闭”的使用数据上报能力。本文以该包的 CHANGELOG.md 为主干围绕遥测上报机制、CommonJS 到 ESM 迁移、依赖与工具链治理、多仓库multi-repo生成文件路由四条主线展开。读者读完将掌握该包的完整演进史、其源码级实现细节以及这些变更如何影响 TinaCMS CLI 的日常使用与自托管部署。一、包定位它是谁服务于谁tinacms/metrics是 monorepo 中packages/tinacms/命名空间下的一个 Node 端小包。从 package.json 可以看到它的关键信息当前版本2.1.3许可证为 Apache-2.0入口为dist/index.js声明type: module即当前形态是ESM-only这也对应了 2.0.0 的 Major Change仓库字段声明repository.directory指向本包自己的目录packages/tinacms/metrics——这正是 2.1.3 修复的内容构建、测试脚本分别为tinacms-scripts build与jest --passWithNoTests。它的源码只有 6 个文件src/index.ts 导出./telemetry与./interfaces核心是一个Telemetry类与若干工具函数。它本身不直接面向最终用户而是被tinacms/cli在init、dev、audit等命令中调用如packages/tinacms/cli/src/cmds/init/apply.ts中new Telemetry({ disabled: noTelemetry })后调用submitRecord。二、从 0.0.2 到 1.0.0遥测系统从无到有CHANGELOG 底部0.0.2、0.0.3记录了遥测能力的最初形态0.0.2新增基础开源遥测Added basic open source telemetry并更新了 metrics 载荷payload的结构Update the shape of the mertics payload0.0.3为tinacmsCLI 增加schemaFileType选项默认ts同时将 telemetry 模块升级为可选检查NO_TELEMETRY环境变量以禁用遥测1.0.0随 Tina 1.0 发布对应 CHANGELOG 中的 “Tina 1.0 Release”并提示用户升级到 iframe 路径。NO_TELEMETRY机制至今仍保留在源码中。在packages/tinacms/metrics/src/telemetry/telemetry.ts的构造函数里constructor({ disabled }: { disabled: any }) { this.projectIDRaw getID(); const { NO_TELEMETRY } process.env; this._disabled NO_TELEMETRY 1 || NO_TELEMETRY true || Boolean(disabled); }即三路禁用环境变量NO_TELEMETRY1/NO_TELEMETRYtrue或通过构造参数disabled显式关闭。CLI 侧如audit命令的--no-telemetry标志会把disabled传进来。遥测上报的完整链路submitRecord是唯一的上报入口其实现telemetry.ts值得逐段解读禁用即返回if (this.isDisabled) return;确保关闭后零网络开销匿名 IDconst id this.projectId而projectId是对projectIDRaw做SHA-256 单向哈希oneWayHash。哈希值由getID()产生优先取git config --local --get remote.origin.urlGit 远端地址失败则回退到process.env.REPOSITORY_URL再回退到process.cwd()。关键点上报的是远端 URL 的哈希而非明文避免直接泄露仓库地址载荷组装MetricPayload结构在interfaces/index.ts中定义包含partitionKey与data内含anonymousId、event、properties。properties由事件字段与基础字段合并MergeEvents, EventBaseProperties基础字段包括nodeVersion、tinaCliVersion、tinaVersion、yarnVersion、npmVersion、CI版本探测getVersion.ts通过读取当前工作目录package.json的dependencies.tinacms与devDependencies[tinacms/cli]或dependencies[tinacms/cli]得到版本号yarn -v、npm -v则用execSync执行超时 1 秒发送与容错fetchPOST 到https://metrics.tina.io/record开发环境可用https://metrics-stage.tinajs.dev/record整段被 try/catch 包裹任何异常都静默吞掉——遥测绝不影响用户正常使用注释原文If there is errors here it should not effect the user。值得注意从 2.0.1 起发送改用全局fetch移除isomorphic-fetch依赖这与 2.0.0 的 ESM 迁移一脉相承。事件类型清单interfaces/index.ts定义了 7 种事件Events联合类型对应 CLI 的各个使用场景事件名附加属性create-tina-app:invoketemplate、pkgManagertinacms:cli:audit:invokeclean、useDefaultstinacms:cli:init:invokeschemaFileType?、hasForestryConfig?tinacms:cli:server:start:invoke无tinacms:cli:server:errorerrorMessagetinacms:cli:dev:invokehasLocalContentPathtinacms:cli:build:invokehasLocalContentPath事件在 CLI 侧触发例如dev-command/index.ts中new Telemetry({ disabled: this.noTelemetry })后submitRecord而audit-command/audit.ts会带上clean、useDefaults两个布尔值。三、1.0.x 阶段工具链与依赖的渐进式治理1.0.1 到 1.0.9 的 Patch 版本集中体现了 monorepo 的日常维护节奏1.0.1新增 Forestry 用户迁移工具Add a migration tool for forestry users1.0.2移除 license 头Remove license headers1.0.3更新 TypeScript、移除rimraf、修复类型并把包管理器从 Yarn 统一为 pnpmRemove yarn for pnpm1.0.4create-tina-app增加 pnpm 选项1.0.5升级存在漏洞的依赖包以满足npm audit并将 Next.js 从 12 升级到 14tinacms 包内1.0.6TypeScript 升到 v5.5、types/node升到 v22.x、Next.js 升到 14.x 最新版同时移除node-fetch为后续使用全局fetch铺路1.0.7 / 1.0.8继续更新 minor/patch 依赖1.0.9跨包依赖更新。这一系列版本展示了依赖治理的递进路径先满足安全扫描1.0.5再统一工具链1.0.3 的 pnpm 化最后系统性升级 TypeScript 与 Node 类型1.0.6——每一步都为后续 2.0.0 的 ESM 迁移降低阻力。四、2.0.0CommonJS 到 ESM 的迁移2.0.0 是本包最重要的 Major Changefeat: migrate from commonjs to esm。这解释了为什么 package.json 现在声明type: module且main指向dist/index.js。与 ESM 迁移相关的后续变化包括2.0.1tinacms/metrics移除isomorphic-fetch依赖改用全局fetch。Node 18 内置的全局fetch基于 undici使该包不再需要为 HTTP 上报引入第三方实现同批变更还包括tinacms/cli移除log4js改用自研 logger、chalk升级到 v5ESM-only等2.1.2getVersion.ts中的readFileSync已直接来自node:fs见 getVersion.ts配合移除fs-extrapeer 依赖进一步瘦身。从源码看ESM 化的痕迹非常清晰crypto、child_process、node:fs、node:path均使用标准模块导入配合type: module与 build 配置package.json 中entryPoints指向src/index.ts、target: node。实践启示如果你的 Node 工具链仍停留在 CJS直接引用本包会遇到 ESM 互操作问题Node 18 环境具备全局 fetch是它的运行前提。五、2.1.0多仓库模式下生成文件的路径路由重点2.1.0 是内容最丰富的一个 Minor 版本解决的是multi-repo生成器仓库 内容仓库分离场景下的一个架构性问题生成的中间产物_schema.json、_graphql.json、_lookup.json、tina-lock.json此前会被写入内容仓库现在改为主机仓库的tina/__generated__/。其要点如下。变更核心当设置了localContentPath时生成文件只存在于生成器仓库的tina/__generated__/内容仓库不再要求必须包含tina/文件夹FilesystemBridge.get/put/delete对tina/__generated__/与.tina/__generated__/前缀的路径改向rootPath生成器路由而不是outputPath内容根目录。这在源码中有直接体现packages/tinacms/graphql/src/database/bridge/filesystem.ts定义了GENERATED_PATH_PREFIXES [tina/__generated__/, .tina/__generated__/]第 81 行baseFor方法据此选择根目录第 117-119 行private baseFor(filepath: string): string { return isGeneratedPath(filepath) ? this.rootPath : this.outputPath; }构造函数第 108-111 行默认outputPath等于rootPath因此单仓库场景行为不变只有在outputPath与rootPath不同的多仓库场景下生成路径才会被路由到生成器。安全设计两层路径校验文件头的注释明确声明了安全契约“所有公开方法在 I/O 前都会用assertWithinBase校验filepath/pattern参数”第 100-102 行。除了通用的基准目录校验防止../逃逸如第 114-116 行的例子还新增了assertGeneratedSubtree二层防护第 127-142 行即使路径通过rootPath基准校验也必须解析到tina/__generated__/或.tina/__generated__/子目录内部。例如tina/__generated__/../../.env会解析到rootPath/.env虽在 rootPath 内但不在生成子目录内因此被拒绝第 138-140 行抛Path traversal detected。这与仓库中的路径穿越安全测试graphql包的path-traversal-security测试用例方向一致体现了“路由变更必须伴随校验加固”的工程原则。迁移注意事项原文完整保留2.1.0 的 CHANGELOG 给出了多仓库项目升级后的四条明确迁移指引内容仓库中陈旧的tina/文件夹升级前构建会把tina/__generated__/*和tina/tina-lock.json提交进内容仓库。升级后这些文件不再被读取或更新建议在单独的清理提交中删除ConfigManager.generatedFolderPathContentRepo已移除任何自定义 CLI 代码、插件或脚本若引用了该字段会在类型检查或运行时失败应改用generatedFolderPath它一直是生成器相对路径ConfigManager.getTinaFolderPath不再接受isContentRoot选项内容根目录如今不再需要tina/文件夹若自定义代码调用了getTinaFolderPath(path, { isContentRoot: true })请去掉第二个参数FilesystemBridge对tina/__generated__/路径的行为变化多仓库环境下这类路径的读写解析到生成器rootPath而非内容仓库outputPath依赖旧行为的自定义 Bridge 子类或代码需要更新。配套变更生成客户端导入与回滚门禁TypeScript 项目生成的client.ts/database-client.ts现在以无扩展名方式导入./types原为./types.ts避免消费方 tsconfig 需要allowImportingTsExtensions: true该配置在 Next.js 15.5 默认配置下会导致构建失败JS 项目仍导入./types.jsNode ESM 需要显式扩展名Rollout gate回滚门禁CHANGELOG 明确警告——此版本不得提升到latestdist-tag直到 TinaCloud prod 部署了对应服务端修复tinacms/tinacloud#3403。因为在服务端修复前TinaCloud 会在生成器推送时从内容仓库读取tina-lock.json提前发布会破坏所有现有 multi-repo 用户的索引。这是“客户端变更必须与服务端修复协同发布”的典型范例。六、2.1.1 到 2.1.3发布管线与仓库元数据收尾2.1.1加固 npm 发布流水线与包清单Harden npm publish pipeline and package manifests2.1.2移除fs-extrapeer 依赖。原声明为fs-extra^9.0.1而仓库实际运行^11.3.0区间永不被满足导致每次安装都打印 unmet-peer 警告。唯一的调用点readFileSync读取package.json而 fs-extra 只是从node:fs原样再导出因此改用内置模块类型则由types/node覆盖getVersion.ts 的import { readFileSync } from node:fs正是这一变更的落地2.1.3修正repository.directory——8 个包此前都复制了来源包fork 来源的目录声明导致 npm 页面上的 “repository” 链接解析到无关源码本次改为指向各自目录。同时删除了tinacms/metrics、tinacms/cli、tinacms/schema-tools中一个从未存在过的死脚本generate:schema其引用的scripts/generateSchema.js从未存在于仓库中也无人调用。2.1.3 的修复直接反映在 package.jsonrepository.directory已是packages/tinacms/metrics。这是“发布产物元数据必须与 monorepo 实际布局一致”的细节治理。七、结语一条可复用的工程演进路线回看tinacms/metrics的版本史可以提炼出一条清晰的工程演进路线能力先行0.0.x-1.0.x先建立遥测能力并把“可关闭”作为一等公民NO_TELEMETRYdisabled依赖瘦身1.0.x-2.0.x移除冗余依赖node-fetch→ 全局fetchisomorphic-fetch→ 内置统一工具链pnpm、TypeScript 5.x为架构迁移铺路架构迁移2.0.0整体切换 ESM附带消费方兼容处理导入扩展名策略行为修复与协同2.1.x修复 peer 依赖区间、仓库元数据、死脚本并完成多仓库路径路由这一行为变更——且用Rollout gate确保与服务端修复协同发布。对于使用 TinaCMS CLI 的开发者值得记住的三件事遥测可通过NO_TELEMETRY或 CLI 的 no-telemetry 标志关闭2.1.x 涉及FilesystemBridge与ConfigManager的行为变更自托管多仓库项目升级时需对照迁移指引该包为 ESM-onlyNode 18 是运行前提。想深入了解底层实现可继续阅读 telemetry.ts上报逻辑、interfaces/index.ts载荷类型与 filesystem.ts路径路由与安全校验。【免费下载链接】tinacmsTinaCMS is the leading open-source headless CMS that supports Markdown and Visual Editing. Your content is stored in your own GitHub repo ❤️项目地址: https://gitcode.com/GitHub_Trending/ti/tinacms创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表