AI 如何让单一代码库同时发布 Web、移动应用与 API
了解 AI 如何帮助团队维护一个代码库,同时交付 Web 应用、移动应用和 API:覆盖架构、自动化、测试与常见陷阱。

“一份代码库”真正意味着什么
“一份代码库”并不意味着每个界面看起来都一样或每个平台都使用完全相同的 UI 框架。它的含义是:产品行为有一个单一且可版本化的事实来源——因此 Web、移动和 API 都基于相同的核心规则构建,从相同的仓库边界发布,并针对相同的合同进行测试。
一份代码库 vs. 共享库 vs. 复制粘贴
一份代码库:在一处更改业务规则(定价、权限、验证、工作流),这些更改会流向所有输出。平台特定部分仍然存在,但它们围绕共享核心展开。
共享库:多个应用引用共同的包,但每个应用可能发生漂移——不同版本、不同假设、不一致的发布。
复制粘贴复用:起初最快,但随后代价高昂。修复和改进无法可靠传播,错误会被重复复制。
真正目标:同步发布 Web、移动与 API
大多数团队并不是出于意识形态去追求一份代码库。他们想要更少的“Web 说 X,移动说 Y”的事件、更少的发布前临时 API 更改,以及更可预测的发布流程。当一个功能发布时,所有客户端都获得相同规则,API 反映相同决策。
AI 擅长的事情——以及人类仍然负责的部分
AI 可通过生成样板代码、将模型接到端点、草拟测试以及将重复模式重构为共享模块来提供帮助。它还可以标记不一致之处(例如各客户端间的验证差异)并加速文档工作。
人类仍需定义产品意图、数据合同、安全规则、边缘情况以及审查流程。AI 能加速决策,但无法取代这些角色。
团队规模下的期望
小团队可能会先共享逻辑和 API 架构,让 UI 主要保持原生。较大的团队通常会更早加入严格边界、共享测试和发布自动化,以便在大量贡献者下保持对齐。
为什么团队希望将 Web、移动和 API 放在一起
大多数团队起初并不主动追求“一份代码库”。他们是在经历了维护三套本应表现一致的产品的痛苦之后走到这一步的。
分离代码库的隐性成本
当 Web、移动与后端位于不同仓库(通常由不同子团队维护)时,相同的工作会以略有不同的方式重复进行。一个 bug 修复会变成三次修复。一个小的策略变更——比如折扣如何应用、日期如何四舍五入或哪些字段是必需的——需要被多次重新实现和多轮测试。
随着时间推移,代码库会发生漂移。边缘情况会被“只在这个平台上处理一次”。与此同时,另一个平台仍在运行旧规则——因为没人意识到有这个情况、因为它从未被记录,或者因为在接近发布时重写风险太大。
功能一致性比你想象的更快地破裂
功能一致性很少因为人们不在乎而破裂。它是因为每个平台有自己的发布节奏和约束。Web 可以每日发布,移动要等待应用商店审核,API 的更改可能需要仔细版本化。
用户会立即注意到:
- Web 有新的引导流程,移动没有。
- 移动支持新的支付方式,Web 仍显示“敬请期待”。
- 帮助文档过时,因为“取决于你使用的是哪个应用”。
为什么 API 落后(或 UI 落后)
API 常常落后于 UI 的原因是团队构建了最快能交付某个界面的路径,然后再回头做“正确的端点”。有时情况相反:后端发布了新模型,但 UI 团队没有同步更新,所以 API 暴露了客户端不能正确使用的能力。
成本驱动因素(无需电子表格)
更多的仓库意味着更多的协调开销:更多的 PR、更多的 QA 周期、更多的发布说明、更多的值班上下文切换,以及更多出错不同步的机会。
一个简单的架构:共享核心 + 平台外壳
“一份代码库”的设置在将产品“做什么”和每个平台“如何交付”分离时最有效。最简单的心智模型是:一个包含业务规则的共享核心,加上为 Web、移动和 API 提供薄外壳。
记在脑海中的图示
┌───────────────────────────────┐
│ Domain/Core │
│ entities • rules • workflows │
│ validation • permissions │
└───────────────┬───────────────┘
│ contracts
│ (types/interfaces/schemas)
┌───────────────┼───────────────┐
│ │ │
┌────────▼────────┐ ┌────▼─────────┐ ┌───▼──────────┐
│ Web Shell │ │ Mobile Shell │ │ API Delivery │
│ routing, UI │ │ screens, nav │ │ HTTP, auth │
│ browser storage │ │ device perms │ │ versioning │
└──────────────────┘ └──────────────┘ └──────────────┘
核心放置诸如“如何计算总额”、“谁可以批准请求”以及“什么算作有效输入”之类的东西。外壳将这些翻译为平台特定的体验。
平台特定代码仍然存在(这是可以接受的)
移动仍需设备集成,比如摄像头访问、推送通知、深度链接、生物识别解锁和离线存储策略。Web 仍有浏览器特有的问题,如 cookie、URL 路由、响应式布局和无障碍模式。API 层仍负责 HTTP 细节:状态码、分页、速率限制和认证流程。
合同防止各层漂移
黏合剂是显式合同:共享类型、接口和模式(例如请求/响应模型和验证规则)。当外壳必须通过这些合同与核心通信时,团队在“哪个平台是对的”上的争论会减少,因为事实来源是共享的行为——每个平台只是呈现它。
这种结构让共享部分保持稳定,同时让每个平台在真正不同的地方快速迭代。
将共享业务逻辑作为事实来源
当人们说“一份代码库”时,最大的收益通常不是 UI,而是拥有一处关于业务如何运行的单一事实来源。这意味着你的模型、规则和验证位于一个共享位置,所有客户端(Web、移动和 API)都依赖它们。
“单一事实来源”长什么样
共享核心通常包含:
- 领域模型:什么是 Customer、Subscription、Cart 或 Invoice。
- 规则:定价、折扣、资格、取消、试用转换。
- 验证:必填字段、允许的状态转换、限制和边缘情况。
- 格式化与计算:货币四舍五入、税费计算、日期处理。
- 认证与权限规则:谁可以查看或更改什么(即便 UI 不同)。
当这些规则位于一个模块时,你就能避免经典的漂移问题:Web 显示一个总额,移动显示另一个,API 强制执行又是第三套规则。
AI 如何帮助你实现(无需重写)
当你已有重复代码时,AI 应用开发工具尤其有用。它们可以:
- 扫描 Web/移动/API 代码以识别重复逻辑(例如“finalPrice”、“canRefund”、“isKycRequired”)。
- 提议提取出的共享模块,并给出清晰的输入/输出与测试。
- 建议安全的重构:用对共享核心的调用替换本地副本。
关键是把 AI 的建议当作草稿:你仍需审查边界、添加测试,并根据真实场景确认行为。
边界:共享规则,而非共享屏幕
共享业务逻辑的杠杆最大;共享 UI 代码通常收益较低。每个平台有不同的导航模式、无障碍预期和性能约束。
将共享核心聚焦于决策与数据,让平台外壳处理呈现、设备特性与 UX。这样可以避免“一个尺码适合所有”的问题,同时在各端保持行为一致。
支持所有客户端的 API 设计
“API-first”方法意味着你在构建任何特定 UI 之前就设计并认可 API 合同。与其由 Web 强行设定规则然后移动去“追赶”,不如让每个客户端(Web、iOS/Android、内部工具)都使用相同且被刻意设计的接口。
这有助于多平台团队,因为关于数据形状、错误处理、分页和认证的决策只需做一次——随后每个平台可以独立移动而无需重新发明业务规则。
使用模式让每个人保持一致
通过 OpenAPI(REST)或 GraphQL schema,你的 API 可以变得精确且可测试:
- 为 Web 与移动生成有类型的客户端
- 自动验证请求/响应
- 创建一致的错误格式与示例
- 让文档始终与 API 的实际行为同步
当模式变化时,你可以在 CI 中检测破坏性更改,避免在任何应用发布前出现问题。
AI 如何在不“编造”情况下提供帮助
AI 在以你现有的模式、领域术语和示例为基础时最有用。它可以起草:
- 新端点及其请求/响应形状
- 常见查询模式(过滤、排序、分页)
- 错误码与边缘情况响应
- 可供参考的可读文档与使用示例
关键在于审查:把 AI 输出当作起点,然后用 linters 与合同测试来强制执行模式。
向后兼容清单
- 版本化: 决定 URL 版本化(/v1)或基于头部的版本化
- 先做非破坏性变更: 添加新字段;不要重命名/移除已有字段
- 弃用策略: 标记被弃用的字段/端点并设定时间表
- 默认行为: 保持旧默认,除非显式覆盖
- 迁移指南: 记录变更及如何更新客户端
- 监控: 在移除前跟踪弃用端点的使用情况
AI 如何帮助生成与维护可复用代码
AI 在“一份代码库”场景中最有用的方式是加速枯燥部分,然后退到一边。把它当作脚手架:它可以迅速生成第一版草稿,但你的团队仍然拥有结构、命名与边界。
像 Koder.ai 这样的平合平台为这种工作流而设:你可以在聊天里依据规范快速生成代码,产出 React Web、Go + PostgreSQL 后端和 Flutter 移动应用,然后导出并拥有源代码,使其仍像正常且可维护的仓库一样运作。
快速搭建而不被锁定
目标不是接受一个庞大且不透明的框架,而是生成符合你现有架构(共享核心 + 平台外壳)的小而可读模块,这样你可以像平常一样编辑、测试和重构。如果输出是存在你仓库里的纯代码(而不是隐藏运行时),就不存在锁定问题——你可以逐步替换组件。
AI 擅长生成的内容
对于共享代码和客户端外壳,AI 可可靠地起草:
- CRUD 流程:仓库/服务方法、验证和基础错误处理
- 表单与列表:字段映射、默认状态、加载/空/错误状态
- 基本导航:路由定义、选项卡栈、基于 ID 的详情页
- API 处理器/控制器:请求/响应接线、分页、过滤
它不会为你做艰难的产品决策,但能在重复的接线工作上节省数小时。
团队应提供的输入
当你给出具体约束时,AI 输出会大幅提升:
- 需求:用户角色、关键屏幕、成功/错误规则、边缘情况
- 数据模型:实体、关系、枚举、示例负载
- 业务规则:验证、权限、状态转换、计算
- 命名约定:文件结构、模块边界、“逻辑放在哪里”
一个好的提示类似于迷你规范,加上你的架构骨架。
合并前的护栏
把生成的代码当作初级开发者的代码:有用,但需要检查。
- 用格式化与 lint 强制代码风格
- 要求为共享逻辑和基础 API 合同编写单元测试
- 使用 PR 审查规则:禁止直接合并,并验证边界(UI 代码不得泄漏至共享核心)
以这种方式使用 AI,它能加速交付同时保持代码库可维护。
UI 策略:在不强制相同屏幕的情况下保持一致性
“一份代码库”的 UI 策略在你追求可识别的一致模式而非逐像素一致时效果最好。用户期望在设备间感觉熟悉,同时仍尊重每个平台的长处。
共享模式 vs. 原生期望
先定义可复用的 UI 模式:导航结构、空状态、加载骨架、错误处理、表单和内容层级。这些可作为组件和指南共享。
然后允许平台原生差异:
- 导航(选项卡 vs. 侧栏 vs. 底部栏)
- 移动手势与触摸反馈
- Web 的键盘与焦点行为
- 系统 UI 约定(模态、表单、后退行为)
目标是:即便布局不同,用户也能立刻识别该产品。
用设计 tokens 做主题化
设计 tokens 将品牌一致性转为代码:颜色、排版、间距、层级与动效成为命名值而非硬编码数字。
通过 tokens,你可以维持单一品牌并支持:
- 浅色/深色模式
- 可访问对比度变体
- 平台特定的排版默认值
AI 可在何处提供帮助(但不接管设计)
AI 可作为最后一公里的快速助手:
- 生成组件变体(紧凑 vs. 舒适密度)
- 运行可访问性检查(对比度、标签、焦点顺序)
- 为错误、确认与空状态建议更清晰的微文案
保持由人工批准的设计系统作为事实来源,利用 AI 加速实现与审查。
为移动独有约束而设计
移动不是“更小的 Web”。要明确为离线模式、断续连接与后台运行做计划。为拇指设计触控目标,简化密集表格,并将最重要的操作优先放置。在这样设计时,一致性会成为用户的好处而非约束。
仓库设置:Monorepo、共享包与边界
“Monorepo”仅表示你在一个仓库中维护多个相关项目(Web 应用、移动应用、API、共享库)。与其在不同仓库间寻找端到端更新,你可以在一次 PR 中同时更改共享逻辑和客户端。
何时使用 monorepo 有利
当同一 feature 涉及多个输出(例如更改定价规则影响 API 响应、移动结账与 Web UI)时,monorepo 最有用。它还便于保持版本对齐:Web 不会意外依赖共享包的“v3”,而移动仍在用“v2”。
当然,monorepo 需要自律。没有清晰边界的话,它可能变成每个团队都能修改所有东西的场所。
你通常想要的共享包
实用结构是“apps” 加上 “packages”:
- 核心逻辑包:业务规则、验证、领域模型、功能开关、共享错误类型。
- UI kit 包:设计 tokens、可复用组件、无障碍模式(不一定是完全相同的屏幕——是一致的构建块)。
- API 客户端包:从 API 模式生成的有类型客户端,使 Web 与移动以相同方式调用端点。
- 工具包:日志、分析封装、日期/数字格式化、本地化帮助函数。
AI 可通过生成一致的包模板(README、导出、测试)以及在包演进时更新导入与公共 API 来提供帮助。
依赖边界:阻止“每个东西都相互依赖”
设定规则让依赖指向内侧,而非横向。例如:
- 应用(web/mobile/api)可以依赖包。
- UI kit 可以依赖工具,但不能依赖应用代码。
- 核心逻辑不应 import UI,且最好不 import 基础设施相关代码。
用工具(lint 规则、工作区约束)与代码审查清单来强制执行。目标是:共享包保持真正可复用,应用特定代码保持局部化。
备选方案:多仓库 + 共享包
如果你的团队很大、发布节奏不同或有严格访问控制,多仓库也可行。你仍可将共享包(核心逻辑、UI kit、API 客户端)发布到内部 registry 并进行版本化。代价是更多协调:你需要额外精力管理发布、更新与跨仓库兼容性。
测试:同时保持三端稳定
当一份代码库同时产生 Web、移动与 API 时,测试不再是“可有可无”。一次回归可能在三处显现,且很难判断问题源自哪里。目标是建立一个测试栈,在问题发生源头就能发现并证明每个输出仍按预期工作。
真正重要的测试层次
从把共享代码作为最高杠杆的测试位置开始。
- 单元测试(共享核心): 验证业务规则、计算、验证、权限与格式化。这是会影响所有客户端的地方。
- 集成测试(API + 数据): 在真实或容器化的数据存储上通过 API 层运行请求,以确认认证、查询与错误处理。
- 端到端(E2E)测试(Web + 移动): 每个平台少量关键用户旅程(登录、结账、个人资料更新)。保持这些测试有限且稳定——它们最昂贵也最易维护困难。
使用 AI 更快地写出更好的测试
当你为 AI 提供上下文与约束时,它最有用。提供函数签名、预期行为和已知失败模式,然后让它生成:
- 单元测试脚手架与参数化用例
- 边缘情况列表(null、时区、四舍五入、空状态、重试)
- “可能出错的地方”清单,转换为断言
你仍需审查这些测试,但 AI 有助于避免遗漏那些无聊但危险的情况。
合同测试:保护每个客户端
当你的 API 更改时,Web 与移动可能会静默中断。加入合同测试(例如 OpenAPI 模式检查、消费者驱动合同),确保 API 不会在违反客户端依赖时发布。
一条简单的政策以防止痛苦
采用一条规则:未经测试不得合并生成代码。 如果 AI 创建了处理器、模型或共享函数,PR 必须至少包含单元覆盖(以及在 API 形状变化时包括合同更新)。
CI/CD 与发布:一起发布,安全回滚
从“一份代码库”发布并不是按一个按钮就能完美同时发布 Web、移动与 API。它意味着你要设计一个从同一提交生成三件工件的流水线,明确哪些必须一起移动(共享逻辑、API 合同),哪些可以独立移动(应用商店上架节奏)。
一条流水线,三件工件
实用做法是在每次合并到主分支时触发单一 CI 工作流。该工作流:
- 构建并测试共享包(核心)
- 构建 API 服务工件(容器/镜像 + 迁移)
- 构建 Web 应用工件(静态包或服务端构建)
- 构建移动工件(Android AAB、iOS archive)并签名
AI 在此可通过生成一致的构建脚本、更新版本文件以及在添加新模块时保持重复接线(如包边界和构建步骤)同步来提供帮助。如果使用像 Koder.ai 这样的平合,快照与回滚功能也能补充 CI 流程,帮助你在诊断问题时快速恢复应用状态。
环境管理(dev → staging → prod)
把环境视为配置,而非分支。让相同代码通过 dev、staging 到 production,部署时注入环境特定设置:
- API:基础 URL、密钥、数据库连接
- Web:公共配置(分析 ID、功能开关)
- 移动:环境端点与功能开关,理想情况下通过远程取回以避免每次更改都上架
常见模式是:每个 PR 的临时预览环境、镜像生产的共享 staging,以及采用分阶段发布的 production。如果你需要团队设置指南,请指向 /docs;如果你在比较 CI 选项或计费方案,/pricing 可作为参考。
协调发布:功能开关与分阶段上线
要“同时发布”而不被应用商店审核阻塞,使用功能开关来协调跨客户端的行为。例如,你可以部署一个支持新字段的 API,同时将其隐藏在功能开关后,直到 Web 与移动准备好。
对移动使用分阶段上线(例如 1% → 10% → 50% → 100%),并监控崩溃与关键流程。对 Web 与 API 使用金丝雀部署或小比例流量切换达到同样目的。
安全回滚
回滚应当是平淡无奇的:
- API:保持向后兼容端点;采用可扩展/收缩的数据库迁移
- Web:保留先前的构建工件以便即时重部署
- 移动:假定回滚缓慢;利用远程功能开关立即禁用风险功能
目标是:任何单次提交都应可追溯到确切的 Web 构建、移动构建与 API 版本,从而放心地前进或回滚。
陷阱、安全与质量护栏
从一份代码库发布 Web、移动与 API 是强大的——但失败模式是可预测的。目标不是“共享一切”,而是“共享正确的东西”并划定清晰边界。
共享代码库的常见陷阱
过度共享是头号错误。团队因为觉得快而把 UI 代码、存储适配器或平台特性放入共享核心。
需警惕的模式包括:
- 平台 hack 泄漏到核心:为 iOS 键盘行为的“临时修复”或某个浏览器专用 API 溜进共享逻辑,导致核心无法在所有地方运行。
- 意外耦合:核心模块开始 import UI 组件(或 HTTP 客户端),使其无法在 CLI 任务、后台 worker 或测试中复用。
- 共享代码带来不同期待:移动需要离线优先而 Web 假定始终联网——如果核心未明确建模这些差异,会变成一堆例外。
与 AI 相关的风险(以及如何控制)
AI 能快速生成大量可复用代码,但也可能固化糟糕决策。
- 过时模式:生成的代码可能使用已弃用库或不安全默认值。把 AI 输出当作草稿而非真理。
- 安全错误:AI 常常忘记边缘检查(授权检查、速率限制、安全的错误处理)。
- 命名与结构不一致:小的不一致会在 monorepo 中放大;使用 linters、格式化器与 API 约定来强制统一。
必须不可妥协的安全基础
- 密钥管理:绝不提交密钥;从环境/托管密钥库加载并定期轮换。
- API 边界的认证检查:每个端点必须验证身份与权限;不要依赖客户端规则。
- 输入验证:验证并清理所有输入(包括内部调用);返回安全错误且不泄露敏感信息。
防止回归的“完成定义”清单
- 共享核心无平台特定 imports。
- 新增/变更的 API 端点包含认证 + 输入验证。
- 测试覆盖核心逻辑 + API 合同(以及相关的 Web/移动基础流程)。
- lint/format 检查通过且命名符合约定。
- 代码、日志或示例配置中无密钥。
- 发布说明包含迁移步骤和回滚考量。
面向真实团队的实用采用计划
大多数团队无法为“一份代码库”暂停交付。最安全的做法是渐进式:先共享稳定的部分,在重要地方保持平台自治,利用 AI 降低重构成本。
无需冻结功能的逐步迁移路径
1) 审计重复并挑选第一个共享切片。 寻找本应在各端保持一致的代码:数据模型、验证规则、错误码与权限检查。这是低风险的起点。
2) 创建一个共享模块:models + validation。 把 schema(类型)、验证与序列化抽出到共享包。让平台特定适配器保持薄(例如将表单双向映射到共享验证器)。这会立即减少“同一个错误三次出现”的问题。
3) 为 API 面向添加合同测试套件。 在触及 UI 之前,用运行在 API 与共享验证器上的测试锁定行为。这为未来合并提供了安全网。
4) 先迁移业务逻辑,而非 UI。 把核心工作流(定价规则、入职步骤、同步规则)重构到共享函数/服务中。Web 与移动调用共享核心;API 在服务端使用相同逻辑。
5) 有选择地整合 UI。 仅当组件确实完全相同时才共享 UI 组件(按钮、格式化、设计 tokens)。在平台约定差异显著处允许不同屏幕。
AI 如何帮助你安全重构
用 AI 把变更拆成小且易审查的步骤:
- 让 AI 提出提取边界与“最小移动”步骤,从而把重构分成更小的 PR。
- 与重构同时生成测试优先:验证器的金色测试用例、业务规则的边缘情况、bug 修复的回归测试。
- 使用 AI 建议机械迁移(重命名、移动文件、更新导入),由团队验证意图。
如果在像 Koder.ai 这样的工具层里进行,这些步骤可以转成显式的核对清单,方便在生成或移动代码前进行审查,从而降低模糊边界的风险。
里程碑与衡量它有效的指标
设定可度量的检查点:
- 里程碑 1: 共享模型/验证被 Web + API(随后是移动)使用。
- 里程碑 2: 一个核心工作流在三端共享。
- 里程碑 3: 单一发布流程可协调地交付变更。
用实际指标跟踪进展:
- 跨平台重复 bug 数减少。
- 在 Web + 移动 + API 上交付同一功能所需时间缩短。
- 共享包的测试覆盖率提高,发布后回归减少。
常见问题
“一份代码库”在实践中是什么意思?
这意味着存在一个单一的、可版本化的行为事实来源(规则、流程、验证、权限),所有输出都依赖它。
UI 与平台集成仍可不同;共享的是决策和合同,使 Web、移动和 API 保持一致。
“一份代码库”与共享库有什么不同?
共享库是可复用的包,但每个应用可能通过依赖不同版本、做出不同假设或采用不同发布时间表而发生偏移。
真正的“一份代码库”方式是让核心行为的更改从同一来源和同一合同流向每个输出。
为什么 Web、移动和 API 之间的功能一致性会这么容易中断?
因为各平台有不同的发布节奏。Web 可以每天部署,移动可能要等待应用商店审核,API 则可能需要小心的版本控制。
共享核心加上合同把规则本身变成共享的制品,而不是三份独立的再实现,从而减少“Web 说 X、移动说 Y”的情况。
共享核心应包含什么,平台外壳应负责什么?
把业务逻辑放到共享核心:
- 定价/折扣/税费与四舍五入
- 权限与角色检查
- 验证与状态转换
- 流程(入职、审批、取消)
平台外壳负责 UI、导航、存储以及设备/浏览器特性。
合同如何防止各层之间的偏移?
使用明确且可测试的合同,例如共享类型/接口和 API 模式(OpenAPI 或 GraphQL)。
然后在 CI 中强制执行(模式验证、破坏性变更检查、合同测试),这样在违反客户端预期时无法发布更改。
对多平台团队来说,“API-first” 是什么样子?
在多平台团队中,API-first 是在构建任何特定 UI 之前就有意设计并达成 API 合同。
也就是说先就请求/响应形状、错误格式、分页、认证达成一致,然后生成有类型的客户端并让文档与模式保持一致。
AI 在哪里最有帮助——还有哪些仍需人来负责?
AI 在加速重复性工作的方面最强:
- 搭建 CRUD 处理器、表单和基本导航 scaffold
- 将重复逻辑抽取到共享模块(明确输入/输出)
- 从现有合同起草测试与文档
人类仍需负责意图、边缘情况以及在合并前执行的把关。
我们应当为“一份代码库”使用 monorepo 吗?
当单次变更触及共享逻辑与 Web/移动/API 多端时,monorepo 很有用,因为可以在一个 PR 中更新全部并保持版本一致。
如果不能使用 monorepo(权限控制、独立发布节奏),则可采用多仓并通过发布共享包来协作,但需要更多协调工作来管理发布与兼容性。
什么样的测试策略可以保持这三种输出的稳定?
优先在最接近共享事实来源处测试:
- 共享核心的单元测试,覆盖规则与计算
- API + 数据/认证/错误处理的集成测试
- 每个平台少量但稳定的 E2E 关键用户流程
再加上合同测试,防止 API 更改悄然破坏 Web 或移动客户端。
共享代码库的最大陷阱和应该有哪些质量/安全护栏?
常见陷阱包括过度共享(平台 hack 泄漏到核心)、意外耦合(核心 import UI/HTTP)、以及不一致的假设(离线优先与始终在线混用)。
有用的护栏:
- 强制依赖边界(应用依赖包,而非横向依赖)
- 在 API 边界要求认证 + 输入验证
- “生成代码不得合并前无测试”
- 在 /docs 中记录设置和约定