# 开发指南 ## 环境要求 - Node.js 18+ - JDK 21 + Android SDK 35 + NDK 27.1.12297006(仅 Android 构建需要) - 详见 [android-build-guide.md](android-build-guide.md) ## 常用命令 ```bash npm install --legacy-peer-deps # 安装依赖(必须带 --legacy-peer-deps) npm run start # 启动 Metro 开发服务器 npm run android # expo run:android(设备/模拟器) npm test # Vitest 全量测试 npm run typecheck # tsc --noEmit 类型检查 # 单文件测试 npx vitest run tests/ledger.test.ts # 按名称运行测试 npx vitest run -t "拒绝不平衡交易" # 重新生成原生项目 npx expo prebuild --platform android ``` ## 编码规范 ### TypeScript - **strict 模式**已开启,路径别名 `@/*` → `src/*` - 非平凡改动后必须运行 `npm run typecheck` ### 金额计算 - 使用字符串十进制运算(`src/domain/decimal.ts`),**禁止**用 JS 浮点数处理金额 - 关键 API:`addDecimals`、`subtractDecimals`、`multiplyDecimal`、`divideDecimals`、`negateDecimal` ### 领域层纯净性 - `src/domain/` 禁止导入 React / React Native / Expo 任何模块 - 外部依赖通过接口注入:`MobileBeanBackend`、`OcrEngine`、`AiVisionProvider` - 新模块必须在 `src/domain/index.ts` 重导出 ### 原生代码 - 原生 Kotlin/XML 只能放在 `plugins//` 下,不可直接编辑 `android/` - 每个 Config Plugin 函数**必须 `return config`** - `expo prebuild` 后检查 `onnxruntime-android:1.20.0` 版本 ### 注释与文档 - 代码注释和 `plan.md` 使用**中文** - ID/校验和使用 FNV-1a 哈希(`hash()` in `ledger.ts`),不用加密哈希 ## 测试 - 框架:**Vitest**(无配置文件,默认拾取 `tests/**/*.test.ts`) - 测试对象:主要覆盖 `src/domain/` 层,使用 mock 后端(`MemoryBackend`、`MockOcrEngine`) - 命名:`<模块或功能>.test.ts`,如 `decimal.test.ts`、`billPipeline.test.ts` - 新增 domain 逻辑时必须同步添加测试 ## 提交规范 - 提交消息格式:`feat: <中文摘要>`,多行 body 按模块分区列举变更 - 示例:`feat: 品牌重命名为浮记(DriftLedger),全面升级精度安全与架构` - PR 需描述变更内容与原因,UI 变更附截图,关联相关 issue