基金助手 fund-helper — 速记版
📋 速记表(面试前快速扫)
| 题 | 一句话结论 | 关键词 |
|---|---|---|
| Q1 | 双端同格式数据,JSONBox 云同步+版本号对比 | JSONBox 版本号 二维码 LocalStorage |
| Q2 | 双视图共用单例 FundDataManager,按交互分场景 | 单例 分场景 TreeView/WebviewView |
| Q3 | 普通基金走估值接口,QDII 用持仓×行情加权估算 | QDII 加权 过期检测 gztime |
| Q4 | 分层代理绕 CORS:host/Vite/Worker | CORS 分层代理 环境感知 |
| Q5 | 图表封统一 init/resize,联暗黑主题 | ECharts dark 联动 |
| Q6 | 统一走 OpenAI 兼容 API,切 baseURL/model | OpenAI兼容 向导 归一 |
| Q7 | Cloudflare+GitHub 双部署,PWA 分策略缓存 | PWA CacheFirst NetworkOnly |
| Q8 | 本地 LocalStorage+云端 JSONBox 分工,VSCode 字段保护 | 分层存储 字段保护 |
Q1: 双端架构 + 跨端同步
面试官可能问:VSCode 插件端和 Web 端怎么设计、怎么同步数据?
🗣️ 口述稿:
两端导出同一种基金数据格式(
{code,num,cost}加分组、排序配置),用 JSONBox 免费云存储同步,都带版本号加时间戳,谁版本新用谁的。Web 端生成二维码,VSCode 扫码把配置推上云端、另一端再拉下来。数据只有几 KB,自建后端不划算,所以用免费云存储。
💡 关键词提示:JSONBox云同步 版本号对比 二维码扫码 LocalStorage兜底
⚠️ 备注:
- 冲突检测是防御性设计,没做 CRDT/多方并发压测,别吹成企业级分布式
- 设计原则:云端只是同步介质,本地 LocalStorage 才是真相;JSONBox 挂了只是不能跨端同步,不影响本地用
- 追问"为什么不用账号登录",可说为省一套账号体系,扫码本质是带 token 跨端,代价是流程略繁琐
追问①:为什么扫码传配置不登录?
为省一套账号注册登录体系,扫码本质是把 token 从一端带到另一端;代价是每换一次端要扫一次,不够优雅但够用。
追问②:JSONBox 挂了或超限怎么办?
本地 LocalStorage 兜底,云端只是同步介质不是唯一来源,挂了最多不能跨端同步,本地照常用。
Q2: VSCode 插件开发
面试官可能问:TreeView 和 WebviewView 两种视图怎么协作?
🗣️ 口述稿:
两个视图共用同一个
FundDataManager单例,谁拉数据都更新到同一份 store,避免重复请求。TreeView 是原生树,放加仓减仓这类高频轻操作;WebviewView 是嵌入网页,放列排序、拖拽这类重交互。刷新统一调refreshFundData(),WebviewView 走 postMessage 增量推。
💡 关键词提示:FundDataManager单例 分场景 postMessage增量 36命令when条件
⚠️ 备注:
- 早期两视图各拉各的,数据版本不一致,才收敛到单实例——可讲这个演进
- 命令一多,"注册容易、想清楚每个命令在哪出现难",前期菜单又乱,后期收敛
- 两视图强一致是相对的:store 一致但 Webview DOM 状态可能有几十毫秒差异,别吹强同步
追问①:两视图数据会强一致吗?
单例+同一 store 基本一致,但 WebviewView 有自己的 DOM 状态,极端情况会有几十毫秒差异,属于我没太上心的瑕疵。
追问②:为什么不用一个 Webview 搞定所有?
TreeView 原生稳定包小不用自建页面;全 Webview 要自己起 HTML 再通信。按操作频率和交互复杂度分场景选用更划算。
Q3: 基金计算引擎
面试官可能问:QDII 这类基金估值你怎么算?普通基金呢?
🗣️ 口述稿:
普通基金直接拿第三方估值接口,QDII 投海外、人家不覆盖,所以我用季报的股票持仓权重,拉这些股票当日实时涨跌幅,加权平均算个估算涨幅。它不是官方值,总比看不到强。数据可靠性靠过期检测——接口返回的
gztime不是今天就清掉估值,避免拿昨天数据当今天用。
💡 关键词提示:QDII加权估算 持仓×行情 gztime过期检测
⚠️ 备注:
- [需自行确认]:"加权平均成本/收益法"没有零误差实测依据,别吹"验证过准",只讲"我做过期兜底+口径统一"
- QDII 估算误差来源=季报持仓滞后+只算股票不算债券现金,行情剧烈波动明显偏高——被问量化误差没数据,别硬给数字
追问①:成本价怎么算?反复加减仓?
加权平均:
(旧成本×旧份额+新买入成本)÷(旧份额+新份额),加减仓自动重算,分母变大被摊平是正确行为。
追问②:QDII 估算误差多大?
误差来自季报持仓滞后和只算了股票,行情剧烈时会明显偏。这是近似算法,量级误差我做过统计,没有数据。
Q4: 跨域代理方案
面试官可能问:浏览器端调基金接口被 CORS 挡了怎么办?
🗣️ 口述稿:
基金接口有来源检测,浏览器 fetch 会被 CORS 拦死。我用分层代理+环境感知:VSCode 插件端在 Node 环境直接 fetch 没跨域;Web 本地开发走 Vite proxy;Web 生产走 Cloudflare Worker 转发。封装一个
proxyFetch,上层不用关心当前在哪层。
💡 关键词提示:CORS 分层代理 Vite proxy Cloudflare Worker
⚠️ 备注:
- [重要][需自行确认]:简历写"四层代理",但 Netlify Serverless 那层其实只有注释掉的骨架,实际是 Worker/Vite/host 三层。别说满四层,要么承认第四层是雏形要么补全
- 伪造 Referer/Origin 是灰色手段,立场是"低频自用",接口加严风控就会失效——被问不要有保障性承诺
追问①:伪造请求头不会被接口识破吗?
会,这是灰色手段,我只能低频自用别海量抓。接口一旦加签名或设备指纹就失效,我本身没有保障性对策。
追问②:Worker 域名被封了怎么办?
降级到其他代理层,核心是别依赖单一代理点——当初做分层就是为了任何一层挂了还有别的兜底。
Q5: ECharts 可视化
面试官可能问:图表这块做了什么?
🗣️ 口述稿:
做了行情、详情、对比三类图:资金流向折线、板块排行柱状、净值走势(可切 1月/3月/半年/1年/3年)、多基金叠图。封了统一 init/resize 工具函数,并跟 Pinia 的暗黑模式联动自动切主题。
💡 关键词提示:三类图 统一init/resize dark主题联动
⚠️ 备注:
- 这题别报菜名,收敛讲一个点:主题切换不重建 chart,读 Pinia 的 isDark 后 setOption 更新变量,避免重复 init
- "图表数量"不是量化亮点,别用来凑
追问①:主题切换会不会重建图表?
不会,读 Pinia 的 isDark 后对现有 chart 做 setOption 更新样式变量,避免重复初始化。
Q6: AI 多模型集成
面试官可能问:怎么接多个 AI 模型?
🗣️ 口述稿:
因为各家都兼容 OpenAI 的 API,所以统一用 OpenAI SDK,靠切
baseURL和model适配阿里云、硅基流动、DeepSeek 等。配了个 5 步 Webview 向导(厂商→Key→模型→参数→测试),Prompt 按 6 个维度组织控制在 1000 字内。
💡 关键词提示:OpenAI兼容 baseURL切换 5步向导 Prompt六维
⚠️ 备注:
- 难点在配置引导而不在接入:不同厂商 baseURL/model 名不一致,所以加"测试连接"步骤把常见填错映射成可读提示
- 兼容度不齐,后端返回格式和 OpenAI 有细微差别需归一——别把"一把梭"说成"零适配"
追问①:全是 OpenAI 兼容,会被坑吗?
会,各家兼容程度不一(流式、工具调用),实际遇到过后端返回格式和 OpenAI 有差别,我做了一层格式归一。
Q7: PWA + 部署
面试官可能问:PWA 和部署怎么做的?
🗣️ 口述稿:
部署 Cloudflare Pages(全球 CDN)+ GitHub Pages(Actions 自动构建)双站点;PWA 用 vite-plugin-pwa,Manifest standalone 可装桌面。缓存三策略:API 用 NetworkOnly 保实时,静态资源 CacheFirst,字体 StaleWhileRevalidate。
💡 关键词提示:双站部署 vite-plugin-pwa 缓存三分策略
⚠️ 备注:
- 选 vite-plugin-pwa 因为把 register worker 样板省了;基金估值这种几分钟变的必须 NetworkOnly,CacheFirst 会让用户看旧值
- [需自行确认]:GitHub Pages 那站功能相对阉割(没 Worker 代理),别把双站讲成完全对等
追问①:为什么不用 CacheFirst 缓存估值?
估值几分钟内会变,CacheFirst 会让用户看到旧值误导判断;只有静态资源和字体这种不change的才适合缓存。
Q8: 数据存储架构
面试官可能问:LocalStorage 和 JSONBox 怎么分工?
🗣️ 口述稿:
本地数据经 storageService 存 LocalStorage,
fund_helper_前缀隔离;JSONBox 只做云端备份和跨端同步。同步按版本号决定推还是拉,冲突让用户选。Web 端没有的 VSCode 专属字段(hideStatusBar 等)在同步时要保护不被覆盖。
💡 关键词提示:LocalStorage JSONBox备份 版本号 字段保护
⚠️ 备注:
- 为敢用 LocalStorage:总数据几百 KB 顶天,5MB 上限够用,省 IndexedDB 异步心智——这是有边界的判断题,MB 级或全文检索就要迁 IndexedDB
- "按来源保护字段"是防两端字段模型不等对互相覆盖
追问①:LocalStorage 够用吗?
基金配置几百 KB、100 只也就几 KB,够用;一旦到 MB 级或要全文搜索就迁 IndexedDB,这条边界我说得出所以是有意选的。
🎙️ 行为面试
为什么做这个项目?
我自己定投,写代码时想瞄一眼收益又不想掏手机,市场没有顺手的 VSCode 基金插件就自己写了,顺便验证双端+同步+代理链路。
💡 关键词:自用痛点 独立全链路
⚠️ 备注:动机要落在"解决自己的痒"而非"我有能力",面试官更信前者。
最大难点?
跨域最磨人:浏览器端调基金接口被 CORS 拦死,试过 JSONP(只部分接口支持)、第三方代理(不稳)、自建代理(要运维),最后才落地 Vite proxy(开发)+Cloudflare Worker(生产)的分层。是试错试出来的,不是一开始想好的。
💡 关键词:CORS 试错三轮 分层收口
⚠️ 备注:[需自行确认]"具体试几个、每个卡哪"按真实试错过程填,别照搬口吻。
遗憾/弯路?
- 测试覆盖几乎为零,计算引擎靠手测很心虚
- 双端共享代码是复制粘贴的两份,更新易漏,该抽 shared package
- 四层代理里 Netlify 那层是半成品没收尾,文档说四层、实际三层
💡 关键词:零测试 代码复制 Netlify半成品
⚠️ 备注:第三条第比第一二条能体现诚实度,强烈建议保留。
🃏 极简速记卡(面试前5分钟看)
- Q1 双端同步:JSONBox云同步+版本号对比,本地LocalStorage兜底
- Q2 双视图:单例FundDataManager,TreeView轻/Webview重
- Q3 QDII:持仓行情加权估算+gztime过期检测
- Q4 跨域:host/Vite/Worker分层代理
- Q5 图表:统一init并联动暗黑主题
- Q6 AI:OpenAI兼容切baseURL,5步向导
- Q7 部署:CF+GH双站,PWA三策略缓存
- Q8 存储:本地LocalStorage,云端JSONBox,字段保护
- 行为 动机:自用痛点;难点:CORS试错;遗憾:零测试+代码复制+Netlify半成品
下一篇:02-智能回潮率检测仪系统