基于 byted-bp-cdn-pagesdeploy / react-best-practices / test-driven-development 三技能交叉审查 | 生成时间: 2026-07-01
| 技术栈 | 用途 | 状态 |
|---|---|---|
| 抖音小程序原生 TTML + TTSS + JS | 前端报价单填写、结果展示 | 运行中 |
| 微信云开发 SDK wx-server-sdk | 云函数运行环境(登录、Excel导出、数据库) | 混合使用 |
| Node.js 18 + Express | 自建后端服务器(Excel导出、Banner管理) | 运行中 |
| Docker + PM2 | 后端容器化部署与进程管理 | 已部署 |
| 测试框架 无 | 单元测试 / 集成测试 / E2E 测试 | 未配置 |
当前项目采用混合部署模式,结合三个技能中的部署最佳实践,存在以下优化点:
banners/ 目录下的 Banner 图片、images/ 目录下的 TabBar 图标等静态资源目前直接托管在小程序包内或服务器上,没有 CDN 分发。用户访问时延迟较高,尤其影响首屏体验。
129.211.6.227:3000 是单点部署,没有负载均衡或故障转移机制。一旦服务器宕机,Excel 导出和 Banner 加载功能将全部失效。
| 资源路径 | 类型 | CDN 适配度 | 建议操作 |
|---|---|---|---|
__wxToTT/report/ |
静态 HTML 报告页 | 极高 | 部署到 BytePlus Edge Pages |
banners/*.png |
Banner 图片 | 极高 | 上传至对象存储 + CDN 加速 |
images/tabbar/*.png |
TabBar 图标 | 极高 | 作为小程序包内资源,无需 CDN |
cloudrun/led-export-api/ |
Node.js API 服务 | 中等 | 部署到云托管/容器服务,配置健康检查 |
server/ 目录容器化后部署到 BytePlus CloudRun 或类似容器托管平台,自动扩缩容虽然本项目是原生小程序而非 React,但性能优化原则通用。以下基于 Vercel React 最佳实践规则的映射分析:
| 规则 | 当前状态 | 严重程度 | 修复建议 |
|---|---|---|---|
async-parallel - 并行独立请求 |
已应用 | - | _loadDataAsync 中已使用 Promise.all 并行读取 storage |
async-defer-await - 延迟非关键 await |
部分应用 | 中 | Banner 加载已延迟 300ms,但云函数调用未做 defer |
utils/calculator.js 包含大量硬编码数据(处理器配置、模组价格等),且没有分包加载机制。小程序主包超过 2MB 将无法上传。建议:
data/modules.js 按场景拆分为 data/indoor.js 和 data/outdoor.jscalculator.js 中 getProcessorConfig() 虽然做了模块级缓存(PROCESSOR_CONFIG),但云函数和后端 API 完全没有 Redis/Memcached 缓存。每次导出 Excel 都重新计算所有数据。pages/index/index.js 中,_updateParamAndSave 方法每次输入都会触发:setData -> recalc() -> setData(result) -> _saveSceneParams() -> savePriceMemory()| 问题 | 位置 | 优化方案 |
|---|---|---|
| 循环内重复创建正则表达式 | generateSuggestionNames |
将 /[()()]/g 等正则提取到模块顶部 |
| 大数组遍历(100项) | generateSuggestionNames |
使用虚拟列表,只渲染可视区域 |
| storage 同步阻塞 | savePriceMemory |
改用异步 tt.setStorage,或批量写入 |
| 对象属性重复访问 | _calculateAmounts |
缓存 this.data.editableItems 到局部变量 |
依据 TDD 技能的铁律:没有先失败的测试,就不写生产代码。当前项目完全违背这一原则。
utils/calculator.js - 无任何单元测试pages/index/index.js - 无任何测试cloudfunctions/exportExcel - 无任何测试server/ - 无任何接口测试| 模块 | 风险描述 | 建议测试类型 |
|---|---|---|
calculator.recalc() |
核心报价计算,涉及数十个变量的数学运算,一旦出错直接导致报价错误 | 单元测试(Jest/MiniTest) |
exportExcel 云函数 |
生成 Excel 文件,字段缺失或格式错误会导致客户收到损坏文件 | 集成测试 + 快照测试 |
priceMemory 存储 |
价格记忆功能,存储格式变更会导致历史数据无法读取 | 兼容性测试 |
config.js 切换逻辑 |
云函数/自建服务器/本地导出三选一,切换逻辑错误会导致功能不可用 | 集成测试 |
由于项目已经存在大量代码,无法完全从头 TDD。建议采用增量补测策略:
| 测试类型 | 推荐工具 | 适用场景 |
|---|---|---|
| 小程序单元测试 | miniprogram-simulate + Jest |
组件渲染、页面逻辑、Storage 模拟 |
| 云函数测试 | Jest + wx-server-sdk mock |
云函数入参出参、异常处理 |
| 后端 API 测试 | supertest + Jest |
Express 路由、中间件、Excel 生成 |
| E2E 测试 | 抖音小程序开发者工具自动化 | 完整报价流程、导出功能 |
Mima106360@,且已提交到 Git 仓库。这是一个严重的安全隐患。
cloudfunctions/login/index.js 使用的是 wx-server-sdk(微信小程序),但项目配置为抖音小程序(tt API)。wxContext.OPENID 在抖音环境中可能获取不到正确的用户标识。
pages/index/index.js 中的屏幕尺寸输入直接转为 Number,但没有校验负数、超大值、非数字字符等边界情况。
| 优先级 | 事项 | 预计工时 | 技能来源 |
|---|---|---|---|
| P0 | 将 deploy-steps.txt 中的密码移至环境变量,从历史提交中删除 | 0.5h | 安全基线 |
| P0 | 为 calculator.js 核心计算编写单元测试(至少覆盖 5 个主要场景) |
4h | TDD |
| P1 | 将 Banner 图片迁移至 CDN,替换 config.js 中的 URL | 2h | CDN Deploy |
| P1 | 为输入框添加防抖(debounce),减少 setData 频率 | 1h | React Best Practices |
| P1 | 拆分小程序主包,使用 subpackages 将 history/price-config 页面分包 | 3h | Bundle Opt |
| P2 | 为后端 API 增加 Redis 缓存层(Banner、价格配置) | 4h | Server Perf |
| P2 | 统一云函数 SDK(评估是否需要从 wx-server-sdk 迁移到抖音云开发 SDK) | 3h | 兼容性 |
| P3 | 将 __wxToTT/report 静态页面部署到 BytePlus Edge Pages |
1h | CDN Deploy |
LED 报价单小程序是一个功能完整、业务逻辑清晰的工具类应用。代码中已经做了一些性能优化(Promise.all 并行加载、延迟初始化、缓存命中),但仍有较大提升空间:
建议优先处理 P0 级别的安全问题和测试覆盖,再逐步推进性能和部署优化。